GMS2でレイキャスティングがしたかった

はじめに

まずこの記事には何も答えは書いてない。

だから、あくまでわたくし個人の奮闘録兼勉強のアウトプットとして読んでほしい。

 

コードを書くということ

私は一応はインディーゲームクリエイターに分類される種の人間である。

副業とかではなく同人レベルでやっている。

いまならサマーセールしてるとかと思うので拙作を買うとよい。

f:id:bhaskara:20210207092702p:plain

渋いげーむである

 

 

ところで、このゲームはGMS2*1というゲームエンジンを使って作っている。

このエンジンの特徴は2Dゲーム向けの機能に特化している点。

作りたいゲームがはっきりしていればこの上なく使いやすいツールである。

 

キャベツの千切りを作りたい人に「なんでも出来る高機能調理器具」を渡すよりも、

「スライサー」を渡した方が習得と結果は早かろう。つぶしは効かないかもしれないが。

 

好きなもの

突然だが私はオールドスクールFPSが好きである。

特に疑似3D。DOOMとかBuildエンジンで作られたやつとか。

なんとも言えない外連味に惹かれるのだと思う。

f:id:bhaskara:20200928213345j:plain

こういうの

 

f:id:bhaskara:20210628210513p:plain

こういうの

勿論疑似3DのFPSを作りたい日々を送っていたのである。

 

が、私は特にプログラマーではなく、コードをゲームを作る時に書きはするものの、ifとelseとrepeatぐらいしか使わない。あとswitchか。

分かる人には分かると思うが、for文の使い方を昨日覚えたぐらいのレベルである。

そんなレベルでもGMS2ならsteamにゲームを二本出せるよ!すごいね。

 

そんなときyoutubeである講座を見つけた。

 

www.youtube.com

 

 これである。どうもGMS2で3Dが出来るらしい。

 

やってみた。

 

 

出来た。

 

 

 

 

出来たやんけ。

 

 

これはもうやるしかない。

FPSをGMS2で作るのだ・・・・!

 

 

 出来ること出来ないこと

 

結果として以下のことが出来るようになった。

 

・3Dっぽい表示(カメラにmatrixを適用するとかしないとか)

・立体的な板(ビルボード)の表示

・遠いものは暗くする(これはかんたん)

 

ちなみに高さの概念はあるようであんまりない。

導入可能だが、発展させられない。

 

 

が、ここで壁にぶち当たる。

そう、「壁」である。かべ、カベ、kabe,wall。。。

 

壁が描画できない。

 

 レイキャスティング

ここでレイキャスティングという技術について解説しなくてはなるまい。

レイ(光線)でキャスティング(鋳造?)する技術のことである。

 

以下簡単な説明。

f:id:bhaskara:20210628211941p:plain

自筆図

まずファミコンなどのRPGドラクエなどのマップを思い浮かべてほしい。

自機(〇)が居て、壁がある。

 

自機から視線(ray)を飛ばす。

壁でぶつかる。壁が2m先にある等々の計測をこの視線によって行う。

 

視線を沢山飛ばす。扇形に飛ばす。

これが上から見た視界になる。むかーしのメタルギアのクローンゲームとかを想像すると良い(わかりにくい)

 

そこから得た情報を使って画面を描画する。

遠い壁は小さく。近い壁はでっかく映す。

わぉ!3Dだね。

 

softantenna.com

詳しくはこの記事を。本文は英語だが、ブラウザの翻訳機能で普通に読めるはずだ。

 

更に現役のFPS製作者氏からこんなページも教えてもらった。

www.playfuljs.com

これも翻訳で綺麗に読める。

 

ちなみに氏のゲームはこちら。面白いよ。やれ。

latel88.itch.io

 

こんな感じで壁を描写するのである。

うーん、先駆者たちに感謝。感謝。

んで、これらの知見をもとにやってみた。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

できねえよ。

 

 

 

 

 

 

 

なぜできないのか

私のプログラミング技術が足りないからである。以上。

 

 

 

いやいや、これだと味気ないからもう少し深堀りしよう。

上記の参考サイトにはサンプルコードもあり、環境によっては丸写しで壁が描画されたりするかもしれない。が、私が使うのはGMS2である。

 

結論からいえばGMS2で同じことは出来る。

が、理屈は分かってもGMS2の仕様に合わせて書くということが私には出来ない。

 

 例えば二つ上げた参考サイトのうち、前者はこうDXライブラリでゴリゴリ書くような
?(ふんわり)、そういう書き方っぽい。要はここにメインルーチンを置いて・・・、ここは描画で。。。みたいな?

 

後者はかなりGML(GMS2の独自言語)に近いが、やはりゴリゴリ系なのである。

 

GMS2はオブジェクトにスクリプトを書いていくみたいな感じ。

うーん、説明が難しい。

 

どうしたいのか

こっから割と本題。

まずGMS2でゴリゴリとコードを書いてゲームを作るのもおそらく可能であるが、

それは私には無理だ。

 

ではどのように実装したいのか。

 

GMS2の関数やタイル機能、オブジェクト等々を使って作りたい。

f:id:bhaskara:20210628221640p:plain

赤いのが壁だとする

こんなかんじ?

 

ゲームとしてはcatacomb 3Dみたいな。

 

www.youtube.com

 

マップ情報

まず上記の例だとマップは二次元配列(表)で表現する。

そのマップの座標をもとにレイを飛ばして等するわけだ。

 

が、GMS2はタイルorオブジェクトの配置でグラフィカルにマップを作れる。

この仕様をもとに作りたい。

タイルの情報を取得するみたいな。これは別件で実装済みなので、たぶん出来る。

だが、GMS2のタイル機能とレイキャスティングを組み合わせるとなると途端にややこしく感じる。

 

簡単そうなのがオブジェクトを使ってマップを作る方法。

オブジェクト同士の距離とか角度とかは簡単に測れる。

そのはずなんだけど、レイキャストっぽい感じで取得するというのがなんとも。。。。

 

いや、なんか書いてたら出来る気がしてきたな、、、なんで出来ないんだろ。

 

 GMS2でレイキャストを2Dで実装するような講座はたくさんあるので、

出来るはずなのである。なぜ?なぜ出来ない?

 

あぁ、でも敵のAIを実装するなら配列なりタイルなりから情報読み取った方がよいし、

配列にすれば重くならないだろうし。。。。。

 

おわりに

一応、現状は壁のないFPSを作って八月ぐらいに発表出来ればと思っている。

カニックとしては見下ろし型STG、最近だとエンターザガンジョン?、AREA4643、昔だとガントレットやsmashTVとかみたいな感じであり、そのジャンルは自分も経験があるので勘所は概ね分かる。

 

なのでそういうゲームとして完成はさせられる。

出来ないことはやらない方が良い。

でも、出来たらこのゲームをもっと発展させられる。

 

www.youtube.com

参考例

 

そんなこんなで中身のない記事を読んでいただきありがとうございました。

多分、いつか壁を描画できる日が来るのではないでしょうか。 

 

 

 

 

 

 

 

 

 

*1:アンダーテイルやRisk of Rain、Downwellなどに使われている