トップページ > 過去ログ > 記事閲覧
敵の弾について
名前:yk 日時: 2010/10/01 23:18

敵の弾がどうやっても出せませんいろいろやってみましたけどできませんでした。どうやったら出せるのでしょうか? 一応ソースコードをあげておきます。 #include"DxLib.h" #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define DANSU 10 #define DANSU2 10 #define ENEMY_COUNT 20 #define ENEMY_COUNT2 10 #define ENEMY_COUNT3 1 int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdThow ) { //自機のx y座標、自機のグラフィックハンドルを作成 int x , y, w , h , Graph; //弾のx,y座標、弾のフラグ、弾のグラフィックハンドルを作成 int Tx[DANSU] , Ty[DANSU], TFlag[DANSU], Tw, Th, TGraph; //弾のx,y座標、弾のフラグ、弾のグラフィックハンドルを作成 int TTx[DANSU2] , TTy[DANSU2], TTFlag[DANSU2], TTw, TTh, TTGraph; //スペースキーを押しているか押していないかをチェックするフラグ int TCFlag; //Bキーを押しているか押していないかをチェックするフラグ int TTCFlag; //敵のx,y座標、敵のグラフ、敵のグラフィックハンドルを作成 int Ex[ENEMY_COUNT], Ey[ENEMY_COUNT], EFlag[ENEMY_COUNT], Ew, Eh, EGraph; //敵のx,y座標、敵のグラフ、敵のグラフィックハンドルを作成 int EEx[ENEMY_COUNT2], EEy[ENEMY_COUNT2], EEFlag[ENEMY_COUNT2], EEw, EEh, EEGraph; //敵のx,y座標、敵のグラフ、敵のグラフィックハンドルを作成 int EEEx[ENEMY_COUNT3], EEEy[ENEMY_COUNT3], EEEFlag[ENEMY_COUNT3], EEEw, EEEh, EEEGraph; //for文用 int i , j , k ; //撃墜数 int count= 0; //残機数 int life = 50; //ゲームオーバーフラグ int isGameOver = 0; //画面モードの設定 SetGraphMode( SCREEN_WIDTH , SCREEN_HEIGHT , 16 ); //画面モードをウインドウモードに変更 ChangeWindowMode(TRUE); //ウインドウのタイトルを変更 SetMainWindowText("しゅーてぃんぐげーむ"); // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1 ; //描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); //自機のグラフィックをメモリーにロード Graph = LoadGraph( "test1.png"); //弾のグラフィックをメモリーにロード TGraph = LoadGraph( "tama.png"); //弾のグラフィックをメモリーにロード TTGraph = LoadGraph( "killer shot.png"); //敵のグラフィックメモリにロード EGraph = LoadGraph( "te-ki-.png" ) ; //敵のグラフィックメモリにロード EEGraph = LoadGraph( "te-ki-2.png" ) ; //敵のグラフィックメモリにロード EEEGraph = LoadGraph( "te-ki-3.png" ) ; //自機のx,y座標を初期化 x = 300; y =400; // 弾が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく for(i=0;i<DANSU;i++){ TFlag[i] = 0 ; } //ショットボタンが前のフレームで押されたかどうかを保存する変数荷0(押されていない)を代入 TCFlag = 0 ; for (i = 0 ; i < ENEMY_COUNT ; i++){ EFlag[i] = 0; } for (i = 0 ; i < ENEMY_COUNT2 ; i++){ EEFlag[i] = 0; } for (i = 0 ; i < ENEMY_COUNT3 ; i++){ EEEFlag[i] = 0; } // 弾が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく for(k=0;k<DANSU2;k++){ TTFlag[k] = 0 ; } //ショットボタンが前のフレームで押されたかどうかを保存する変数荷0(押されていない)を代入 TTCFlag = 0 ; for (i = 0 ; i < ENEMY_COUNT ; i++){ EFlag[i] = 0; } for (i = 0 ; i < ENEMY_COUNT2 ; i++){ EEFlag[i] = 0; } for (i = 0 ; i < ENEMY_COUNT3 ; i++){ EEEFlag[i] = 0; } // 自機、弾、敵のグラフィックのサイズを得る GetGraphSize( Graph , &w , &h ) ; GetGraphSize( TGraph , &Tw , &Th ) ; GetGraphSize( TTGraph , &TTw , &TTh ) ; GetGraphSize( EGraph , &Ew , &Eh ) ; GetGraphSize( EEGraph , &EEw , &EEh ) ; GetGraphSize( EEEGraph , &EEEw , &EEh ) ; //移動処理 while(!isGameOver){ //画面に描かれているのもを一回全部消す ClsDrawScreen(); //上下左右のキー入力に対応して x,yの座標値を変更する if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) x -= 8; if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) x += 8; if( CheckHitKey( KEY_INPUT_UP ) == 1 ) y -= 8; if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) y += 8; // スペースキーを押していて、かつ弾が撃ち出されていなかったら弾を発射する if( CheckHitKey( KEY_INPUT_SPACE ) == 1) { // 前フレームでショットボタンを押したかが保存されている変数が0だったら弾を発射 if(TCFlag == 0){ //@(if(TCFlag == 0){)を//(if(TCFlag == 0){)にして // 画面上にでていない弾があるか、弾の数だけ繰り返して調べる for(i=0;i<DANSU;i++){ // 弾iが画面上にでていない場合はその弾を画面に出す if(TFlag[i] == 0){ // 弾の位置をセット、位置は位置の中心にする Tx[i] = ( w - Tw ) / 2 + x ; Ty[i] = ( h - Th ) / 2 + y ; // 弾は現時点を持って存在するので、存在状態を保持する変数に1を代入する TFlag[i] = 1 ; // 一つ弾を出したので弾を出すループから抜けます //抜けないと1回押しただけで全部の弾が次々と出てしまう break; } } } //A}を//}にする // 前フレームでショットボタンを押されていたかを保存する変数に1(おされていた)を代入 TCFlag = 1; } else{ // ショットボタンが押されていなかった場合は // 前フレームでショットボタンが押されていたかを保存する変数に0(おされていない)を代入 TCFlag = 0 ; } // Lキーを押していて、かつ弾が撃ち出されていなかったら弾を発射する if( CheckHitKey( KEY_INPUT_L ) == 1){ // 前フレームでショットボタンを押したかが保存されている変数が0だったら弾を発射 if(TTCFlag == 0){ // 画面上にでていない弾があるか、弾の数だけ繰り返して調べる for(k=0;k<DANSU2;k++){ // 弾iが画面上にでていない場合はその弾を画面に出す if(TTFlag[k] == 0){ // 弾の位置をセット、位置は位置の中心にする TTx[k] = ( w - TTw ) / 2 + x ; TTy[k] = ( h - TTh ) / 2 + y ; // 弾は現時点を持って存在するので、存在状態を保持する変数に1を代入する TTFlag[k] = 1 ; // 一つ弾を出したので弾を出すループから抜けます //抜けないと1回押しただけで全部の弾が次々と出てしまう break; } } // 前フレームでショットボタンを押されていたかを保存する変数に1(おされていた)を代入 TTCFlag = 1; } } else{ // 前フレームでショットボタンが押されていたかを保存する変数に0(おされていない)を代入 TTCFlag = 0 ; } for (i = 0 ; i < ENEMY_COUNT; i++){ if (GetRand(100) == 0) { //GetRandの()内の数字を変えると敵の量を調節すろことが可能。少なくすると、いっぱい出てくる //敵iが画面上に出ていない場合はその弾を画面に出す if (EFlag[i] == 0){ //敵の画像ファイルを得る GetGraphSize(EGraph, &Ew, &Eh); //敵の位置をセット、位置はランダムに Ex[i] = GetRand(SCREEN_WIDTH - Ew); Ey[i] = -Eh; //敵は現時点をもって存在するので、存在状態を保持する変数に1を代入する EFlag[i] = 1; //一つ敵を出したので敵を出すループから抜けます //抜けないと1回押しただけで全部の敵が次々と出てしまう break; } } } for (i = 0 ; i < ENEMY_COUNT2; i++){ if (GetRand(100) == 0) { //GetRandの()内の数字を変えると敵の量を調節すろことが可能。少なくすると、いっぱい出てくる //敵iが画面上に出ていない場合はその弾を画面に出す if (EEFlag[i] == 0){ //敵の画像ファイルを得る GetGraphSize(EEGraph, &EEw, &EEh); //敵の位置をセット、位置はランダムに EEx[i] = GetRand(SCREEN_WIDTH - Ew); EEy[i] = -Eh; //敵は現時点をもって存在するので、存在状態を保持する変数に1を代入する EEFlag[i] = 1; //一つ敵を出したので敵を出すループから抜けます //抜けないと1回押しただけで全部の敵が次々と出てしまう break; } } } for (i = 0 ; i < ENEMY_COUNT3; i++){ if (GetRand(1000) == 0) { //GetRandの()内の数字を変えると敵の量を調節すろことが可能。少なくすると、いっぱい出てくる //敵iが画面上に出ていない場合はその弾を画面に出す if (EEEFlag[i] == 0){ //敵の画像ファイルを得る GetGraphSize(EEEGraph, &EEEw, &EEEh); //敵の位置をセット、位置はランダムに EEEx[i] = GetRand(SCREEN_WIDTH - EEEw); EEEy[i] = -Eh; //敵は現時点をもって存在するので、存在状態を保持する変数に1を代入する EEEFlag[i] = 1; //一つ敵を出したので敵を出すループから抜けます //抜けないと1回押しただけで全部の敵が次々と出てしまう break; } } } //自機が画面左端からはみ出そうになっていてら画面内の座標に戻してあげる if( x < 0 ) x = 0 ; //自機が画面右端からはみ出そうになっていてら画面内の座標に戻してあげる if( x > SCREEN_WIDTH - 64 ) x = SCREEN_WIDTH - 64 ; //自機が画面上端からはみ出そうになっていてら画面内の座標に戻してあげる if( y < 0) y = 0 ; //自機が画面端からはみ出そうになっていてら画面内の座標に戻してあげる if( y > SCREEN_HEIGHT - 64 ) y = SCREEN_HEIGHT - 64 ; // x , y が示す画像座標にGraphを描画する DrawGraph( x , y , Graph , TRUE ); // 弾の数だけ弾を動かす処理を繰り返す for(i=0;i<DANSU;i++){ // 自機の弾の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う ) if( TFlag[i] == 1 ) { // 弾を16ドット上に移動させる Ty[i] -= 16 ; // 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する if( Ty[i] < -80 ) { TFlag[i] = 0 ; } // 画面に弾を描画する DrawGraph( Tx[i] , Ty[i] , TGraph , TRUE ) ; } } // 弾の数だけ弾を動かす処理を繰り返す for(k=0;k<DANSU2;k++){ // 自機の弾の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う ) if( TTFlag[k] == 1 ) { // 弾を16ドット上に移動させる TTy[k] -= 30 ; // 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する if( TTy[k] < -80 ) { TTFlag[k] = 0 ; } // 画面に弾を描画する DrawGraph( TTx[k] , TTy[k] , TTGraph , TRUE ) ; } } //敵の数だけ敵を動かす処理を繰り返す for(i = 0; i < ENEMY_COUNT; i++) { //敵の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う) if (EFlag[i] == 1) { //敵を6ドット上に移動させる Ey[i] += 6; //画面外に出てしまった場合は存在状態を保持している変数に0を代入する if (Ey[i] > 500) { EFlag[i] = 0; } //画面に敵を描画する DrawGraph( Ex[i] , Ey[i] , EGraph , TRUE ); } } //敵の数だけ敵を動かす処理を繰り返す for(i = 0; i < ENEMY_COUNT2; i++) { //敵の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う) if (EEFlag[i] == 1) { //敵を6ドット上に移動させる EEy[i] += 6; //画面外に出てしまった場合は存在状態を保持している変数に0を代入する if (EEy[i] > 500) { EEFlag[i] = 0; } //画面に敵を描画する DrawGraph( EEx[i] , EEy[i] , EEGraph , TRUE ); } } //敵の数だけ敵を動かす処理を繰り返す for(i = 0; i < ENEMY_COUNT3; i++) { //敵の移動処理( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う) if (EEEFlag[i] == 1) { //敵を6ドット上に移動させる EEEy[i] += 6; //画面外に出てしまった場合は存在状態を保持している変数に0を代入する if (EEEy[i] > 500) { EEEFlag[i] = 0; } //画面に敵を描画する DrawGraph( EEEx[i] , EEEy[i] , EEEGraph , TRUE ); } } //弾と敵の当たり判定、それぞれの弾について検証する for( i = 0 ; i < DANSU; i++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT ; j++){ //弾iが存在している場合のみ次の処理に映る if( TFlag[i] == 1 && EFlag[j] == 1 ) { //敵と当たり判定 int tx = Tx[i]; int ty = Ty[i]; int ex = Ex[j]; int ey = Ey[j]; if (( tx < ex + Ew ) && ( tx + Tw > ex ) && ( ty < ey + Eh ) && ( ty + Th > ey)) { //接触している場合は当たった弾の存在を消す TFlag[i] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } } //弾と敵の当たり判定、それぞれの弾について検証する for( i = 0 ; i < DANSU; i++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT2 ; j++){ //弾iが存在している場合のみ次の処理に映る if( TFlag[i] == 1 && EEFlag[j] == 1 ) { //敵と当たり判定 int tx = Tx[i]; int ty = Ty[i]; int Eex = EEx[j]; int Eey = EEy[j]; if (( tx < Eex + EEw ) && ( tx + Tw > Eex ) && ( ty < Eey + EEh ) && ( ty + Th > Eey)) { //接触している場合は当たった弾の存在を消す TFlag[i] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EEFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } } //弾と敵の当たり判定、それぞれの弾について検証する /*for( i = 0 ; i < DANSU; i++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT3 ; j++){ //弾iが存在している場合のみ次の処理に映る if( TFlag[i] == 1 && EEEFlag[j] == 1 ) { //敵と当たり判定 int tx = Tx[i]; int ty = Ty[i]; int EEex = EEEx[j]; int EEey = EEEy[j]; if (( tx < EEex + EEEw ) && ( tx + Tw > EEex ) && ( ty < EEey + EEEh ) && ( ty + Th > EEey)) { //接触している場合は当たった弾の存在を消す TFlag[i] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EEEFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } }*/ //弾と敵の当たり判定、それぞれの弾について検証する for( k = 0 ; k < DANSU2; k++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT ; j++){ //弾iが存在している場合のみ次の処理に映る if( TTFlag[k] == 1 && EFlag[j] == 1 ) { //敵と当たり判定 int Ttx = TTx[k]; int Tty = TTy[k]; int ex = Ex[j]; int ey = Ey[j]; if (( Ttx < ex + Ew ) && ( Ttx + TTw > ex ) && ( Tty < ey + Eh ) && ( Tty + TTh > ey)) { //接触している場合は当たった弾の存在を消す TTFlag[k] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } } //弾と敵の当たり判定、それぞれの弾について検証する for( k = 0 ; k < DANSU2; k++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT2 ; j++){ //弾iが存在している場合のみ次の処理に映る if( TTFlag[k] == 1 && EEFlag[j] == 1 ) { //敵と当たり判定 int Ttx = TTx[k]; int Tty = TTy[k]; int Eex = EEx[j]; int Eey = EEy[j]; if (( Ttx < Eex + EEw ) && ( Ttx + TTw > Eex ) && ( Tty < Eey + EEh ) && ( Tty + TTh > Eey)) { //接触している場合は当たった弾の存在を消す TTFlag[k] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EEFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } } //弾と敵の当たり判定、それぞれの弾について検証する /*for( k = 0 ; k < DANSU2; k++ ) { //一つひとつの弾につき一機いっきとの接触を検証する for(j = 0 ; j < ENEMY_COUNT3 ; j++){ //弾iが存在している場合のみ次の処理に映る if( TTFlag[k] == 1 && EEEFlag[j] == 1 ) { //敵と当たり判定 int Ttx = TTx[k]; int Tty = TTy[k]; int EEex = EEEx[j]; int EEey = EEEy[j]; if (( Ttx < EEex + EEEw ) && ( Ttx + TTw > EEex ) && ( Tty < EEey + EEEh ) && ( Tty + TTh > EEey)) { //接触している場合は当たった弾の存在を消す TTFlag[k] = 0;// (TFlag[i] = 0;)を(//TFlag = 0;)にすると貫通弾が作れる EEEFlag[j] = 0; //( = 0;)を( = 1;)にすると? count++; } } } }*/ //自機と敵との当たり判定 for( i = 0 ; i < ENEMY_COUNT ; i++ ) { if (EFlag[i] == 1) { int ex = Ex[i]; int ey = Ey[i]; if((x < ex + Ew) && (x + w > ex) && (y < ey + Eh) && (y + h > ey)) { EFlag[i] = 0; life--; if(life <= 0) { //残機が0以下になったらループ脱出 isGameOver = 1; } } } } //自機と敵との当たり判定 for( i = 0 ; i < ENEMY_COUNT2 ; i++ ) { if (EEFlag[i] == 1) { int Eex = EEx[i]; int Eey = EEy[i]; if((x < Eex + EEw) && (x + w > Eex) && (y < Eey + EEh) && (y + h > Eey)) { EEFlag[i] = 0; life--; if(life <= 0) { //残機が0以下になったらループ脱出 isGameOver = 1; } } } } //自機と敵との当たり判定 for( i = 0 ; i < ENEMY_COUNT3 ; i++ ) { if (EEEFlag[i] == 1) { int EEex = EEEx[i]; int EEey = EEEy[i]; if((x < EEex + EEEw) && (x + w > EEex) && (y < EEey + EEEh) && (y + h > EEey)) { EEFlag[i] = 0; //EEFlag[i] = 0;をEEEFlag[i] = 0 にする。 life--; if(life <= 0) { //残機が0以下になったらループ脱出 isGameOver = 1; } } } } if( CheckHitKey( KEY_INPUT_HOME ) == 1) (life++); //撃墜数を設定 DrawFormatString( 0, 0, GetColor(255,255,255),"撃墜数%d",count); //残機数を表示 DrawFormatString( 0, 20, GetColor(255,255,255),"残機数%d",life); // 裏画面の内容を表画面に反映させる ScreenFlip(); // 20分の1秒待つ WaitTimer( 20 ); // Windows システムからくる情報を処理する if( ProcessMessage() == -1 ) break; // ESCキーが押されたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break; } // DXライブラリ使用の終了処理 DxLib_End(); // ソフトの終了 return 0; } お願いします

Page: 1 |

Re: 敵の弾について ( No.1 )
名前:いっち 日時:2010/10/02 15:45

敵の出現や、自機の弾の発生等と基本的には同じことだと思います。 とりあえず、やってみましたが、当たり判定は取っていません。 追加した部分には //- ADD の形でコメントをいれてあります。 > ttp://www1.axfc.net/uploader/Sc/so/159086.zip&key=dxlib
Re: 敵の弾について ( No.2 )
名前:yk 日時:2010/10/02 17:58

返信遅れました。すみません、一応やってみます。^^
Re: 敵の弾について ( No.3 )
名前:yk 日時:2010/10/02 20:13

あのぉすみません まだまだ私は未熟なので当たり判定が作れないんです。(まぁ、こんな質問している時点で未熟なのがわかると思うんですが) お願いしますぅ 作ってください
Re: 敵の弾について ( No.4 )
名前:いっち 日時:2010/10/02 21:06

どうぞ。 > ttp://www1.axfc.net/uploader/Sc/so/159175.zip&key=dxlib
Re: 敵の弾について ( No.5 )
名前:yk 日時:2010/10/02 22:39

ありがとうございました。 とても役立ちました^^

Page: 1 |