こんばんわ。
現在、スマホのアクションゲームを製作しております。
敵の落下判定をさせるため、敵が床に当たっているかどうかという当たり判定を付けたいのですが、処理が重くなってしまい、参っています。セルを実装し、二次元配列を使用し、以下のようにしていますが、この方針でそもそも大丈夫でしょうか?
-----------------------------------------[現在の大まかなやり方]--------------------------------------------
セルのx,y方向の大きさを決め、二次元配列のフィールドを作り、敵にセル情報をもたせる。しかし、敵が少しだけ動いた場合、セルが一つだけだと、そのセルからずれてしまい、当たっているのに当たっていないといった事が起きるため、敵の基本のセルから以下の図のように、8方向にもセルを持たせる。
■ ■ ■
■ □ ■
■ ■ ■
また、敵が1セルより大きい場合に困ってしまうため、予め画像サイズを取得し、そのサイズを見て割り当てるセルを増やすようにする。
if(sizex <= cellsize_x && sizey <= cellsize_y) else if(sizex <= cellsize_x * 2 && sizey <= cellsize_y * 2)
■ ■ ■ ■ ■ ■ ■
■ □ ■ ■ □ □ ■
■ ■ ■ ■ □ □ ■
■ ■ ■ ■
(これを、プレイヤー、敵、足場 にそれぞれに保有させる)
そして、このセルがフィールドのどこにあるか?という情報を、フィールド二次元配列の対応した場所に持たせ、もし敵のセルの位置のフィールドセルに足場のセル情報が入っていた場合、そこで当たり判定処理を別の処理で行う。(セルの一致は当たり判定処理をするための条件)
(当たり判定処理は、x,y座標で左上と右下の座標を使い、四角の判定で当たり判定処理をしています)
-----------------------------------------------------------------------------------------------------------------
このような感じなのですが、敵が密集した場合、動作が重くなってしまいます。
大型の敵なら5体もいればカクカクです・・
もしかしたら、方針は合っていて、どこかの処理が甘いだけなのかもしれないのですが、なかなか見つけられずにいて悩んでいたため、一度、此方の掲示板で、皆様のご意見をお聞きしたいと考えた次第です。
宜しくお願いいたします。
アクションゲーム制作で詰まりました
Re: アクションゲーム制作で詰まりました
ご返信ありがとうございます。
仰るとおり、全てチェックしていたようで、範囲を制限することで大分良くなりました。
この度は、本当に有難うございました。
仰るとおり、全てチェックしていたようで、範囲を制限することで大分良くなりました。
この度は、本当に有難うございました。
Re: アクションゲーム制作で詰まりました
とりあえず「(小さい)敵が」1人と「床」だけが存在する状況を例にすると,以下のような話だろうか?
(1)2次元配列の要素(セル)群のうち,
「床」との判定をチェックするのに十分な範囲のセル群にだけ「床と判定しろ」という情報を持たせておく
(2)「敵」の現在座標から,「床」との当たり判定に関して参照すべき3x3=9個のセルの範囲を決定できる.
(3)上記9カ所のセルをチェックし,「床と判定しろ」という情報を持つセルが存在した場合にのみ,「敵」と「床」との当たり判定処理を行う
このような話において,
【9カ所のセルをチェック中に,「床と判定しろ」という情報を持つセルを見つける毎に「床」との衝突判定を行う】
という実装をしたら,最大で9回の衝突判定を行うことになる.
ここで,毎回の衝突判定が全く同じ内容であるしたら,これはかなり無駄な処理になり得る.
もしもそのようなことになっているならば,
【まず9カ所のセルをチェックして判定すべき相手を列挙し,次に列挙された相手との衝突判定を行う】
とすれば速度が多少改善するかもしれない.
(1)2次元配列の要素(セル)群のうち,
「床」との判定をチェックするのに十分な範囲のセル群にだけ「床と判定しろ」という情報を持たせておく
(2)「敵」の現在座標から,「床」との当たり判定に関して参照すべき3x3=9個のセルの範囲を決定できる.
(3)上記9カ所のセルをチェックし,「床と判定しろ」という情報を持つセルが存在した場合にのみ,「敵」と「床」との当たり判定処理を行う
このような話において,
【9カ所のセルをチェック中に,「床と判定しろ」という情報を持つセルを見つける毎に「床」との衝突判定を行う】
という実装をしたら,最大で9回の衝突判定を行うことになる.
ここで,毎回の衝突判定が全く同じ内容であるしたら,これはかなり無駄な処理になり得る.
もしもそのようなことになっているならば,
【まず9カ所のセルをチェックして判定すべき相手を列挙し,次に列挙された相手との衝突判定を行う】
とすれば速度が多少改善するかもしれない.