//定时器0A周期中断服务函数 void Timer0AIntHandler(void) { static uint8_t i = 0; ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //清除定时器中断标志 Get_Attitude();//读取MPU6050得到姿态角 if (Pitch > 45 || Pitch < -45) //俯仰角限幅 { g_stop_fly = 1; //停止 } if (Roll > 45 || Roll < -45) //横滚角限幅 { g_stop_fly = 1; } X_MODE_Control(); //PID控制 if (g_start == 0) { //输出值最大值限幅 if (X_OUT1 > 5000) X_OUT1 = 5000; else if (X_OUT1 < 2620) X_OUT1 = 2620; if (X_OUT2 > 5000) X_OUT2 = 5000; else if (X_OUT2 < 2620) X_OUT2 = 2620; if (X_OUT3 > 5000) X_OUT3 = 5000; else if (X_OUT3 < 2620) X_OUT3 = 2620; if (X_OUT4 > 5000) X_OUT4 = 5000; else if (X_OUT4 < 2620) X_OUT4 = 2620; } PWM_WidthSet(X_OUT1, X_OUT2, X_OUT3, X_OUT4);//PWM输出,电机控制 ui32Counter++; //更新周期中断计数 if (ui32Counter == NUMBER_OF_INTS) //1s闪灯标志 { g_1s_flag = 1; if (i == 0) { i = 1; ui32Counter = 0; LED_off; } else { i = 0; ui32Counter = 0; LED_on; } } }
/*普通のゲーム内での処理を行う関数、銃器の出し入れ、敵へのあたり、銃を手に置くなど…etc*/ int PlayerChara::NormallyPCSystem( Stage *Stg, Batch_Render *BatPre, Enemy *Ene, Camera *Cam, int ScreenPos[2]){ /*変数の初期化*/ int ech = 0; int MotionID = 0;//モーションIDを入れます int Garbage = 0;//ゴミデータを入れます int MotionFrameNo = 0;//モーションのフレーム番号を入れます int keyin[20];//キー情報配列を作成 /*キーを取得する*/ System::GetKeyData(keyin); /*キャラクターを動かす*/ MoveChara(); /*キャラクターを地面に置く*/ MovePosOnGround( Stg); /*視点関連の処理、切り替えや関数呼び出し等*/ ShoulderGunSys( BatPre, ScreenPos);//肩撃ち視点 /* ////////////////////////////////////////////////////// */ //カメラの位置を設定します、位置は自分の肩の後ろに設置します /* ////////////////////////////////////////////////////// */ //条件を基にカメラをセットします Cam->CamShoulderGunBack( Get_BodyModel(), Get_Quaternion(3), Get_Bone_ID(2), Get_PC_Deg_XZ(), Stg); //体の向きや、射撃を行う関数を呼び出し GunConflictTarget( ScreenPos, Stg, Ene); // 武器を変更する際の処理 ChangeWeapon( BatPre); /*姿勢変換「立つ⇔しゃがむ」の処理*/ if( (keyin[8] == 1) && (Get_AirOnPC() == 0)){//キーが押され、空中でない Set_Attitude( Get_Attitude() + 1);//姿勢変数を一つ増やす if( Get_Attitude() == 2){//変数が行き過ぎなら Set_Attitude( 0 );//「立つ」に固定 } } /*格闘攻撃をする処理を行います*/ if( ( keyin[11] == 1) && ( Get_Attitude() == 0) && ( Get_MyState() == 0)){//キーが押され、しゃがみ状態でなく、他の動作を行ってない Set_MyState( 1 );//キックをする } if( Get_MyState() == 1){//キック中なら ech = E3DGetMotionFrameNoML( Get_BodyModel(), Get_Bone_ID(6), &MotionID, &MotionFrameNo); _ASSERT( ech != 1 );//エラーダイアログを表示 if( MotionFrameNo == 19){//モーションが終了したら Set_MyState( 0 );//動作状態を通常に戻す } } /*ダッシュ関係の処理を行います*/ if( ( System::keyinQuick[1] == 1) && ( Get_Attitude() == 0) && ( Get_MyState() == 0) && ( Get_AirOnPC() == 0)){//キーが連続で押され、しゃがみ状態でなく、他の動作を行ってなくて、地上なら Set_MyState( 2 );//ダッシュをする } if(( System::keyinQuick[1] == 1) && (( Get_Attitude() != 0) || (( Get_MyState() != 0) && ( Get_MyState() != 2) ))){//それ以外の条件では、ダッシュキャンセルする System::KeyQuickPush[1][2] = 0;//ダッシュキーが押されてない状態にする System::keyinQuick[1] = 0;//ゲームダッシュフラグをオフにする } if( ( Get_MyState() == 2) && ( System::keyinQuick[1] == 0) && ( Get_AirOnPC() == 0) ){//ダッシュ操作中で、キーが解除されたら Set_MyState( 0 );//ダッシュを解除する } if( Get_MyState() == 2){//ダッシュ中なら Set_Stamina( Get_Stamina() - 1);//スタミナを減らす if( (Get_Stamina() < 1) && (Get_AirOnPC() == 0) ){//体力がなくなった&空中でないなら Set_MyState(0);//ダッシュを止める System::KeyQuickPush[1][2] = 0;//ダッシュキーが押されてない状態にする System::keyinQuick[1] = 0;//ゲームダッシュフラグをオフにする } } /*横っ飛び関係の処理を行います*/ if( ( ( System::keyinQuick[0] == 1) || ( System::keyinQuick[2] == 1)) && ( Get_Attitude() == 0) //左右キーが連続で押され、しゃがみ状態でなく、 && ( Get_MyState() == 0) && ( Get_AirOnPC() == 0) && ( 0 < Get_Stamina())){//他の動作を行ってなくて、地上で、スタミナがなくなってないなら if( System::keyinQuick[0] == 1) Set_MyState( 3 );//左横っ飛び状態にする; if( System::keyinQuick[2] == 1) Set_MyState( 4 );//右横っ飛び状態にする; if(( System::keyinQuick[0] == 1) && ( System::keyinQuick[2] == 1)) Set_MyState( 0 );//通常状態にする } //横っ飛び状態なら if( (Get_MyState() == 3) || ( Get_MyState() == 4)){ //移動先のモーション状態はどうか確かめる ech = E3DGetMotionFrameNoML( Get_BodyModel(), Get_Bone_ID(6), &Garbage, &MotionFrameNo); _ASSERT( ech != 1 );//エラーダイアログを表示 Set_Stamina( Get_Stamina() - 1);//スタミナを減らす if( MotionFrameNo == 20){//モーションが終了してたら Set_MyState( 0 );//通常状態に戻す System::KeyQuickPush[0][2] = 0;//ダッシュキーが押されてない状態にする System::KeyQuickPush[2][2] = 0;//ダッシュキーが押されてない状態にする System::keyinQuick[0] = 0;//横っ飛びフラグをオフにする System::keyinQuick[2] = 0;//横っ飛びフラグをオフにする } } /*スタミナの制御をする*/ if( Get_Stamina() <= 0){//スタミナがマイナスなら Set_Stamina( 0 );//スタミナを固定する } /*武器をもち手のあるべき場所へ移動させる*/ if( Get_Wp_equipment() != -1){ GunPutOnHand(); } return 0; }
/*キャラを動かします、前後左右に動けます*/ int PlayerChara::MoveChara(){ /*変数の初期化*/ int ech = 0;//エラー確認変数 int KeyMov = 0;//キーを押してどの方向に動くかの変数 int MovOn = 0;//動いていいかのフラグ int keyin[20];//キー情報配列を作成 float WantDeg = 0;//向きたい方向の変数 float FixedMoveSpeed = 0.0f;//それぞれの状態の固定速度 D3DXVECTOR3 SubPos( 0.0, 0.0, 0.0);//キャラクターを置く場所の座標 D3DXVECTOR3 PCPos( 0.0, 0.0, 0.0);//プレイヤーキャラクターの位置の座標 /*ダッシュ操作がオンになっていないかチェック*/ /*キーによる分岐*/ System::GetKeyData(keyin);//キー情報を格納 if( keyin[0] == 1){//左 KeyMov = KeyMov +1; } if( keyin[1] == 1){//上 KeyMov = KeyMov +2; } if( keyin[2] == 1){//右 KeyMov = KeyMov +4; } if( keyin[3] == 1){//下 KeyMov = KeyMov +8; } /*キーから取得した情報を変換*/ if(KeyMov == 1){//左 WantDeg = -90.0f + Get_PC_Deg_XZ(); MovOn = 1; /*モーションを「左歩き」にする*/ Set_UnderMotion(3); } if(KeyMov == 3){//左上 WantDeg = -45.0f + Get_PC_Deg_XZ(); MovOn = 1; /*モーションを「左前進」にする*/ Set_UnderMotion(4); } if(KeyMov == 2){//上 WantDeg = Get_PC_Deg_XZ(); MovOn = 1; /*モーションを「歩行」にする*/ Set_UnderMotion(1);//通常 } if(KeyMov == 6){//右上 WantDeg = 45.0f + Get_PC_Deg_XZ(); MovOn = 1; /*モーションを「左前進」にする*/ Set_UnderMotion(5); } if(KeyMov == 4){//右 WantDeg = 90.0f + Get_PC_Deg_XZ(); MovOn = 1; /*モーションを「右歩き」にする*/ Set_UnderMotion(2); } if(KeyMov == 12){//右下 WantDeg = 135.0f + Get_PC_Deg_XZ(); MovOn = 1; /*モーションを「右後進」にする*/ Set_UnderMotion(7); } if(KeyMov == 8){//下 WantDeg = 180.0f + Get_PC_Deg_XZ(); MovOn = 1; /*モーションを「後進」にする*/ Set_UnderMotion(8); } if(KeyMov == 9){//左下 WantDeg = -135.0f + Get_PC_Deg_XZ(); MovOn = 1; /*モーションを「左後進」にする*/ Set_UnderMotion(6); } //キーが入力されていても、キック中なら if( Get_MyState() == 1) { MovOn = 0;//絶対動かない } //空中で、ダッシュ状態なら if( ( Get_AirOnPC() == 1) && ( Get_MyState() == 2)){ WantDeg = Get_PC_Deg_XZ();//まっすぐ進む MovOn = 1;//絶対動く } //左飛び状態なら if( Get_MyState() == 3) { WantDeg = -90.0f + Get_PC_Deg_XZ(); MovOn = 1;//絶対動く } //右飛び状態なら if( Get_MyState() == 4) { WantDeg = 90.0f + Get_PC_Deg_XZ(); MovOn = 1;//絶対動く } /*動く方向を決めるよ*/ if(MovOn == 1){ if( Get_MyState() == 0){//通常状態なら if( Get_AirOnPC() == 0){//空中でなければ if(Get_Attitude() == 0){//姿勢が「立っている状態」なら /*スピードを増加させる*/ Set_MoveSpeed( Get_MoveSpeed() + 0.8f); //スピードに制限をかける if( 25.0f <= Get_MoveSpeed() ){ Set_MoveSpeed( 25.0f); } //固定スピードの設定(立ち) FixedMoveSpeed = 50.0f; } if(Get_Attitude() == 1){//姿勢が「しゃがみ状態」なら /*スピードを増加させる*/ Set_MoveSpeed( Get_MoveSpeed() + 0.4f); //スピードに制限をかける if( 20.0f <= Get_MoveSpeed() ){ Set_MoveSpeed( 20.0f); } //固定スピードの設定(しゃがみ) FixedMoveSpeed = 30.0f; } } if( Get_AirOnPC() == 1){//空中にいるなら /*スピードを増加させる*/ Set_MoveSpeed(Get_MoveSpeed() + 0.3f); //スピードに制限をかける if( 10.0f <= Get_MoveSpeed() ){ Set_MoveSpeed( 10.0f); } //固定スピードの設定(しゃがみ) FixedMoveSpeed = 20.0f; } } if( Get_MyState() == 2){//ダッシュ状態なら if( Get_AirOnPC() == 0){//地上にいるなら /*スピードを増加させる*/ Set_MoveSpeed( Get_MoveSpeed() + 2.0f); //スピードに制限をかける if( 40.0f <= Get_MoveSpeed() ){ Set_MoveSpeed(40.0f); } //固定スピードの設定(しゃがみ) FixedMoveSpeed = 70.0f; } if( Get_AirOnPC() == 1){//空中にいるなら /*スピードを増加させる*/ Set_MoveSpeed( Get_MoveSpeed() + 2.0f); //スピードに制限をかける if( 40.0f <= Get_MoveSpeed() ){ Set_MoveSpeed(40.0f); } //固定スピードの設定(しゃがみ) FixedMoveSpeed = 70.0f; } } if( ( Get_MyState() == 3) || ( Get_MyState() == 4)){//左飛び状態なら /*スピードを固定*/ Set_MoveSpeed(0.0f); //固定スピードの設定(しゃがみ) FixedMoveSpeed = 90.0f; } /*ダミーモデルの座標に設定*/ ech = E3DRotateInit ( Get_DummyModel()); _ASSERT( ech != 1 );//エラーチェック ech = E3DGetPos( Get_BodyModel(), &PCPos); _ASSERT( ech != 1 );//エラーチェック ech = E3DSetPos( Get_DummyModel(), PCPos); _ASSERT( ech != 1 );//エラーチェック ech = E3DRotateY( Get_DummyModel(), WantDeg); _ASSERT( ech != 1 );//エラーチェック ech = E3DPosForward( Get_DummyModel(), (float)Get_MoveSpeed() + FixedMoveSpeed); _ASSERT( ech != 1 );//エラーチェック ech = E3DGetPos( Get_DummyModel(), &SubPos); _ASSERT( ech != 1 );//エラーチェック ech = E3DSetPos( Get_BodyModel(), SubPos); _ASSERT( ech != 1 );//エラーチェック } else{//減速をさせなければならないなら if( Get_AirOnPC() == 0){//空中にいるなら if( Get_Attitude() == 0) Set_MoveSpeed( Get_MoveSpeed() - 0.8f);//姿勢が「通常状態」なら if( Get_Attitude() == 1) Set_MoveSpeed( Get_MoveSpeed() - 1.0f);//姿勢が「しゃがみ状態」なら } if( Get_AirOnPC() == 1) Set_MoveSpeed( Get_MoveSpeed() - 0.6f);//姿勢が「しゃがみ状態」なら //スピードに制限をかける if( Get_MoveSpeed() <= 0.0 ){ Set_MoveSpeed( 0.0f); } Set_UnderMotion(0); } return 0; }