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(); }
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()); }
// キャラクターの処理 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 ) ; }