Ejemplo n.º 1
0
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;
						
		   }			
	 }
}
Ejemplo n.º 2
0
/*肩射ち視点からの銃関連まとめ関数*/
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;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
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;

}