★弾をどう管理しているのでしょうか?
>画面に出力することはできたのですが、ななめに飛ぶ弾だけ判定できずに困っています。
↑
弾の座標が判定したい座標と違うから上手く判定できていないように思います。
弾の当たり判定は何時呼び出しますか?
普通は弾が移動した後で判定しますが…。
※自機、自機弾、敵機、敵機弾の移動タイミングは同じですか?
・ソースを見ましたが良く分かりません。
当たり判定は次の4パターンあります。
(1)『自機の移動』と『敵機/敵機弾』の当たり判定
(2)『敵機の移動』と『自機/自機弾』の当たり判定
(3)『自機弾の移動』と『敵機』の当たり判定
(4)『敵機弾の移動』と『自機』の当たり判定
これを上手に判定するには自機、自機弾、敵機、敵機弾を1つのオブジェクトとして
管理します。そうすれば当たり判定を1つの共通な関数に出来て便利なのですが。
ソースを見た感じ違う構造のようですね。
斜めだけ判定できないということはY座標がずれているのかも。
当たり判定の関数を整理した方が良いでしょう。
まず次の関数を用意します。
(1)自機本体との衝突チェック⇒int JikiCheck(x,y,w,h)
(2)自機弾丸との衝突チェック⇒int JikiShotCheck(x,y,w,h)
(3)敵機本体との衝突チェック⇒int EnemyCheck(x,y,w,h)
(4)敵機弾丸との衝突チェック⇒int EnemyShotCheck(x,y,w,h)
これらの関数は与えられた引数(x,y,w,h)より衝突すれば 1 を返す仕様です。
この4つの関数を用意したら自機などが移動した時の当たり判定を作ります。
(1)『自機の移動』と『敵機/敵機弾』の当たり判定⇒void JikiCrash()
(2)『敵機の移動』と『自機/自機弾』の当たり判定⇒void JikiShotCrash()
(3)『自機弾の移動』と『敵機』の当たり判定⇒void EnemyCrash()
(4)『敵機弾の移動』と『自機』の当たり判定⇒void EnemyShotCrash()
この4つは上記の Check 関数を呼び出して当たり判定します。
例えば(1)なら次のようになります。
サンプル:
// 『自機の移動』と『敵機/敵機弾』の当たり判定
void JikiCrash( void )
{
// 自機と敵機の判定
for ( int i = 0 ; i < 50 ; i++ ){
if ( TekiData[i].life > 0 ){
int x = TekiData[i].x;
int y = TekiData[i].y;
int w = TekiData[i].image_w;
int h = TekiData[i].image_h;
if ( EnemyCheck(x,y,w,h) ){
// 衝突処理
}
}
}
// 自機と敵機弾の判定
for ( int i = 0 ; i < 50 ; i++ ){
if ( TekiTama[i].life > 0 ){
int x = TekiTama[i].x;
int y = TekiTama[i].y;
int w = TekiTama[i].image_w;
int h = TekiTama[i].image_h;
if ( EnemyShotCheck(x,y,w,h) ){
// 衝突処理
}
}
}
}
このように関数を整理して作り上げればバグも入りにくくなります。
本当なら自機、自機弾、敵機、敵機弾の座標だけを共通に管理する方法を考え
作り直せば当たり判定もスッキリ出来ます。時間があれば全ソースを見直して
シューティング・ゲームの設計をやり直すべきです。本当はね。
もう随分と作りこんでいるのでバグを見つけるのが大変です。
IsAtari関数が多分原因ではないかと推測します。
頑張って下さい。
投稿日時 - 2008-02-25 12:59:31