// ゲーム中の銃の操作に関することをします int Weapon::TreatmentWhileGame( int Wp_equipment){ /*変数の初期化*/ int ech = 0; int keyin[20] = {0}; float LightDistance = 0.0f;//光が届く距離 float MuzzleFlashAlpha = 0.0f;//マズルフラッシュの透明度 float MuzzlePosArray[3];//マズルフラッシュを表示させる座標配列 static int MuzzleFlashConter = 0;//マズルフラッシュカウンター D3DXVECTOR3 MuzzlePos( 0.0, 0.0, 0.0);//銃口位置 E3DCOLOR4UC MuzzleFlashColor = { 0, 0, 0, 0};//マズルフラッシュの色を指定 /*キーを取得する*/ System::GetKeyData(keyin); if( Wp_equipment != -1){//武器があれば /*変数の初期化*/ const int NowAmmo = WeaponDataWhileGame[Wp_equipment][0]; //現在の弾薬数 const int NowMag = WeaponDataWhileGame[Wp_equipment][1]; //現在のマガジン数 const int WeaponAmmo = WeaponData[Wp_equipment][2]; //武器性能上の弾薬数 /*武器に新しいモーションを当てる*/ ech = E3DSetNewPoseML( WeaponModel[Wp_equipment]); if(ech != 0 ){//エラーチェック _ASSERT( 0 );//エラーダイアログ }; if( WeaponBone[Wp_equipment][0] != 0){ /*銃の置くボーンの座標を求めます*/ ech = E3DGetCurrentBonePos( WeaponModel[Wp_equipment], WeaponBone[Wp_equipment][0], 1, &MuzzlePos); if(ech != 0 ){//エラーチェック _ASSERT( 0 );//エラーダイアログ }; } /*重厚の位置に爆発エフェクトを置きます*/ ech = E3DSetBillboardPos( WeaponEffect[Wp_equipment][0], MuzzlePos); if(ech != 0 ){//エラーチェック _ASSERT( 0 );//エラーダイアログ }; if( WeaponFireFlag == 1){ /*ビルボードを回転させます*/ ech = E3DRotateBillboard( WeaponEffect[Wp_equipment][0], float( rand() % 360), 1); if(ech != 0 ){//エラーチェック _ASSERT( 0 );//エラーダイアログ }; //位置を代入 MuzzlePosArray[0] = MuzzlePos.x; MuzzlePosArray[1] = MuzzlePos.y; MuzzlePosArray[2] = MuzzlePos.z; //サウンドの再生 PlayWeaponSound( Wp_equipment, 0, MuzzlePosArray); /*変数操作*/ // マズルフラッシュカウンターを表示させます MuzzleFlashConter = 4; //弾薬をひとつ減らします WeaponDataWhileGame[Wp_equipment][0] = WeaponDataWhileGame[Wp_equipment][0] - 1; /*連射カウンタに一定数値を代入し射撃を一定停止させます*/ WeaponRapidFire = WeaponData[Wp_equipment][6]; } if( WeaponFireFlag == 2){//弾なしで空撃ち状態なら //位置を代入 MuzzlePosArray[0] = MuzzlePos.x; MuzzlePosArray[1] = MuzzlePos.y; MuzzlePosArray[2] = MuzzlePos.z; //サウンドの再生 PlayWeaponSound( Wp_equipment, 1, MuzzlePosArray); /*変数操作*/ /*連射カウンタに一定数値を代入し射撃を一定停止させます*/ WeaponRapidFire = WeaponData[Wp_equipment][6]; } if( ( keyin[4] == 1) && ( 0 < NowMag) && //Rキーが押されてて //リロードできる状態(Magがあり、AMMOが満タンでないか銃未使用)でリロードするなら /**/ ( ( NowAmmo < WeaponAmmo) || ( NowMag == WeaponData[Wp_equipment][3]))){ if( ( WeaponData[Wp_equipment][0] != 3) && ( WeaponData[Wp_equipment][0] != 7) && //グレネードでなく、ショットガンでもなければ /**/( NowAmmo >= WeaponAmmo) && ( NowMag == WeaponData[Wp_equipment][3])){// MAGもAMMOも一個も使ってなければ WeaponDataWhileGame[Wp_equipment][0] = WeaponAmmo + 1;//AMMOを満タン+1にする } else{//通常のリロードであれば WeaponDataWhileGame[Wp_equipment][0] = WeaponAmmo;//AMMOを満タンにする } // WeaponDataWhileGame[Wp_equipment][1] -= 1;//MAGをひとつ減らす } /*マズルフラッシュカウンターがオンなら*/ if( 0 < MuzzleFlashConter){ if( MuzzleFlashConter == 4){ MuzzleFlashAlpha = 0.7f; MuzzleFlashColor.r = 200; MuzzleFlashColor.g = 200; MuzzleFlashColor.b = 200; } if( MuzzleFlashConter == 3){ MuzzleFlashAlpha = 0.9f; MuzzleFlashColor.r = 240; MuzzleFlashColor.g = 240; MuzzleFlashColor.b = 240; } if( MuzzleFlashConter == 2){ MuzzleFlashAlpha = 0.6f; MuzzleFlashColor.r = 160; MuzzleFlashColor.g = 160; MuzzleFlashColor.b = 160; } if( MuzzleFlashConter == 1){ /*ライトを無効にする*/ MuzzleFlashAlpha = 0.2f; MuzzleFlashColor.r = 0; MuzzleFlashColor.g = 0; MuzzleFlashColor.b = 0; } /*透明度を変更する*/ ech = E3DSetBillboardAlpha( WeaponEffect[Wp_equipment][0], MuzzleFlashAlpha); if(ech != 0 ){//エラーチェック _ASSERT( 0 );//エラーダイアログ }; /*ライトを付ける*/ if( MuzzleFlashConter != 1){ ech = E3DSetPointLight( WeaponMuzzleLight[Wp_equipment], MuzzlePos, 700.0f, MuzzleFlashColor); if(ech != 0 ){//エラーチェック _ASSERT( 0 );//エラーダイアログ }; } else{//ライト消灯のお時間です ech = E3DSetPointLight( WeaponMuzzleLight[Wp_equipment], MuzzlePos, 0.0f, MuzzleFlashColor); if(ech != 0 ){//エラーチェック _ASSERT( 0 );//エラーダイアログ }; } /*爆発のエフェクトを(すべてのビルボード)の描画*/ ech = E3DRenderBillboard( System::scid1, 0); if(ech != 0 ){//エラーチェック _ASSERT( 0 );//エラーダイアログ }; /*フラッシュカウントをひとつ下げる*/ MuzzleFlashConter = MuzzleFlashConter -1; /*透明度を変更する*/ if( MuzzleFlashConter == 0){//カウントが0になったら ech = E3DSetBillboardAlpha( WeaponEffect[Wp_equipment][0], 0.0f); if(ech != 0 ){//エラーチェック _ASSERT( 0 );//エラーダイアログ }; } } /*連射停止カウンタがオンなら*/ if( 0 < WeaponRapidFire){ WeaponRapidFire = WeaponRapidFire - 1;//連射停止カウンタを一つ繰り下げる } } return 0; }
int OneTimeSceneInit() { int ret; D3DXVECTOR3 campos = D3DXVECTOR3( -546.0f, 400.0f, -1845.0f ); ret = E3DSetCameraPos( campos ); if( ret ){ _ASSERT( 0 ); return 1; } D3DXVECTOR3 camtar = D3DXVECTOR3( 3.2733f, 450.0f, 70.6515f ); D3DXVECTOR3 camup = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); ret = E3DSetCameraTarget( camtar, camup ); if( ret ){ _ASSERT( 0 ); return 1; } ret = E3DSetProjection( 1000.0f, 30000.0f, 60.0f ); if( ret ){ _ASSERT( 0 ); return 1; } char mqoname[MAX_PATH]; sprintf_s( mqoname, MAX_PATH, "%s\\hdrscene3.mqo", szMediaDir ); ret = E3DLoadMQOFileAsGround( mqoname, 10.0f, 0, BONETYPE_RDB2, &hsid0 ); if( ret ){ _ASSERT( 0 ); return 1; } //ピクセル単位のPhongライティングにする ret = E3DSetShaderType( hsid0, COL_PPHONG ); _ASSERT( !ret ); ret = E3DCreateLight( &lid1 ); if( ret ){ _ASSERT( 0 ); return 1; } D3DXVECTOR3 lpos( 1000.0f, 0.0f, 3500.0f ); E3DCOLOR4UC col= {255, 255, 255, 255 }; ret = E3DSetPointLight( lid1, lpos, 9000.0f, col ); if( ret ){ _ASSERT( 0 ); return 1; } //HDR用の強い光をセット E3DCOLOR4F diffuse = { 10.0f, 10.0f, 10.0f, 1.0f }; E3DCOLOR4F specular = { 0.2f, 0.2f, 0.2f, 1.0f }; ret = E3DSetHDRLightDiffuse( lid1, diffuse ); _ASSERT( !ret ); ret = E3DSetHDRLightSpecular( lid1, specular ); _ASSERT( !ret ); //トーンマップのテクスチャを作成 int toneok = 0; ret = E3DCreateToneMapTexture( 4, toneformat, &tonemapid, &toneok ); if( ret ){ _ASSERT( 0 ); return 1; } int okflag; SIZE orgsize = { 640 / 2, 480 }; SIZE small4 = { orgsize.cx / 4, orgsize.cy / 4 }; SIZE small8 = { orgsize.cx / 8, orgsize.cy / 8 }; ret = E3DCreateRenderTargetTexture( orgsize, hdrformat, &scid_org, &texid_org, &okflag ); if( ret || !okflag ){ _ASSERT( 0 ); return 1; } ret = E3DCreateRenderTargetTexture( small4, hdrformat, &scid_small, &texid_small, &okflag ); if( ret || !okflag ){ _ASSERT( 0 ); return 1; } ret = E3DCreateRenderTargetTexture( small4, D3DFMT_A8R8G8B8, &scid_bright, &texid_bright, &okflag ); if( ret || !okflag ){ _ASSERT( 0 ); return 1; } ret = E3DCreateRenderTargetTexture( small8, D3DFMT_A8R8G8B8, &scid_bloom0, &texid_bloom0, &okflag ); if( ret || !okflag ){ _ASSERT( 0 ); return 1; } ret = E3DCreateRenderTargetTexture( small8, D3DFMT_A8R8G8B8, &scid_bloom1, &texid_bloom1, &okflag ); if( ret || !okflag ){ _ASSERT( 0 ); return 1; } ret = E3DCreateRenderTargetTexture( small8, D3DFMT_A8R8G8B8, &scid_work, &texid_work, &okflag ); if( ret || !okflag ){ _ASSERT( 0 ); return 1; } ret = E3DCreateRenderTargetTexture( small8, D3DFMT_A8R8G8B8, &scid_bloom2, &texid_bloom2, &okflag ); if( ret || !okflag ){ _ASSERT( 0 ); return 1; } ret = E3DCreateRenderTargetTexture( orgsize, D3DFMT_A8R8G8B8, &scid_final, &texid_final, &okflag ); if( ret || !okflag ){ _ASSERT( 0 ); return 1; } char spname[MAX_PATH]; sprintf_s( spname, MAX_PATH, "%s\\dummy256.png", szMediaDir ); ret = E3DCreateSprite( spname, 0, 0, &spid1 ); if( ret ){ _ASSERT( 0 ); return 1; } ret = E3DSetTextureToDispObj( -2, spid1, texid_org ); if( ret ){ _ASSERT( 0 ); return 1; } ret = E3DGetSpriteSize( spid1, &spw1, &sph1 ); if( ret ){ _ASSERT( 0 ); return 1; } ret = E3DCreateSprite( spname, 0, 0, &spid2 ); if( ret ){ _ASSERT( 0 ); return 1; } ret = E3DSetTextureToDispObj( -2, spid2, texid_final ); if( ret ){ _ASSERT( 0 ); return 1; } ret = E3DGetSpriteSize( spid2, &spw2, &sph2 ); if( ret ){ _ASSERT( 0 ); return 1; } keydir = 0; middlegray = 0.1f; threshold = 9.5f; offset = 7.0f; return 0; }