【STG】敵弾の当たり判定が画像と同期しない不具合について

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

【STG】敵弾の当たり判定が画像と同期しない不具合について

#1

投稿記事 by cosin » 15年前

ただいま「龍神録プログラミングの館」を参考に、初めてのプログラミング勉強として横スクロールシューティングを、C/C++言語とDXライブラリ、Visual Studio 2008を用いて製作しております。ただいま製作しているプロジェクトに取り掛かりまして一月が経ち、自機と敵弾の当たり判定まで差し掛かりました。

しかし、この敵弾の当たり判定を行う際に不具合が出てしまい、10日ほど思い悩んでしまっているために今回質問を投稿させていただきました。

その不具合というものが、『敵弾の当たり判定矩形が全て、敵弾画像と違った一定地点から射出され、左上45°か右下45°の角度にしか進まず、弾速もそれぞればらばら』というものです。

龍神録を参考としたため、ソースコードのほとんどの基本構造は龍神録と同様のものになっており、異なる点は関数名と座標指定、座標成分を用いた矩形判定を行っている程度のもので、両者にさほど大きな違いはありません。



参考までに、ほとんどの当たり判定はこのような記述方法と同様のもので行っております。画像の中心点座標を始点に左上頂点座標と右下頂点座標を求めて矩形を作り、座標成分による判定を行うというものです。

//===============================================
//■敵弾の当たり判定範囲
// ※左上座標 (eneshot.enebullet[n].x+A, eneshot.enebullet[n].y+B)
// ※右下座標 (eneshot.enebullet[n].y+C, eneshot.enebullet[n].y+D)
//===============================================
int enebullet_range_A[ENEBULLET_RANGE_MAX]={
-5, //bul_knd 0 敵通常弾
-100,
-100,
-100
};
int enebullet_range_B[ENEBULLET_RANGE_MAX]={
-5,
-100,
-100,
-100
};
int enebullet_range_C[ENEBULLET_RANGE_MAX]={
5,
100,
100,
100
};
int enebullet_range_D[ENEBULLET_RANGE_MAX]={
5,
100,
100,
100
};
//===============================================
//■自機の当たり判定範囲 ※左上(ch.x+A,ch.y+B) ※右下(ch.x+C,ch.y+D)
//===============================================
int ch_range_A =-8; int ch_range_B =-10;
int ch_range_C =20; int ch_range_D =20;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//===============================================
//■敵弾と自機との当たり判定をする関数
//===============================================
int out_judge_eneshot(int s,int n){
if(eneshot.enebullet[n].cnt>0){//敵弾の軌道が一度でも計算されていたら
//◇敵弾・当たり判定矩形◇
double x1 =eneshot.enebullet[n].x+enebullet_range_A[eneshot.enebullet[n].bul_knd];
double y1 =eneshot.enebullet[n].x+enebullet_range_B[eneshot.enebullet[n].bul_knd];
double x2 =eneshot.enebullet[n].x+enebullet_range_C[eneshot[s].enebullet[n].bul_knd];
double y2 =eneshot[s].enebullet[n].x+enebullet_range_D[eneshot[s].enebullet[n].bul_knd];
//◇自機・当たり判定矩形◇
double x3 =ch.x+ch_range_A;
double y3 =ch.y+ch_range_B;
double x4 =ch.x+ch_range_C;
double y4 =ch.y+ch_range_D;
//◇オーバーフロー対策
if(eneshot[s].enebullet[n].bul_knd>=ENEBULLET_RANGE_MAX)
printfDx("out_judge_chshot_ground関数内オーバーフロー\n");
//◇当たり判定内なら
if(x1<x4 && x3<x2 && y3<y2 && y1<y4)
return 1;//当たり
}
return 0;
}




当初は、敵弾情報を受け渡しするポインタを用いていない事による、変数値の不具合かと思い手直しをしたのですが、座標成分を用いた矩形判定に有用性を見出すことが出来ず、また龍神録と同様の使用法で変数を用いているため結果的に変わらず、上手く解決することが出来ませんでした。

この問題で10日ほど悩みながら何度も手直しを行いましたが、原因・解決法がどうやら自分一人では気づくことの出来ないところにあるようです。そこで皆様にお願いがあるのですが、もしよろしければお力添えを頂けないでしょうか。

ソースコードは龍神録と同様の構造をとっており、一口にソースコードを記述することが難しいため、大変恐縮ですがアップローダーに上げたファイルとさせて頂きました。

ソースコードファイルURL:
http://www1.axfc.net/uploader/Ne/so/92698.zip&key=cosin

大変お手数をお掛けしますが、何か気になる点やアドバイスなど頂けると大変嬉しいです。よろしくお願いいたします。 画像

ideyan

Re:【STG】敵弾の当たり判定が画像と同期しない不具合について

#2

投稿記事 by ideyan » 15年前

ソース見ずに貼りつけてある関数だけ見て答えてます。
(ソースでは修正済みとかだったらごめんなさいね)

>double y1 =eneshot.enebullet[n].x+enebullet_range_B[eneshot.enebullet[n].bul_knd];
>double y2 =eneshot.enebullet[n].x+enebullet_range_D[eneshot.enebullet[n].bul_knd];

上記の部分ですが
eneshot.enebullet[n].y
ではないですか?

fatens

Re:【STG】敵弾の当たり判定が画像と同期しない不具合について

#3

投稿記事 by fatens » 15年前

ideyanさんが指摘されているところと、out.cppの150,152行目にも同様のミスがありますね。

cosin

Re:【STG】敵弾の当たり判定が画像と同期しない不具合について

#4

投稿記事 by cosin » 15年前

ありがとうございます、解決いたしました。

こんな、こんな初心者にさえもあるまじき、至極初歩的なタイプミスにさえ気づかずに10日間も過ごしてしまったことが恥ずかしいです……。

……自己解決能力が非常に低いのでしょうか?
これは本当に恥ずかしい……。非常に悔しいです。

丁寧なご指摘、本当にありがとうございました。精進いたします。 画像

閉鎖

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