衝突判定高速化 ステージ区画分け
現在習作として作成しているピンボールゲームでは、ステージを一定のサイズに区画分けし、オブジェクト同士の衝突判定の高速化を図ることを考えております。
以前書きました「ブロック崩し衝突判定の高速化のために」のエントリーの応用のような感じを採ります。
【 サンプル 】
ステージは一定の区画に区切っています。サンプルでは線や円が位置する区画を青く表示しています。各点はドラッグ&ドロップが可能です。
ボールが衝突する壁は、サンプルにあるような青点同士を結ぶラインオブジェクトを複数組み合わせて作成する予定です。複雑な形状の壁にする場合、それだけラインの数は多くなります。ラインが増えれば増えるほど、ボールが一フレーム移動するたびにどのラインと衝突しているかを調査する処理行数はかさみ、ゲーム速度はどんどん落ちてしまいます。
単純な形状の背景ですとどうも面白みがでないと思いますので、なんとか複雑に寄れ曲がり入れ組んだ背景にしたいものです。
ここで、まず画面を一定のサイズの区画に切り分けることを考えます。そして、背景となるオブジェクトがどの区画に位置しているかをあらかじめ区画一覧Aに登録しておきます。背景オブジェクトがどの区画に位置しているかをビジュアライズしたものがサンプルのFlashとなります。
次に、ボールの座標から現在ボールが位置する区画を求め、区画一覧A内から同じ区画内に存在する背景オブジェクトを取得します。ボールは取得した背景オブジェクトとだけ衝突判定を行えばよいので、画面全ての背景オブジェクトと衝突判定は行わずに済むことになります。
背景オブジェクトの数が多く、尚且つ背景オブジェクトは移動しない場合に、区画分けの衝突判定は有効になってきます。処理速度がでない携帯端末などでは特に効果を発揮するのではないでしょうか。(FlashLite2.0を視野に)
ただし、背景オブジェクトが移動すると、背景オブジェクト自身の現在位置している区画がどこなのかを1フレームごとに更新しなくてはならなくなり、処理速度はそのぶん遅くなります。
また最初に、区画ごとのたくさんの背景オブジェクト一覧を作成することになるので、区画を細かくしすぎるとメモリを結構消費してしまいます。
Flash-japanにて、丁度同じものを作ろうとされている方がおりました。
>直線と格子の交点を1つ1つ求めていけばいけそうではありますが、
>処理が複雑になりそうです。また、交点の座標を求める必要はないので、
>もっと簡単な方法があるのではないかと考えています。
ううむ、まさに私はこの処理を行ってしまっております。確かにもっといいアルゴリズムはないかなあと考えておりました。もっといい方法があるのであれば、背景オブジェクトが都度移動しても更に高速衝突判定処理を行うことができそうです。