処理を見ていて理解できる部分も多くなったのですが、敵弾と自キャラの当たり判定の実装の仕方が分かりま
せん。敵との当たり判定の応用というか同じような処理だとは思うのですがイマイチ理解できなくて困っています。
一応自分なりに考えて横シューティングの時は以下のようなこういう処理を作ったのですがサンプルでの縦シューティングではどうすればいいのでしょう?特に弾幕を避けるためプレイヤーの当たり判定が極めて小さいなどの処理とか含めて。分かりにくい質問ですがまとめるとサンプルの縦シューティングの敵弾とプレイヤーの当たり判定の実装方法が聞きたいです。
// ------------------------------------------------
// 敵弾幕とプレイヤーの当たり
// ------------------------------------------------
void EbeamShipHit(void)
{
int i;
for ( i=0; i<EBEAM_MAX; i++ )
{
if(gEbeam.flg==ON)// 敵弾幕が存在していれば
{
if (gEbeam.x+EBEAM_XSIZE > gShip.x && // 敵弾幕の右>プレイヤーの左
gEbeam.x < gShip.x+SHIP_XSIZE &&// 敵ビームの左<プレイヤーの右
gEbeam.y+EBEAM_YSIZE > gShip.y && //敵弾幕の 下>プレイヤーの上
gEbeam.y < gShip.y+SHIP_YSIZE ) //敵弾幕の 上<プレイヤーの下
{
gEbeam.flg = OFF; // 敵弾幕が存在しない
gShip.hp--; // プレイヤーのHP減少
gShip.cnt=1; // プレイヤーをダメージ中に
}
}
}
}
シューティングサンプルプログラムを見たのですが・・・
Re:シューティングサンプルプログラムを見たのですが・・・
弾幕との当たり判定は三平方の定理を利用すればいいですよ!
弾の当たり判定距離を.distか何か構造体に用意しておき、例えば10とか入れておきます。
プレイヤーの当たり判定範囲も.distか何か構造体に用意しておき、例えば15とか入れておきます。
今
(弾.x-プレイヤー.x)*(弾.x-プレイヤー.x) + (弾.y-プレイヤー.y)*(弾.y-プレイヤー.y) < (弾.dist+プレイヤー.dist)*(弾.dist+プレイヤー.dist)
この条件にマッチする時こそ、弾と自機の距離が25以内なのであたったと判定できますよ!
簡単な方法は総当りで判定させていくことですが、弾幕数が多くなってくると総当りで判定していると毎回数十万をこえる比較が必要になってくる場合も多くなってくるので、
もし本格的に作るなら発射した弾は登録して使うなど、工夫してみてください。
弾の当たり判定距離を.distか何か構造体に用意しておき、例えば10とか入れておきます。
プレイヤーの当たり判定範囲も.distか何か構造体に用意しておき、例えば15とか入れておきます。
今
(弾.x-プレイヤー.x)*(弾.x-プレイヤー.x) + (弾.y-プレイヤー.y)*(弾.y-プレイヤー.y) < (弾.dist+プレイヤー.dist)*(弾.dist+プレイヤー.dist)
この条件にマッチする時こそ、弾と自機の距離が25以内なのであたったと判定できますよ!
簡単な方法は総当りで判定させていくことですが、弾幕数が多くなってくると総当りで判定していると毎回数十万をこえる比較が必要になってくる場合も多くなってくるので、
もし本格的に作るなら発射した弾は登録して使うなど、工夫してみてください。
Re:シューティングサンプルプログラムを見たのですが・・・
管理人様ありがとうございます。
もう少し聞きたいのですが実際の処理としてはどの項目にどう組み込めばいいのでしょうか?
その辺も理解に苦しんでいるので大まかな処理を記述していただけるとありがたいのですが・・・
もう少し聞きたいのですが実際の処理としてはどの項目にどう組み込めばいいのでしょうか?
その辺も理解に苦しんでいるので大まかな処理を記述していただけるとありがたいのですが・・・
Re:シューティングサンプルプログラムを見たのですが・・・
すみません、現在なかなかPCが手元にないもので(_ _|||)
関数を呼ぶ場所は最初のうちはどこでもいいと思いますよ。
極端な話、描画した後計算したとしても、次のターンで描画しなおされるわけですから。
判定する関数を一つ作っておき、自分の好きなところからお呼びいただければ大丈夫だと思います。
関数を呼ぶ場所は最初のうちはどこでもいいと思いますよ。
極端な話、描画した後計算したとしても、次のターンで描画しなおされるわけですから。
判定する関数を一つ作っておき、自分の好きなところからお呼びいただければ大丈夫だと思います。