ページ 11

STG当たり判定について

Posted: 2011年12月29日(木) 19:15
by 友ダチ
今、インベーダーゲームを作っているのですが、初心者なもので、エラーというかわからないところが出たので質問したいと思います。
まず、コードは

コード:

#include "DxLib.h"

typedef struct CharaData{
	int x;
	int y;
	int color;
	int life;
	int image_w;
	int image_h;
	int bounds_w;
	int bounds_h;
}CharaData;


void JitamaMove();
void TekiMove();
int IsAtari(CharaData,CharaData);
int AtariHantei();

CharaData jikidata;
CharaData tekidata[7][5];
CharaData jitama[3];
CharaData tekitama;

int trigger = 0;
int Ttrigger = 40;
int counter = 0;
int flag = 1;




int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
			jikidata.color = GetColor(255,255,255);
			jikidata.x = 320;
			jikidata.y = 450;
			jikidata.image_w = 20;
			jikidata.image_h = 20;
			jikidata.bounds_w = 20;
			jikidata.bounds_h = 20;
			
			for(int i=0;i<3;i=i++){
				jitama[i].color = GetColor(255,0,255);
				jitama[i].image_w = 4;
				jitama[i].image_h = 10;
				jitama[i].bounds_w = 4;
				jitama[i].bounds_h = 10;
			}
			for(int i=0;i<7;i++){
				for(int j=0;j<5;j++){
					tekidata[i][j].life = 1;
					tekidata[i][j].color = GetColor(0,0,255);
					tekidata[i][j].x = 20+i*40;
					tekidata[i][j].y = 10+j*30;
					tekidata[i][j].image_w = 30;
					tekidata[i][j].image_h = 15;
					tekidata[i][j].bounds_w = 30;
					tekidata[i][j].bounds_h = 20;
				}
			}



        // while( ESCキー処理, メッセージ処理 )
        while( CheckHitKey(KEY_INPUT_ESCAPE) == 0  && ProcessMessage()==0){
			ClsDrawScreen();

			int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
			if(key & PAD_INPUT_UP)	  jikidata.y = jikidata.y-4;	
			if(key & PAD_INPUT_DOWN)  jikidata.y = jikidata.y+4;
			if(key & PAD_INPUT_LEFT)  jikidata.x = jikidata.x-4;
			if(key & PAD_INPUT_RIGHT) jikidata.x = jikidata.x+4;
			DrawBox(jikidata.x,jikidata.y,jikidata.x+20,jikidata.y+20,jikidata.color,TRUE);


			JitamaMove();
			TekiMove();
			if(AtariHantei() == 1) break;

			ScreenFlip();
        }
        
        DxLib_End(); // DXライブラリ終了処理
        return (0);
} 

void JitamaMove(){
	int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
	if( (key & PAD_INPUT_A) && (trigger == 0) ){
		for(int i=0;i<3;i++){
			if(jitama[i].life == 0){
				jitama[i].life = 1;
				jitama[i].x = jikidata.x+8;
				jitama[i].y = jikidata.y+2;
				break;
			}
		}
		trigger = 20;
	}
	if(trigger > 0) trigger = trigger-1;

	//jitama移動
	for(int i=0;i<3;i=i+1){
		if(jitama[i].life > 0){
			jitama[i].y =jitama[i].y - 2;
			DrawBox(jitama[i].x,jitama[i].y,jitama[i].x+4,jitama[i].y-10,jitama[i].color,TRUE);

			if(jitama[i].y < 0) jitama[i].life = 0;
		}
	}
}


void TekiMove(){
	if(counter == 8) flag = 0;
	if(counter == 0) flag = 1;
	if(Ttrigger == 0){
		for(int i=0; i<7; i++){
			for(int j=0; j<5; j++){
				if(flag == 1) tekidata[i][j].x = tekidata[i][j].x+40;
				if(flag == 0) tekidata[i][j].x = tekidata[i][j].x-40;
			}
		}
	Ttrigger = 40;
	if(flag == 1) counter++;
	if(flag == 0) counter--;
	}
	if(Ttrigger > 0) Ttrigger--;

	for(int i=0; i<7; i++){
		for(int j=0; j<5; j++){
			if(tekidata[i][j].life == 1){
				DrawBox(tekidata[i][j].x,tekidata[i][j].y,tekidata[i][j].x+30,tekidata[i][j].y+10,tekidata[i][j].color,TRUE);
				

			}

		}
	}


}


int IsAtari(CharaData a, CharaData b){
	int retval = 0;
	int ax1 = a.x + (a.image_w - a.bounds_w)/2;
	int ay1 = a.y + (a.image_h - a.bounds_h)/2;
	int ax2 = a.x + (a.image_w + a.bounds_w)/2;
	int ay2 = a.y + (a.image_h + a.bounds_h)/2;
	int bx1 = b.x + (b.image_w - b.bounds_w)/2;
	int by1 = b.y + (b.image_h - b.bounds_h)/2;
	int bx2 = b.x + (b.image_w + b.bounds_w)/2;
	int by2 = b.y + (b.image_h + b.bounds_h)/2;
	
	if( (ax1<bx2) && (bx1<ax2) && (ay1<by2) && (by1<ay2) ){
		retval = 1;
	}
	return(retval);
}


int AtariHantei(){
	for(int i=0; i<7; i++){
		for(int j=0; j<5; j++){
			if(tekidata[i][j].life>0){
				//自機と敵の判定
				if(IsAtari(jikidata, tekidata[i][j])==1) return (1);
				//弾と敵の判定
				for(int p=0;p<3;p++){
					if(IsAtari(jitama[p], tekidata[i][j]) == 1){
						jitama[p].life = 0;
						tekidata[i][j].life = 0;

					}
				}
					
				}
		}
	}
	return(0);
}
です。(グチャグチャですみません!!)

これを、実行すると敵に玉があたっとき敵が何匹もきえてしまいます。
当たり判定のところがおかしいのだと思いますが、どこが悪いのかわかりません。
ぜひ、どこがおかしいのか教えていただけると嬉しいです。
お願いします。

Re: STG当たり判定について

Posted: 2011年12月29日(木) 20:48
by non
171行の後に、jitama.lifeが1のときだけチェックするようにifを入れること。

Re: STG当たり判定について

Posted: 2011年12月30日(金) 17:17
by 友ダチ
解決しました。
ありがとうございます。
また、近いうちに質問するかもしれません。