まず、コードは
#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);
}
これを、実行すると敵に玉があたっとき敵が何匹もきえてしまいます。
当たり判定のところがおかしいのだと思いますが、どこが悪いのかわかりません。
ぜひ、どこがおかしいのか教えていただけると嬉しいです。
お願いします。