void SamplingData(int portNum){ int Value=0; unsigned short DCcheck=0; BOOL bQuit = FALSE; BOOL bPrintHeader = TRUE; BYTE Record[20]; BYTE BlittleEndian[31]; BYTE byteOne=0x00; BYTE byteTwo=0x00; int chOption = 0; short fw_check = 0; int i = 0; float LEaccel[4]; float LEang[4]; while(Value == 0) { if(bPrintHeader) { printf("\n"); printf("Select an Option From the Following Menu \n"); printf("0 Data Rate - Modify or review the current DataRate\n"); printf("1 Calculate Orientation - Enable Calculate Orientation \n"); printf("2 Coning & Sculling - Enable Coning & Sculling \n"); printf("3 Little Endian - Change IMU Big Endian format to Little\n"); printf("4 NaN's Suppression - Suppress NaN Data \n"); printf("5 Finite Size Corrction - Enable Finite Size Correction \n"); printf("6 Disable Magnetometer - Disable the Magnetometer \n"); printf("7 Enable Magnetometer - Enable the Magnetometer Low Power Setting \n"); printf("8 Disable Magnetic North - Disable the Magnetic North Compenstation \n"); printf("9 Disable Gravity Comp - Disable the Gravity Compenstation \n"); printf("Q Enable Quaternion - Enable the Quaternion Calculation \n"); printf("E Exit Sampling - Exit the Sampling Menu and return to the Main Menu\n"); bPrintHeader = FALSE; } //read option from the keyboard while(!ReadCharNoReturn(&chOption)) { Sleep(50); } switch (chOption){ case '0': SetDataRate(portNum); bPrintHeader = TRUE; break; case '1': //Enable Calculate Orientation //DataConditioning = 1; byteOne=0x00; byteTwo = 0x01; SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); //DCcheck = convert2short(&Record[3]); if(byteTwo == Record[4]) printf("\nSample Setting Calculate Orientation now Enabled.\n"); else printf("\nError: Failure to Enable Sample Setting Calculate Orientation.\n"); bPrintHeader = TRUE; break; case '2': //Enable Coning & Sculling byteOne=0x00; byteTwo = 0x02; SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); if(byteTwo == Record[4]) printf("\nSample Setting Coning & Sculling now Enabled.\n"); else printf("\nError: Failure to Enable Sample Setting Coning & Sculling.\n"); bPrintHeader = TRUE; break; case '3': //Set Floating Point from sensor to Little Endian byteOne=0x00; byteTwo = 0x10; SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); if(byteTwo == Record[4]){ printf("\n\nSample Setting Floating Point data is sent in Little Endian.\n"); i3dmgx3_AccelAndAngRate(portNum,&BlittleEndian[0]); //printf("received Data----------------\n"); for(i=0;i<4;i++){ LEaccel[i] = Little_Endian_Float(&BlittleEndian[1 + i*4]); //LEaccel[0] = FloatFromBytes(BlittleEndian[1 ]); LEang[i] = Little_Endian_Float(&BlittleEndian[13 + i*4]); } printf("Acceleration & Angular Rate (0xC2)______\n"); printf(" X Y Z \n"); //printf(" %2.6f\n ",LEaccel[0]); printf(" Accel %2.6f\t%2.6f\t%2.6f\n", LEaccel[0], LEaccel[1], LEaccel[2]); printf(" Angle %2.6f\t%2.6f\t%2.6f\n", LEang[0], LEang[1], LEang[2]); }else printf("Error: Failure to set Sample Setting Floating Point data to Little Endian Format.\n"); bPrintHeader = TRUE; break; case '4': //Suppress NaN data byteOne=0x00; byteTwo = 0x20; SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); if(byteTwo == Record[4]) printf("\nSample Setting NaN data is now suppressed.\n"); else printf("\nError: Failure to suppress Sample Setting NaN data. \n"); bPrintHeader = TRUE; break; case '5': //Enable Finite Size Correction byteOne=0x00; byteTwo = 0x40; SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); if(byteTwo == Record[4]) printf("\nSample Setting Finite Size Correction now Enabled.\n"); else printf("\nError: Failure to Enable Sample Setting Finite Size Correction.\n"); bPrintHeader = TRUE; break; //Case(s) 6 - 9 and q require firmware 1.1.27 or greater -------------- case '6': //Disable Magnetometer byteOne=0x01; byteTwo = 0x00; fw_check = 1; SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); if(byteOne == Record[3]) printf("\nSample Setting Magnetometer Disabled. \n"); else printf("\nError: Failure to Disable Sample Setting Magnetometer.\n"); bPrintHeader = TRUE; break; case '7': //Enable Magnetometer low power byteOne=0x02; byteTwo = 0x00; fw_check = 1; SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); if(byteOne == Record[3]) printf("\nSample Setting Magnetometer now Enabled to Low Power Setting.\n"); else printf("\nError: Failure to Enable Sample Setting Magnetometer Low Power Setting.\n"); bPrintHeader = TRUE; break; case '8': //Disable Magnetic North Compensation byteOne = 0x04; //To Enable use byteOne=0x00; byteTwo = 0x00; fw_check = 1; // to enable use fw_check =8 to set time SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); if(byteOne == Record[3]) printf("\nSample Setting Magnetic North Compensationn Disabled."); else printf("\nError: Failure to Disable Sample Setting Magnetic North Compensation.\n"); // if selection is Enabled ask if user wants to run realign up and north 0xDD bPrintHeader = TRUE; break; case '9': //Disable Gravity Compensationn byteOne = 0x08; //To Enable use byteOne=0x00; byteTwo = 0x00; fw_check = 1; // to enable use fw_check =9 to set time SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); if(byteOne == Record[3]) printf("\nSample Setting Gravity Compensationn Disabled"); else printf("\nError: Failure to Disable Sample Setting Gravity Compensation\n"); // if selection is Enabled ask if user wants to run realign up and north 0xDD bPrintHeader = TRUE; break; case 'q': case 'Q'://Enable Quaternion(s) byteOne=0x10; //needs bit 0 bit 1 and bit 11 set on byteTwo=0x03; fw_check = 1; SetSampleSetting(portNum,byteOne, byteTwo, &Record[0], fw_check); if(byteTwo == Record[4]){ printf("\nSample Setting Quaternion Calculation now enabled\n"); Get_Quaternion(portNum); } else printf("\nError: Failure to set Sample Setting Quaternion Calculation\n"); //Get_Quaternion(portNum); bPrintHeader = TRUE; break; case 'e': case 'E': bQuit = TRUE; bPrintHeader = FALSE; return; break; case 'h': case 'H': bPrintHeader = TRUE; break; default: printf("Invalid Option\n\n"); bPrintHeader = TRUE; } } }
/*肩射ち視点からの銃関連まとめ関数*/ int PlayerChara::ShoulderGunSys( Batch_Render *BatPre, int ScreenPos[2]){ /*全体で使う変数の初期化*/ int ech = 0;//エラー確認変数 const D3DXVECTOR3 BaseVec( 0.0, 0.0, -1.0);//向きの初期方向ベクトル const D3DXVECTOR3 CameraUpVec( 0.0, 1.0, 0.0);//カメラの上部のベクトル /*キャラクターの位置を設定します*/ int MotionID = 0;//MLから取得した現在の「首付け根」モーションID int FrameNo = 0;//MLから取得した現在の「首付け根」モーションが現在再生している番号 static double Tm_DegQ_Y = 0.50;//ブレがある前の角度変数Y double Sin_Y = 0.0;//Y座標サイン変数 const double Sin_XZ = sin(4.8);//XZ座標サイン変数 double Cos_Y = 0.0;//Y座標コサイン変数 const double Cos_XZ = cos(4.8);//XZ座標コサイン変数 D3DXVECTOR3 TurnPos( 0.0, 0.0, 0.0);//向くべきYベクトル D3DXVECTOR3 StomachPos( 0.0, 0.0, 0.0);//「首つけ根」の座標 D3DXVECTOR3 WantDeg( 0.0, 0.0, 0.0);//向きたい方向へのベクトル // D3DXVECTOR3 OriginPos( 0.0, 0.0, 0.0);//キャラクターをおくべき原点座標 /**/ //自分の向きを回転させます。 /**/ //最初に回転の計算します if(( Get_MyState() == 0) || ( (Get_MyState() == 2) && ( Get_AirOnPC() == 0))){//通常・空中ダッシュモードでなければ、以下取得せず Set_PC_Deg_XZ( Get_PC_Deg_XZ() + float(0.30*(System::MousePos.x - System::BeforeMousePos.x)) ); Tm_DegQ_Y = Tm_DegQ_Y - 0.0020* float( System::MousePos.y - System::BeforeMousePos.y); } if( ( Get_MyState() == 3) || ( Get_MyState() == 4)){//よっこ飛びの時は // Tm_DegQ_Y = Tm_DegQ_Y - 0.0020* float( System::MousePos.y - System::BeforeMousePos.y + System::rewin.top); } if( Get_PC_Deg_XZ() < 0){ Set_PC_Deg_XZ( Get_PC_Deg_XZ() + 360); } if( 360 < Get_PC_Deg_XZ()){ Set_PC_Deg_XZ( Get_PC_Deg_XZ() - 360); } if(Tm_DegQ_Y> 0.9){ Tm_DegQ_Y = 0.9; } if(Tm_DegQ_Y< -0.6){ Tm_DegQ_Y = -0.6; } System::SetMouseCursol( 320, 240);//マウス座標を真ん中へ System::SetMouseBeforePos();//マウス座標を格納します Sin_Y = sin(Tm_DegQ_Y);//Y座標サインの取得 Cos_Y = cos(Tm_DegQ_Y);//Y座標のコサインの取得 TurnPos.x = float(Cos_XZ * Cos_Y * 2000);//向くべき方向のX座標 TurnPos.y = float(Sin_Y * 2000);//向くべき方向のY座標を取得 TurnPos.z = float(Sin_XZ * Cos_Y * 2000);//向くべき方向のZ座標を取得 /* /////////////////////////////////////////////// */ //次に座標を取得したりしてモデルのボーンを操作します /* /////////////////////////////////////////////// */ WantDeg.x = float( TurnPos.x );//X座標の向く方向のベクトルを取得 WantDeg.y = float( TurnPos.y );//Y座標の向く方向のベクトルを取得 WantDeg.z = float( TurnPos.z );//Z座標の向く方向のベクトルを取得 TurnBackDir( Get_Quaternion(3), WantDeg, 0); /*スプライトの位置を決めて終了します*/ BatPre->Set_SpriteX( "Cursol1", 320 - 25.0f);//カーソルのX座標 BatPre->Set_SpriteY( "Cursol1", 220 - 27.0f);//カーソルのY座標 ScreenPos[0] = 320;/**/ScreenPos[1] = 220; return 0; }
/*自分の向くべき方向を調節したり、射撃したりする関数*/ int PlayerChara::GunConflictTarget( int ScreenPosArray[2], Stage *Stg, Enemy *Ene){ /* /////////////////////////////////////////////////////// */ // キャラクターモデルを壁があれば壁に向ける // なければ銃の攻撃が届く範囲までの距離を取得し、そこに向ける /* /////////////////////////////////////////////////////// */ /*変数の初期化*/ int NowWpKind = 0;//今の武器の種類を取得します int ech = 0;//エラー確認変数 int MotionID = 0;//MLから取得した現在の「首付け根」モーションID int FrameNo = 0;//MLから取得した現在の「首付け根」モーションが現在再生している番号 int NearEnemyID = 0;//一番近い敵キャラの識別番号 int EnemyConflict = 0;//敵に当たった数の合計 int Wall_HitResult = 0;//当たり判定モデルが壁に当たっているかどうか調べます int EneHitResult = 0;//敵が照準に入っているかの結果を入れます int HitResult = 0;//銃を向ける方向があるか入れますかの結果を入れます float NowWpRange = 0.0f;//今の武器の射程を代入します float Wall_HitDistance = 0.0f;//当たった面のところからの距離が代入されます float EneDistance = 0.0f;//当たった敵のところからの距離が代入されます float EneNearDistance = 0.0f;//当たっている一番近い敵の距離が代入されます D3DXVECTOR3 Wall_ReflectVec( 0.0, 0.0, 0.0);//地面の反射ベクトルの構造体 D3DXVECTOR3 Wall_GunTargetPos( 0.0, 0.0, 0.0);//銃が向くべき座標 D3DXVECTOR3 ReflectVec( 0.0, 0.0, 0.0);//反射ベクトルの構造体 D3DXVECTOR3 GunTargetPos( 0.0, 0.0, 0.0);//銃が向くべき座標 D3DXVECTOR3 WantVec( 0.0, 0.0, 0.0);//「首つけ根」の向きたい方向へのベクトル D3DXVECTOR3 BaseVec( 0.0, 0.0, -1.0);//向きの初期方向ベクトル D3DXVECTOR3 StomachPos( 0.0, 0.0, 0.0);//「首つけ根」の座標 D3DXVECTOR3 MyPos1( 0.0, 0.0, 0.0);//最初自分の座標 D3DXVECTOR3 OriginPos( 0.0, 0.0, 0.0);//キャラクターをおくべき原点座標 D3DXVECTOR3 GarbageD3DVec( 0.0, 0.0, 0.0);//要らないXYZのデータの一次入れ POINT ScreenPos = { ScreenPosArray[0], ScreenPosArray[1]};//2Dスクリーン座標構造体 /*装備をきちんとつけていれば*/ if( Get_Wp_equipment() != -1){ NowWpKind = Wpn.GetWeaponData( Get_Wp_equipment(), 0); NowWpRange = float( Wpn.GetWeaponData( Get_Wp_equipment(), 4) * 500); EneNearDistance = float(NowWpRange); } /**/ //壁の銃取得をどのようにするか指定します*/ /**/ /*通常モード( モデル[0]から取得する )*/ if( Stg->Stage_GunTarget == 0){ ech = E3DPickFace( System::scid1, Stg->Stage_hsid[0], ScreenPos, NowWpRange, &Wall_HitResult, &HitResult, &Wall_GunTargetPos, &Wall_ReflectVec, &Wall_HitDistance); _ASSERT( ech != 1 );//エラーチェック } if(Get_Wp_equipment() != -1){//装備をきちんとつけていれば /*武器の種類が、ハンドガンであれば*/ if((NowWpKind == 1) || (NowWpKind == 4)|| (NowWpKind == 5)){ /*敵にあたっていないかチェックします*/ for( int i=0; i< Ene->EnemyNum; i++){//エネミーの数だけ ech = E3DPickFace( System::scid1, Ene->Ene[i]->Get_BodyModel(), ScreenPos, NowWpRange, &EneHitResult, &EneHitResult, &GarbageD3DVec, &GarbageD3DVec, &EneDistance); _ASSERT( ech != 1 );//エラーチェック if( (EneHitResult != 0) && ( EneDistance < EneNearDistance) ){ EneNearDistance = EneDistance;//一番近い敵の距離に更新します NearEnemyID = i;//一番近いモデル番号を入れます EnemyConflict = 1;//近い敵がいることを代入します HitResult = 1;//ヒットフラグを1にする } } if( (EnemyConflict == 1) && ( Wall_HitDistance > EneNearDistance) ){//敵に銃先を向ける ech = E3DPickFace( System::scid1, Ene->Ene[NearEnemyID]->Get_BodyModel(), ScreenPos, NowWpRange, &EneHitResult, &EneHitResult, &GunTargetPos, &ReflectVec, &EneDistance); _ASSERT( ech != 1 );//エラーチェック } else{//壁に銃先を向ける GunTargetPos = Wall_GunTargetPos; ReflectVec = Wall_ReflectVec; } /*壁に当たっていれば*/ if( HitResult != -1){ /*「首付け根」部分の座標を取得します*/ ech = E3DGetCurrentBonePos( Get_BodyModel(), Get_Bone_ID(2), 1, &StomachPos); _ASSERT( ech != 1 );//エラーチェック WantVec.x = GunTargetPos.x - StomachPos.x; WantVec.y = GunTargetPos.y - StomachPos.y; WantVec.z = GunTargetPos.z - StomachPos.z; /*キャラクターの向きを初期化します*/ ech = E3DRotateInit( Get_BodyModel()); _ASSERT( ech != 1 );//エラーチェック /*「首付け根」部分のクォータニオンを調べます*/ ech = E3DGetCurrentBoneQ( Get_BodyModel(), Get_Bone_ID(2), 2, Get_Quaternion(5)); _ASSERT( ech != 1 );//エラーチェック /*「首付け根」部分のモーションはどうか調べます*/ ech = E3DGetMotionFrameNoML( Get_BodyModel(), Get_Bone_ID(2), &MotionID, &FrameNo); _ASSERT( ech != 1 );//エラーチェック /*向きたい方向への計算を行います*/ ech = E3DLookAtQ( Get_Quaternion(5), WantVec, BaseVec, 0, 0); _ASSERT( ech != 1 );//エラーチェック /*向きたい方向の修正を加えます*/ ech = E3DRotateQY( Get_Quaternion(5), -(Get_PC_Deg_XZ())); _ASSERT( ech != 1 );//エラーチェック /*計算したクォーターニオンを代入します*/ ech = E3DSetBoneQ( Get_BodyModel(), Get_Bone_ID(2), MotionID, FrameNo, Get_Quaternion(5)); _ASSERT( ech != 1 );//エラーチェック /*マルチレイヤーモーションの計算を行います*/ ech = E3DCalcMLMotion( Get_BodyModel()); _ASSERT( ech != 1 );//エラーチェック /*キャラクターを回転させます*/ ech = E3DRotateY( Get_BodyModel(), Get_PC_Deg_XZ()); _ASSERT( ech != 1 );//エラーチェック } } else{ } } return 0; }
/*自分の向くべき方向を調節したり、射撃したりする関数*/ int PlayerChara::GunConflictTarget( int ScreenPosArray[2], Stage *Stg, NPC_Head *NPC_H){ /* /////////////////////////////////////////////////////// */ // キャラクターモデルを壁があれば壁に向ける // なければ銃の攻撃が届く範囲までの距離を取得し、そこに向ける /* /////////////////////////////////////////////////////// */ /*変数の初期化*/ int NowWpKind = 0;//今の武器の種類を取得します int ech = 0;//エラー確認変数 int MotionID = 0;//MLから取得した現在の「首付け根」モーションID int FrameNo = 0;//MLから取得した現在の「首付け根」モーションが現在再生している番号 vector<NPC_t>::iterator NearEnemyID;//一番近い敵キャラの識別番号 int EnemyConflict = 0;//敵に当たった数の合計 int Wall_HitResult = 0;//当たり判定モデルが壁に当たっているかどうか調べます int EneHitResult = 0;//敵が照準に入っているかの結果を入れます int HitResult = 0;//銃を向ける方向があるか入れますかの結果を入れます float NowWpRange = 0.0f;//今の武器の射程を代入します float Wall_HitDistance = 0.0f;//当たった面のところからの距離が代入されます float EneDistance = 0.0f;//当たった敵のところからの距離が代入されます float EneNearDistance = 0.0f;//当たっている一番近い敵の距離が代入されます D3DXVECTOR3 Wall_ReflectVec( 0.0, 0.0, 0.0);//地面の反射ベクトルの構造体 D3DXVECTOR3 Wall_GunTargetPos( 0.0, 0.0, 0.0);//銃が向くべき座標 D3DXVECTOR3 ReflectVec( 0.0, 0.0, 0.0);//反射ベクトルの構造体 D3DXVECTOR3 GunTargetPos( 0.0, 0.0, 0.0);//銃が向くべき座標 D3DXVECTOR3 WantVec( 0.0, 0.0, 0.0);//「首つけ根」の向きたい方向へのベクトル D3DXVECTOR3 BaseVec( 0.0, 0.0, -1.0);//向きの初期方向ベクトル D3DXVECTOR3 StomachPos( 0.0, 0.0, 0.0);//「首つけ根」の座標 D3DXVECTOR3 MyPos1( 0.0, 0.0, 0.0);//最初自分の座標 D3DXVECTOR3 OriginPos( 0.0, 0.0, 0.0);//キャラクターをおくべき原点座標 D3DXVECTOR3 GarbageD3DVec( 0.0, 0.0, 0.0);//要らないXYZのデータの一次入れ POINT ScreenPos = { ScreenPosArray[0], ScreenPosArray[1]};//2Dスクリーン座標構造体 vector<NPC_t>::iterator it;// イテレータ /* 装備をきちんとつけていれば */ if( Get_Wp_equipment() != -1){ NowWpKind = Wpn.Get_WeaponPointer( Get_Wp_equipment())->Get_Kind(); NowWpRange = float( Wpn.Get_WeaponPointer( Get_Wp_equipment())->Get_Range() * 500); EneNearDistance = float(NowWpRange); } /* ///////////////////////////////////// */ //壁の銃取得をどのようにするか指定します */ /* //////////////////////////////////// */ /*通常モード( モデル[0]から取得する )*/ if( Stg->Stage_GunTarget == 0){ ech = E3DPickFace( System::scid1, Stg->Stage_hsid[0], ScreenPos, NowWpRange, &Wall_HitResult, &HitResult, &Wall_GunTargetPos, &Wall_ReflectVec, &Wall_HitDistance); _ASSERT( ech != 1 );//エラーチェック } if(Get_Wp_equipment() != -1){//装備をきちんとつけていれば /*武器の種類が、ハンドガンであれば*/ switch(NowWpKind){ case 0: case 2: case 3: case 4: { /*敵にあたっていないかチェックします*/ for( it = NPC_H->Get_NPC_begin(); it != NPC_H->NPC_endit(); it++){//エネミーの数だけ ech = E3DPickFace( System::scid1, (*it).NPC_Mdl->Get_BodyModel(), ScreenPos, NowWpRange, &EneHitResult , &EneHitResult, &GarbageD3DVec, &GarbageD3DVec, &EneDistance); _ASSERT( ech != 1 );//エラーチェック if( (EneHitResult != 0) && ( EneDistance < EneNearDistance) ){ EneNearDistance = EneDistance;//一番近い敵の距離に更新します NearEnemyID = it;//一番近いモデル番号を入れます EnemyConflict = 1;//近い敵がいることを代入します HitResult = 1;//ヒットフラグを1にする } } if( (EnemyConflict == 1) && ( Wall_HitDistance > EneNearDistance) ){//敵に銃先を向ける ech = E3DPickFace( System::scid1, (*NearEnemyID).NPC_Mdl->Get_BodyModel(), ScreenPos, NowWpRange, &EneHitResult, &EneHitResult, &GunTargetPos, &ReflectVec, &EneDistance); _ASSERT( ech != 1 );//エラーチェック } else{//壁に銃先を向ける GunTargetPos = Wall_GunTargetPos; ReflectVec = Wall_ReflectVec; } /*壁に当たっていれば*/ if( HitResult != -1){ /*「首付け根」部分の座標を取得します*/ ech = E3DGetCurrentBonePos( Get_BodyModel(), Get_Bone_ID(2), 1, &StomachPos); _ASSERT( ech != 1 );//エラーチェック WantVec.x = GunTargetPos.x - StomachPos.x; WantVec.y = GunTargetPos.y - StomachPos.y; WantVec.z = GunTargetPos.z - StomachPos.z; TurnBackDir( Get_Quaternion(5), WantVec, 1); } } } } else{ /* 武器を持ってないときの処理とかする予定 */ } return 0; }
/*普通のゲーム内での処理を行う関数、銃器の出し入れ、敵へのあたり、銃を手に置くなど…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; }