ある程度のサイズの当たり判定を自動生成について
どうも!Senkokusyaです。
ガッチガチの技術系の記事になります~
では本題へ。
皆さん、ゲーム制作。してますか?
2Dゲームを作るうえで避けては通れない道。
『マップチップ』
RPGやSTG、固定画面のゲームなど様々なところで用いられる手法ですが、今回は"CSV"ファイルのマップチップに限定して、話を進めていきます。
始めに、これを使おうと思った経緯から。
例えばこれ。ポケモンブラックのある場面。
この作品は、現在プレイヤーがいる草むらに入ると一定条件でポケモンが飛び出してくる。つまり、草むらに当たり判定をもたせなければならない。
大体の人は初めに
『マップチップ一つ一つに四角の当たり判定を持たせる』
と考えるであろう。しかし、それではとても重くなってしまう。
今ある画面内でも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最大値として保存する。
④最初に戻り、読み込んだところは再度読み込まない処理とする。
こうすることで、上の草むらは下のように当たり判定を作成することができる。
こうすることで処理を軽減することができる。
最後にこの手法のデメリットを提示して終わろう。
一つ目は、複雑な地形には使えないこと。
元から1マスしかない場所の当たり判定や、星型、丸形などの複雑な地形には向かない。無駄な処理が多くなってしまうからだ。
そのため、上記のような形に対しては従来通り1マス1箱の当たり判定を持たせるべきだと思う。もしくは、そもそもそういった地形を作らない。という点もある。
2つ目は純粋に処理が重いという点である。
つい先日浮かんだアルゴリズムのため、精査がまだできておらず、プログラムで書くとおそらく3重の入れ子構造となってしまうだろう。なので、これから精査していきたいと思う。
以上。
終了!急に堅苦しい記事になってゴメンね!
昨日は疲れて寝ちゃったから許して…
ではでは。
追加(2021/11/30)
上のプログラムを再帰関数を用いて作成することに成功しました!
これによりカードがかなりみやすくなりました。