ミスの壁@シューティング

おはようございます。

さて、昨日言ったとおり、当たり判定に取り組みたいというわけで、
まずは敵弾の当たり判定を表示させましょう・・・


と、進んだ先に落とし穴が。


機体などを画面描画する関数にたくさん処理を書いているのですが、ある時突然警告とエラーの嵐が。
〜〜は再定義〜、{の前に;が必要ですなどなどたくさん。
; 忘れか { の書き忘れだと思ったのですが、なかなか見つからず。躓きました。


解消しましたが、こわいこわい。


気を取り直して、当たり判定に取り組みましょう。
まず、敵弾に当たり判定用の円や四角の構造体を持たせます。
デバッグ用の関数もこの構造体に対応しているので、デバッグしやすいですね。



ここで少し悩みました。
敵弾の座標の持ち方ですが、
そのまま描画すると、座標を左上に画像を描画してしまいます。
うーむ、基準をどこに持とうか。。。
結局、画像の中心を基準にすることにしました。

構造体生成処理での座標計算を修正して・・・
機体と弾の描画も統一して〜と。
よし。

こんな感じです。
弾が異常にでかいのは気にしないでくださいw
素材が大きいだけですOrz


さて、問題はここから〜
まず、自弾と敵を当てましょう。

ええと、参考資料によると・・・x座標とy座標の差分を取って・・・
言葉で言いにくい。。。Σ(゚ロ゚;
コードみたほうがわかりやすいかもしれないですね。

double sub_x = enemies[j].pos.x - bullets[i].pos.x;//x座標差分
double sub_y = enemies[j].pos.y - bullets[i].pos.y;//y座標差分
double range = sqrt(((sub_x * sub_x) + (sub_y * sub_y))); 
double limit_range = bullets[i].hit_circles[0].radius + enemies[j].hit_circles[0].radius;
if(range < limit_range){
    printfDx("<当たった!>x:%.1f y:%.1f limit:%.1f 距離:%.1f\n",sub_x,sub_y,limit_range,range);
    enemies[j].enable = false;//処理対象から外す
    bullets[i].enable = false;
}

はい。双方の当たり判定圏内が重なれば、弾と敵を処理対象からはずします。
=消しちゃいます。

というわけで、できました!
少しわかりづらいですが、当たった!というログが流れて敵が消えました。

よし、このまま続けていこう。

GoogleCodeにコミットしておやすみなさぁい。

追伸:topcoderってサイトご存知でしょうか。JavaC++のコードを書いてコンテストの様なものがで開かれているらしいのです。
サンプルや練習用課題的なものがあるみたいです。
よーし、なんだかよくわからないけど、やってみよう。