人生

やっていきましょう

作品の中でバカゲーを作る計画を建てた。その一環でシューティング要素を追加できないかと考えた。今まで難しそうだからと避けてきたが、ゲームの構造を知る良い機会だと思った。こうしたシューティングはコモンイベント共有サイトで公開されているが、せっかくなので自分で作ることにした。

調べてみると難しい手続きが延々と書かれていて当然理解できなかった。処理が複雑すぎて何がなんだかさっぱりだった。しかし問題というものには大抵要点というものがあり、物事の複雑さというのはその幹から分かれた枝葉末節にすぎない。そこで自分の知能で理解できるレベルにこの問題を落とし込んで整理してみようと考えた。

シューティングとは何か。簡単に定義すると、ボタンを押したら自分から玉が飛び出て敵に当たれば倒れるというもの。したがって①何らかのボタンを押した時に処理が発生するという条件、②自分の位置から弾丸を飛ばすという処理、③飛ばした弾丸が敵に当たったかどうかの判定、④被弾したイベントの処理、ができていれば一応は形になると思う。

①は簡単にできる。問題は残りの処理だった。そもそも自分の位置からどうやって弾丸を飛ばすのか。また弾丸の当たり判定はどう確認すればいいのか。無数の敵がいる中で被弾した敵が誰であるかを特定することは可能なのか。この辺りで具合が悪くなり3年前の自分はアクション要素をなくそうと決心したのである。

しかし最近習得したイベントの座標、IDの取得を用いれば意外と簡単に実現できそうだと思った。弾は主人公の座標を読み込ませて移動させればよく、弾の当たり判定は弾のx座標,y座標に存在するイベントのIDを取得すればよかった。被弾した敵のIDを取得できれば、いちいち事前にIDを指定しなくともその場その場で取得したIDに処理を行うようになる。

具体的に見ていく。②についてはマップの端に予め弾のイベントを用意しておき、ボタンが押された時点で出現させ、主人公の位置に瞬間移動させればよかった。これは主人公の位置情報(X座標,Y座標)を取得した所定の変数を、そのまま弾の移動先の座標として変数呼び出し値から呼び出すことで解決した。次に弾の方向だが、幸いにもウディタには【主人公と逆の方向を向く】と【一歩前進】というコマンドが用意されており、方向について悩むことはなかった。これが無理でも主人公の方向を数値として取得することができるので、方向に関してはなにも問題がない。

③については弾の座標が敵と一致するかどうかを判定することで解決できた。これは変数+の位置判定処理を行うことでうまくいった。本来このx,y座標には数値を入力するのだが、ここに変数呼び出し値を用いることで弾の座標がどの位置に存在したとしても常時適切にその座標を取得する。そしてここで変数+の位置判定処理を行うことで、変数呼び出し値によって呼び出された弾の座標上に存在するイベントIDを、所定の変数に代入することができる(そこにイベントが存在しない場合は-1を代入する)。

すると④は簡単である。動作指定の対象を、先ほど取得したイベントIDが代入されている変数に選べばいい。これで被弾したイベントが吹っ飛ぶ演出ができる(以前自分は動作指定の対象にマップイベントではなく変数自体が選択できる意味がわからなかった。変数自体が動作するということだろうか?そうではない。これは変数に代入された値のイベントIDを動作指定の対象とするという意味だった。このことを今日唐突に理解した)。

これはすべて机上の空論である。実際そうなるはずだという仮説であり、まだ実際手を動かして試していない。これを書いたら試してみようかと思ったが、夜も遅く自分も疲れている。明日実際に試してみて問題なく動作するかどうか確認してみたい。

もしこの一連の処理がうまくいったら自分の開発はある種の革命を迎えると思う。例えばもし銃が作れるとしたら、ボンバーマンのような爆弾や地雷を設置することもできる。銃の弾も直線方向に限らず、たとえばボタンを押すと自分の分身が現れてランダムに移動したのちに触れた敵を吹き飛ばすといった演出も可能になる。あるいはマウスをドラッグし続けている地点に敵が吸い込まれるということもできるかもしれない。要するに無味乾燥なRPGにアクション要素が追加されるということであり、それによって表現できる幅も変わってくるということである。

おそらくメインのストーリーでは関わってこないが、行き詰ったミニゲーム開発に希望が見えてくるというのは嬉しいことである。もちろんそれが上手く行けばの話だが。