コード例 #1
0
ファイル: MotionPlayer.cpp プロジェクト: h2so5/MikuMikuOnline
void MotionPlayer::Play(int anim_index, bool connect_prev, int blend_time, int anim_src_model_handle, bool check_name, bool isloop, int nextanim_handle, bool isloopcheck)
{
 	if(nextanim_handle != -1)
	{
		prev_anim_index_ = nextanim_handle;
	}else{
		prev_anim_index_ = MV1GetAttachAnim(model_handle_,current_attach_index_);
	}

	// まだ前回の移行期間の最中なら、移行を中止する
    DetachPrevMotionIfExist();

    connect_prev_ = connect_prev;
    prev_blend_rate_ = blend_time;
    blend_time_ = blend_time;
	isloop_ = isloop;
	isloopcheck_ = isloopcheck;
	if(!isloopcheck_)isplayend_ = false;
	chain_data_.clear();

    prev_attach_index_ = current_attach_index_;
    if (blend_time_ <= 0)
    {
        DetachPrevMotionIfExist();
    }
	
    current_attach_index_ = MV1AttachAnim(model_handle_, anim_index,
            anim_src_model_handle, check_name ? TRUE : FALSE);
    MV1SetAttachAnimTime(model_handle_, current_attach_index_, 0);

    SetBlendRateToModel();
}
コード例 #2
0
ファイル: MotionPlayer.cpp プロジェクト: h2so5/MikuMikuOnline
void MotionPlayer::ChainPlay(const std::vector<ChainData> chain_data)
{
 	if(chain_data.size() == 0)
	{
		return;
	}else{
		prev_anim_index_ = MV1GetAttachAnim(model_handle_,current_attach_index_);
	}
	_ChainPlay(chain_data.begin());
}
コード例 #3
0
// キャラクターの処理
void Chara_Process( CHARA *ch, VECTOR MoveVec, int JumpFlag )
{
	int MoveFlag ;			// 移動したかどうかのフラグ( 1:移動した  0:移動していない )

	// ルートフレームのZ軸方向の移動パラメータを無効にする
	{
		MATRIX LocalMatrix ;

		// ユーザー行列を解除する
		MV1ResetFrameUserLocalMatrix( ch->ModelHandle, 2 ) ;

		// 現在のルートフレームの行列を取得する
		LocalMatrix = MV1GetFrameLocalMatrix( ch->ModelHandle, 2 ) ;

		// Z軸方向の平行移動成分を無効にする
		LocalMatrix.m[ 3 ][ 2 ] = 0.0f ;

		// ユーザー行列として平行移動成分を無効にした行列をルートフレームにセットする
		MV1SetFrameUserLocalMatrix( ch->ModelHandle, 2, LocalMatrix ) ;
	}

	// 移動したかどうかのフラグをセット、少しでも移動していたら「移動している」を表す1にする
	MoveFlag = 0 ;
	if( MoveVec.x < -0.001f || MoveVec.x > 0.001f ||
		MoveVec.y < -0.001f || MoveVec.y > 0.001f ||
		MoveVec.z < -0.001f || MoveVec.z > 0.001f )
	{
		MoveFlag = 1 ;
	}

	// キャラクターの状態が「ジャンプ」ではなく、且つジャンプフラグが立っていたらジャンプする
	if( ch->State != 2 && JumpFlag == 1 )
	{
		// 状態を「ジャンプ」にする
		ch->State = 2 ;

		// Y軸方向の速度をセット
		ch->JumpPower = CHARA_JUMP_POWER ;

		// ジャンプアニメーションの再生
		Chara_PlayAnim( ch, 2 ) ;
	}

	// 移動ボタンが押されたかどうかで処理を分岐
	if( MoveFlag )
	{
		// 移動ベクトルを正規化したものをキャラクターが向くべき方向として保存
		ch->TargetMoveDirection = VNorm( MoveVec ) ;

		// もし今まで「立ち止まり」状態だったら
		if( ch->State == 0 )
		{
			// 走りアニメーションを再生する
			Chara_PlayAnim( ch, 1 ) ;

			// 状態を「走り」にする
			ch->State = 1 ;
		}
	}
	else
	{
		// このフレームで移動していなくて、且つ状態が「走り」だったら
		if( ch->State == 1 )
		{
			// 立ち止りアニメーションを再生する
			Chara_PlayAnim( ch, 4 ) ;

			// 状態を「立ち止り」にする
			ch->State = 0 ;
		}
	}

	// 状態が「ジャンプ」の場合は
	if( ch->State == 2 )
	{
		// Y軸方向の速度を重力分減算する
		ch->JumpPower -= CHARA_GRAVITY ;

		// もし落下していて且つ再生されているアニメーションが上昇中用のものだった場合は
		if( ch->JumpPower < 0.0f && MV1GetAttachAnim( ch->ModelHandle, ch->PlayAnim1 ) == 2 )
		{
			// 落下中ようのアニメーションを再生する
			Chara_PlayAnim( ch, 3 ) ;
		}

		// 移動ベクトルのY成分をY軸方向の速度にする
		MoveVec.y = ch->JumpPower ;
	}

	// キャラクターの移動方向にモデルの方向を近づける
	Chara_AngleProcess( ch ) ;

	// 移動ベクトルを元にコリジョンを考慮しつつキャラクターを移動
	Chara_Move( ch, MoveVec ) ;

	// アニメーション処理
	Chara_AnimProcess( ch ) ;
}