ある程度のサイズの当たり判定を自動生成について

どうも!Senkokusyaです。
ガッチガチの技術系の記事になります~

では本題へ。
皆さん、ゲーム制作。してますか?
2Dゲームを作るうえで避けては通れない道。

『マップチップ』

RPGやSTG、固定画面のゲームなど様々なところで用いられる手法ですが、今回は"CSV"ファイルのマップチップに限定して、話を進めていきます。

始めに、これを使おうと思った経緯から。

例えばこれ。ポケモンブラックのある場面。

画像1

この作品は、現在プレイヤーがいる草むらに入ると一定条件でポケモンが飛び出してくる。つまり、草むらに当たり判定をもたせなければならない。

大体の人は初めに

『マップチップ一つ一つに四角の当たり判定を持たせる』

と考えるであろう。しかし、それではとても重くなってしまう。

今ある画面内でも40個以上の当たり判定を所持しなければならない。それでは重すぎる。ではどうするべきか。
それは

『草むら全体を一つの当たり判定で覆ってしまえばいい』

のである。

今プレイヤーがいる草むらは多少独特な形をしているため、1つとは言えないが、2つの四角で当たり判定を作成することができるのである。

では、プログラムのアルゴリズムに入っていく。
ここではあくまで左上がXY座標ともに最小値、右下がXYともに最大値として考えていく。
また、マップチップの読み込み方法として様々な手法があるが、今回はCSVファイルを横に見ていく
(Y1行目X最小値→Y1行目X最大値→Y2行目のX最小値・・・)とみていくこととする。

ステップとしては簡単。

①Xの最小値を保存する。
②Xの最大値を保存する。
③Yの最大値を保存する。
(④Xを最初の値に戻す。)

1つの四角に対してこの4ステップで完了することができる。
Yの最小値は?と聞かれそうだが、Yの最小値はXの最小値と同様の場所がYの最小値となる。

プログラムチックに書くとするならこうだ。
①もし、草むらがあったらそのXY座標を保存する。
②そのまま読み込んでいき、もし要素が草むら以外になったら現在のX要素-1の場所をX最大値として保存する。
③[①]の場所に戻り、今度は縦に見ていく。Y座標だけを更新していき、草むら以外となったら、現在のY要素-1の場所をY最大値として保存する。
④最初に戻り、読み込んだところは再度読み込まない処理とする。

こうすることで、上の草むらは下のように当たり判定を作成することができる。

画像2

こうすることで処理を軽減することができる。

最後にこの手法のデメリットを提示して終わろう。
一つ目は、複雑な地形には使えないこと。
元から1マスしかない場所の当たり判定や、星型、丸形などの複雑な地形には向かない。無駄な処理が多くなってしまうからだ。
そのため、上記のような形に対しては従来通り1マス1箱の当たり判定を持たせるべきだと思う。もしくは、そもそもそういった地形を作らない。という点もある。

2つ目は純粋に処理が重いという点である。
つい先日浮かんだアルゴリズムのため、精査がまだできておらず、プログラムで書くとおそらく3重の入れ子構造となってしまうだろう。なので、これから精査していきたいと思う。

以上。


終了!急に堅苦しい記事になってゴメンね!
昨日は疲れて寝ちゃったから許して…
ではでは。



追加(2021/11/30)
上のプログラムを再帰関数を用いて作成することに成功しました!
これによりカードがかなりみやすくなりました。


いいなと思ったら応援しよう!