当たり判定の処理がわかりません。
CとDXライブラリでSTGを作っているのですが、あたり判定がわかりません。前、斜め右上、斜め右下の3方向に飛ぶ弾の処理を行いたいのですが、どうすればいいのでしょうか?
画面に出力することはできたのですが、ななめに飛ぶ弾だけ判定できずに困っています。
―――――――――ソースの一部―――――――――――
//拡散する弾
void JitamaMove2(){
//弾の発射
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+24;
jitama[i].y = jikidata.y+8;
jitama[i].y1 = jikidata.y+8;
jitama[i].y2 = jikidata.y+8;
float dy = jikidata.y;
float d = sqrt(dy*dy);
jitama[i].yobi = dy/d*idouryou[4]*10;
break;
}
}
trigger = 20;
}
if(trigger>0) trigger = trigger - 1;
//弾の移動
for(int i=0; i<3; i=i+1){
if(jitama[i].life > 0){
jitama[i].x = jitama[i].x + idouryou[10];
DrawGraph(jitama[i].x, jitama[i].y,*(jitama[i].ghandle), TRUE);
float idouy = (float)jitama[i].yobi / 10;
jitama[i].y2 = jitama[i].y2 - idouy;
DrawGraph(jitama[i].x, jitama[i].y2 - 10, *(jitama[i].ghandle), TRUE); //斜め下に対する弾の描写
jitama[i].y1 = jitama[i].y1 + idouy;
DrawGraph(jitama[i].x, jitama[i].y1 + 10, *(jitama[i].ghandle), TRUE); //斜め上に対する弾の描写
//画面外に出たときの処理
if(jitama[i].x>640) jitama[i].life = 0;
}
}
}
/*当たり判定を計算する関数*/
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) ){
switch (a->amode){
case A_NORMAL: //キャラ消滅
a->life = 0;
break;
case A_HARD: //耐久力-1
a->life = a->life -1;
break;
}
switch (b->amode){
case A_NORMAL: //キャラ消滅
b->life = 0;
break;
case A_HARD: //耐久力-1
b->life = b->life -1;
if(b->life > 0) SetHanten(b->x, b->y, b->image_w, b->image_h);
break;
}
if(b->life == 0) SetBakuen(b->x, b->y);
retval = 1;
}
return(retval);
}
//当たり判定の処理
int AtariHantei(){
for(int i=0; i<50; i=i+1){
if(tekidata[i].life > 0 && tekidata[i].amode != A_GHOST){//A_GHOS・・・判定なし
//自機と敵の判定
if(IsAtari(&jikidata, &tekidata[i])==1) return(1);
//弾と敵の判定
for(int j=0; j<3; j=j+1){
if(jitama[j].life > 0 && jitama[j].amode != A_GHOST){
IsAtari(&jitama[j], &tekidata[i]);
}
}
}
}
for( int i = 0; i < 50; i++ ){
if(tekitama[i].life > 0){
if(IsAtari(&jikidata, &tekitama[i]) == 1) return(1);
}
}
return(0);
}
お礼
回答ありがとうございます。 初心者質問ですいませんが 現在のフレームラベルがstage001playからstage001cに移動し あたるインスタントがhiyoとgoal001だとすると stage001play stop(); // 1フレーム進む時間毎に随時実行する関数を A_mc に定義 stage001play.hiyo.onEnterFrame = function() { // もし この A_mc が B_mc と当たったら if (this.hitTest(_root.goal001)) { // _root を フレームラベルあいうえお に進めて再生 stage001play.gotoAndPlay("stage001c"); // この1フレーム進む時間毎に随時実行する関数を削除 delete stage001play.hiyo.onEnterFrame; } }; でいいはずですよね? なぜできないんでしょうか。 そもそもフレームラベルが移動したいフレームラベルの外にあるからでしょうか その場合はどう書けばよろしいのでしょうか?
補足
すいません 自己解決しました。 本当にありがとうございましたッ!