当たり判定・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あなざぁ

当たり判定・・・

#1

投稿記事 by あなざぁ » 10年前

DxLibを使ってます。

シューティングゲームを作ろうと、
今、ゲームプログラミングで当たり判定を勉強中です・・
あるサンプルコードをみながらプログラムを書いているのですが、

こんなプログラムです。

画像を操作し、スペースキーを押すと自機から弾が発射される。
敵は左右をウロチョロしていて、敵に弾が当たるとその弾が消える。
弾は最大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;
			
	}

しりうす~

Re:当たり判定・・・

#2

投稿記事 by しりうす~ » 10年前

存在しない弾の当たり判定しかしてないからじゃないかな。

あなざぁ

Re:当たり判定・・・

#3

投稿記事 by あなざぁ » 10年前

余談ですが、
敵の画像データが「私」となっているのは、
自機の画像を2候補作ったので、片方余ったからです。
(あまり気にしないでください)

あなざぁ

Re:当たり判定・・・

#4

投稿記事 by あなざぁ » 10年前

本当ですね!!

すみません。くだらない失敗で・・・(汗)


できました。本当にありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る