シューティングゲームを作ろうと、
今、ゲームプログラミングで当たり判定を勉強中です・・
あるサンプルコードをみながらプログラムを書いているのですが、
こんなプログラムです。
画像を操作し、スペースキーを押すと自機から弾が発射される。
敵は左右をウロチョロしていて、敵に弾が当たるとその弾が消える。
弾は最大20個まで画面に存在できる。
スペースキーを連続押ししても弾は一度しか発射されない。
これでプログラムを組んだのですが、
弾が消えないのです。
確かに
if(ShotFlag==0)と書いたのですが・・・
どこの部分がおかしいのでしょうか。
ソースは以下の通りです。
本当に長いので、見るのは暇な時だけで結構です。
大体こんな感じです。
OreX,OreY,OreGraph(俺(自機のこと、笑)のX座標、Y座標、画像)
EnemyX,EnemyY,EnemyGraph(敵の情報、上記と同じ)
EnemyW,EnemyH(敵の横幅、縦幅)
ShotX[SHOT],ShotY[SHOT],ShotFlag[SHOT],ShotGraph
(弾のX座標、Y座標、弾の存在しているかしていないかのフラグ、画像)
※0:存在しない、1:存在する
ShotW,ShotH(弾の横幅、縦幅)
ShotBFlag(前のループでスペースキーを押したかのフラグ(連続で出ることの防止))
i (for文用)
#include "DxLib.h" #define SHOT 20 //WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int OreX, OreY, OreGraph; int EnemyX, EnemyY, EnemyGraph, EnemyMuki; int EnemyW, EnemyH; int ShotX[SHOT], ShotY[SHOT], ShotFlag[SHOT], ShotGraph; int ShotW, ShotH; int ShotBFlag; int i; //画面モード ChangeWindowMode( TRUE ); //Dxライブラリ初期化 if(DxLib_Init()== -1) return -1; //裏画面モード SetDrawScreen(DX_SCREEN_BACK); //画像ロードと座標設定 OreGraph = LoadGraph("俺.bmp"); OreX=320; OreY=400; EnemyGraph = LoadGraph("私.bmp"); EnemyX=0; EnemyY=50; ShotGraph = LoadGraph("弾.png"); //弾はまだ画面上に存在しない for(i=0;i<SHOT;i++) { ShotFlag = 0; } ShotBFlag = 0; EnemyMuki = 1; //敵の画像サイズ GetGraphSize(EnemyGraph, &EnemyW, &EnemyH); //弾の画像サイズ GetGraphSize(ShotGraph, &ShotW, &ShotH); //移動ルーチン while(1) { //画面の初期化 ClearDrawScreen(); //自分の操作ルーチン { if(CheckHitKey(KEY_INPUT_RIGHT)==1)OreX+=3; if(CheckHitKey(KEY_INPUT_LEFT)==1)OreX-=3; if(CheckHitKey(KEY_INPUT_UP)==1)OreY-=3; if(CheckHitKey(KEY_INPUT_DOWN)==1)OreY+=3; //スペースを押したら処理を分岐 if(CheckHitKey(KEY_INPUT_SPACE)) { if(ShotBFlag == 0) { //画面に出ていない弾を調べる for(i=0;i<SHOT;i++) { if(ShotFlag==0) { int Ow,Oh,Sw,Sh; GetGraphSize(OreGraph,&Ow,&Oh); GetGraphSize(ShotGraph,&Sw,&Sh); ShotX= (Ow-Sw)/2 + OreX; ShotY= (Oh-Sh)/2 + OreY; ShotFlag=1; break; } } } ShotBFlag = 1; } else { ShotBFlag=0; } //はみ出し修正 if(OreX<0)OreX=0; if(OreX>640-63)OreX=640-63; if(OreY<0)OreY=0; if(OreY>480-65)OreY=480-65; //俺描画 DrawGraph(OreX,OreY,OreGraph,TRUE); } //弾の数だけ弾を動かす処理をする for(i=0;i<SHOT;i++) { //弾の移動ルーチン if(ShotFlag==1) { ShotY-=16; if(ShotY<-80) { ShotFlag=0; } //弾描画 DrawGraph(ShotX[i],ShotY[i],ShotGraph,TRUE); } } //敵移動ルーチン { if(EnemyMuki==1)EnemyX+=3; if(EnemyMuki==0)EnemyX-=3; if(EnemyX>576) { EnemyX=576; EnemyMuki=0; } if(EnemyX<0) { EnemyX=0; EnemyMuki=1; } //敵描画 DrawGraph(EnemyX,EnemyY,EnemyGraph,FALSE); } //弾と敵の当たり判定 弾の数だけ繰り返す for(i=0;i<SHOT;i++) { //弾iが存在するときのみ if(ShotFlag[i]==0) { //当たり判定 if( ( ( ShotX[i] > EnemyX && ShotX[i] < EnemyX + EnemyW ) || ( EnemyX > ShotX[i] && EnemyX < ShotX[i] + ShotW ) ) && ( ( ShotY[i] > EnemyY && ShotY[i] < EnemyY + EnemyH ) || ( EnemyY > ShotY[i] && EnemyY < ShotY[i] + ShotH ) ) ) { //接触している場合は弾の存在を消す ShotFlag[i]=0; } } } ScreenFlip(); if(ProcessMessage()<0)break; if(CheckHitKey(KEY_INPUT_ESCAPE))break; } DxLib_End(); return 0; }