2013/12/13(金) [n年前の日記]
#3 [game] 地形アタリの処理でもやもや考え始めてしまったり
_2Dアクションゲームの簡易衝突判定入門 - 土屋つかさのテクノロジーは今か無しか
という記事を読んで、「そういや自分はどうやって実装してたかな…」と記憶を辿り始めてしまったり。
◎ 今もメリットはあるような気がする。 :
件の記事中にあるように、2Dゲームの地形アタリ判定は…。
一見すると、今時は後者がクールなようにも思えるのだけど。前者も前者で、おそらくメリットがあって。地形アタリにかかる処理時間が、比較的安定してるというか。
プレイヤーキャラぐらいしか地形アタリを取らない、という状態なら、別にどっちでやっても処理時間なんてたいした違いはないだろうと思うのだけど。
しかし、例えば、画面内に雑魚敵がワラワラと出てきて、それら全てが、各々勝手に、地形アタリを取らなきゃいけない、なんて時は…。
そんな時は、マップのコードを見てアタリを取る方法のほうが、最悪の場合でも処理時間がこのぐらいで済む、と見通せる状態になるような気がしていて。たぶんこのあたり、ソートアルゴリズムの、「最悪計算時間」「平均計算時間」みたいなものが、地形アタリ処理にもあるんじゃないかと。地形アタリを取る敵の数が増えれば増えるほど、処理時間のグラフが急角度になる、そういう処理もありそうで。その点、マップのコードを見ていくやり方は、最悪でも比例グラフになりそうかなと。
てなわけで、自分もこのへん、もう一度処理を書いてみて、復習?しておかないといかんなあ、と思えてきたのでした。
- ファミコン時代によくやってたように、タイル? チップ? セル? で構成された、BGマップ上のコードを取得して地形アタリを取る方法。
- 複数のポリゴンを地形の形に配置して、地形アタリを取る方法。
一見すると、今時は後者がクールなようにも思えるのだけど。前者も前者で、おそらくメリットがあって。地形アタリにかかる処理時間が、比較的安定してるというか。
プレイヤーキャラぐらいしか地形アタリを取らない、という状態なら、別にどっちでやっても処理時間なんてたいした違いはないだろうと思うのだけど。
しかし、例えば、画面内に雑魚敵がワラワラと出てきて、それら全てが、各々勝手に、地形アタリを取らなきゃいけない、なんて時は…。
そんな時は、マップのコードを見てアタリを取る方法のほうが、最悪の場合でも処理時間がこのぐらいで済む、と見通せる状態になるような気がしていて。たぶんこのあたり、ソートアルゴリズムの、「最悪計算時間」「平均計算時間」みたいなものが、地形アタリ処理にもあるんじゃないかと。地形アタリを取る敵の数が増えれば増えるほど、処理時間のグラフが急角度になる、そういう処理もありそうで。その点、マップのコードを見ていくやり方は、最悪でも比例グラフになりそうかなと。
てなわけで、自分もこのへん、もう一度処理を書いてみて、復習?しておかないといかんなあ、と思えてきたのでした。
◎ 実験用マップを作成中。 :
処理を書くためには、実験用マップが必要になるので、EDGE2 でBGアタリ画像を描いて、Tiled で配置。コレを使って、処理を書いて実験しようかと。
作業してるうちに、少しずつ思い出してきた。たしか、昔やったソレは、床、壁、天井、ジャンプで乗れる足場、ぶら下がる棒、その他モロモロに、それぞれ別コードを割り当てていたような気がする。
たしか、自分が上手く実装できなくて悩んでたら、絵描きさんのほうから、「以前やった企画では、こういうBGアタリにして解決してたから、言ってくれれば、その作業をやるよ?」と助け舟を出してもらえて。そのお言葉に甘えさせてもらった上に、こっちはますます調子に乗って、アタリのコード種類をやたらと増やしちゃった…そんな記憶も。
たしか、壁登りを始めるとか、壁登りと天井ぶら下がりを切り替えるとか、そういう判別のために、床・壁・天井の境界のところに小さい三角を入れて、その三角にも、それぞれ異なる別コードを割り当てていたような…。
当時のハードは非力だった上に、バンバン敵を出して、ガンガン弾を撃って、バカスカやっつけるゲームにすることを前提にしてたから、1クロックでも稼ぎたくて、やたらと特殊処理用のコードをマップに入れてもらってた…ような気がするけどどうだったかなあ。
だけど今のハードなら、プログラム側で、その周辺の複数のコードを見て、そこにある地形アタリは本来どういう属性なのか、判別することができそうだなと。地形アタリのコード種類も、最低限で済みそうな気がする。
あるいは、事前にマップを走査して、元から持っている地形コードを、ゲーム中の処理に適したコードに変換して上書きする、なんてこともできそうな気もしたり。
作業してるうちに、少しずつ思い出してきた。たしか、昔やったソレは、床、壁、天井、ジャンプで乗れる足場、ぶら下がる棒、その他モロモロに、それぞれ別コードを割り当てていたような気がする。
たしか、自分が上手く実装できなくて悩んでたら、絵描きさんのほうから、「以前やった企画では、こういうBGアタリにして解決してたから、言ってくれれば、その作業をやるよ?」と助け舟を出してもらえて。そのお言葉に甘えさせてもらった上に、こっちはますます調子に乗って、アタリのコード種類をやたらと増やしちゃった…そんな記憶も。
たしか、壁登りを始めるとか、壁登りと天井ぶら下がりを切り替えるとか、そういう判別のために、床・壁・天井の境界のところに小さい三角を入れて、その三角にも、それぞれ異なる別コードを割り当てていたような…。
当時のハードは非力だった上に、バンバン敵を出して、ガンガン弾を撃って、バカスカやっつけるゲームにすることを前提にしてたから、1クロックでも稼ぎたくて、やたらと特殊処理用のコードをマップに入れてもらってた…ような気がするけどどうだったかなあ。
だけど今のハードなら、プログラム側で、その周辺の複数のコードを見て、そこにある地形アタリは本来どういう属性なのか、判別することができそうだなと。地形アタリのコード種類も、最低限で済みそうな気がする。
あるいは、事前にマップを走査して、元から持っている地形コードを、ゲーム中の処理に適したコードに変換して上書きする、なんてこともできそうな気もしたり。
◎ 余談。ポリゴンで地形アタリをとる方法について。 :
ググってたら、とても丁寧に解説してくれてる記事と遭遇。
_2D当たり判定超入門 (PDF)
_すべての講演資料 - 全日本学生ゲーム開発者連合(全ゲ連)資料置き場
素晴らしい…。そのうち、この資料を元にして、自分もこの方式の地形アタリ処理を試してみたい気分になってきたり。ありがたや。
_2D当たり判定超入門 (PDF)
_すべての講演資料 - 全日本学生ゲーム開発者連合(全ゲ連)資料置き場
素晴らしい…。そのうち、この資料を元にして、自分もこの方式の地形アタリ処理を試してみたい気分になってきたり。ありがたや。
[ ツッコむ ]
以上です。