ニンテンドーラボで弾幕シューティングゲームを作ったときの話

先日作ったラボ作品について

少し前に、ニンテンドーラボVRキットで弾幕シューティング(のような)ゲームを作ってみました。

ニンテンドーラボVRで弾幕シューティングのようなゲームを作ってみた件
何か作るのおもしろい 相変わらずニンテンドーラボで何か作ってみたい欲のようなものが時々出てくるのですが、今回は、球をいっぱい出せるなら弾幕シューティングゲームが作れるんじゃないかなと思ったのでやってみました。 最終的には弾幕ばかりじゃない感...

今回は、このゲームを作ったときの話を書きたいなと思うのですが……。

7時間かかった

そう、いろいろと試行錯誤しながら作っていったところ完成までにとても時間がかかったのです。

作っているときは面白いんですけど、気が付けば時間が経っているというのを4夜ほどやりました。

それで、実は作っているときの画面は全て録画していまして、後で「ここはこういう風に作りました!」のような動画にしたかったのですけど、いかんせん長すぎるのです……。

そのような動画をちょっと作りかけたのですけど、先が長いし、ファイルサイズが大きすぎて私のPCではうまく作れなくなったりとかしました。

というわけで、動画ではなくこのブログでざっくりと書きます。
(とはいえ画像19枚もの記事になっています。)

せっかくだから動画も残しておきたい

以上のような理由から動画でなく文字で書きたいと思いますが、せっかく録画した動画を削除するのもちょっともったいないので、動画は10倍速にして残しておくことにしました。

それがこれです。

10倍速にしたところで40分越えですし、場面の移り変わりが早すぎて健康によくない気がするので視聴はお勧めしません

(一応、YouTubeの限定公開(URLを直で打たないとたどり着けない)設定にしているので、他の動画の関連に出てきてお邪魔することはないと思っています。)

作ったときの話

では、本題に戻りまして作ったときの話です。

時系列で書きます。

プレイヤーを作る

弾幕シューティングゲームを作ろう!と思ったものの、うまく作ることができるかわからなかったので初めはとにかくシンプルなシューティングゲームを作るところから始めました。

それがうまくできたら、いろいろきちんと作りこんで理想的なゲームにしていけばいいかなと思ったのです。

で、まずはカメラを上空から下に見下ろす形で設置して、ワールドを無重力にして、プレイヤーが操作するキャラクターを置くところからやりました。

最初は、自分のキャラクターとしてUFOを選びました。(目立つように赤くしました)

UFOのいいところは、Joy-Conのスティックの入力のノードをつなげるだけで、前後左右上下の動きが簡単に実現できるところです。

……ですが、試しに動かしてみたところ、UFOは横に動こうとすると横を向くのでした。

今回は上向きのシューティングゲームということで常に上を向いていてほしかったので、これだとよくないです。

というわけで、UFOに比べると若干手間がかかりますが大好きなマグロにしました。

スティックの入力を元に上下方向と左右方向の座標を数字で管理するようにして、空中に固定した直方体(非表示)にスライド連結でマグロを連結。
そして座標をフリースライド連結に入力することでマグロを動かしました。

敵のHPのバーを作る

自分のHPはリンゴ3個分にしましたが、敵のHPはバーで表すことにしました。

ニンテンドーラボでこういうことをするときには、のびる円柱などが使いやすいのですけど、今回、ものすごい高い場所のカメラからフィールド全体を見下ろすようにした結果、すごく長いバーが必要になってしまったのです。

のびるモノは10mの長さが最大のようですが、それだと足りなかったので円柱を4本つないで40mのバーを動かす感じにしました。

敵の動きを作る

今回は敵に「魔女」を使いました。
敵は何か球(弾)を撃ってくるわけですが、魔法の弾みたいに考えると違和感がないかなと思ったからです。
(マグロが弾を撃つことについては違和感がありすぎる。)

で、敵が全く動かないとゲームとして良くないので、例えば左右に8の字で動かしたりしたいなとおもって、それはやはりマグロと同様にフリースライド連結に数字を入力して作りました。

往復カウンターの値を左右(X軸)と上下(Z軸)に入力してみたらなんかうまくいきました。

開始時に敵が見切れるのを隠す

敵はマグロと同じように、空中に固定した直方体にフリースライド連結をしています。

ゲーム開始時点のフリースライド連結に入力がない状態では、スライドは0、つまり直方体にくっついている状況となります。
直方体のある位置が言わばホームポジションという感じになります。

で、敵をいろいろ動かすにあたっては、画面上端より少し下のあたりをホームポジションにしておくと座標の計算が楽になりそうだったので、そこに直方体を置きました。

しかし、そうするとゲーム開始時にいきなりそこに敵がいることになるわけです。

……それでもいいのですけど、上の方からズズイと出てきた方が敵というかボスっぽさがあるわけでして、ゲーム開始直後にいったん座標を画面外に飛ばして、そこからゆっくりホームポジションに戻ってきてもらうことにしました。

ところが、そうしようとするとゲーム開始直後に一瞬、ホームポジションから画面の上にヒュッと飛んでいく敵が見えてしまうのです。

なんか上にヒュッと引っ込んでから、おもむろに上から登場してくるというのは滑稽であり敵の威厳が全くないので、引っ込むまではどうにか画面から隠すことにしました。

最初は、カメラの前に板を置いて、敵が引っ込んだらその板を破壊することにしました。

が、これだと破片の影が画面に映り込むという事態に。

で、いくつか試した結果、板をシャッターのように上にシュッと上げることにしました。

こうしてみたところ違和感ない感じになったので良かったです。

ワイヤーワープはコメントに残す

プログラムを作っていると、線があっちこっち引かれてゴチャゴチャしちゃいます。
そんなときはワイヤーワープを使って信号を飛ばしてきれいにまとめたいものです。
プログラムもワイヤレスの時代です。

そのワープには26文字のアルファベットが使えます(26個分のワープが設定可能)。
しかし、適当にやっていると既に使っている文字かどうかがわからなくなってきたりしてバグの発生源になりがちです。(少なくとも私の場合は)

というわけで、ワイヤーワープを使うときはコメントノードにコメントを残すことにしています。

このコメントノードも100文字制限があるので、できるところは省略して書きました。
今回、敵の魔女を1文字で示すためにカタカナの「マ」に似ている「々」を敵のこととして書きました。

それでもやはり100文字は超えたので、コメントノードを2つに分けたりしました。

コメントを短くするのは大事ですが、後で見たときに何の略称かわかるようにしないと辛くなります。
今回「にんたま」とか書いていたのですが、私はすぐに忘れるので後から何だったっけと思ってプログラムをたどって理解する必要がありました。
確認したら「ニンジン弾」(赤い円柱)のことでした。(そもそもニンジン弾ってなんなんだ)

放射状の弾幕

で、なんだかんだで基本的なシューティングゲームが出来上がりました。

後は敵の攻撃、すなわち弾幕をどうデザインして作っていくかという段階に入りました。

私はあまりというかほとんど弾幕シューティングゲームやったないのですけど、とりあえず放射状に攻撃を出してみたいと思いました。

まずは3wayみたいな感じで、中心、斜め左、斜め右の3方向のショットを作りたいと思いました。

こういった場合、「モノを発射」のノードを3つ使えば一発なのですけど、この後さらに激しい攻撃もしたかったのでモノを発射ノードの数を抑えたいと思いました。
あのノードは配置コストが結構大きいので使いまくると途中でゲームが作れなくなってしまいます。

というわけで、1つの発射ノード(100個だせるやつ)を複数の弾幕でうまく使いまわすことにしました。

それで、「中心で1発発射→発射ノードを左に動かす→1発発射→発射ノードを右に動かす→1発発射→発射ノードを中心に戻す」というのを一瞬でやることで3wayのショットになるのではないかと思ったのですけど、私にはうまく作れませんでした。

どうも発射ノードを左右に振る感じになるということで発射とのタイミングが合いにくい感じなのです。
ついでに敵自体も左右にビュッビュッと動くので、発射ノードに慣性(?)が働いちゃって仕方ありません。

うまいやり方もあると思うのですが、私はそこで1時間悩んだあげく、最終的には敵の周りに発射ノードを高速でグルグル回転させて撃つということにしました。

これがうまくいった図で、わかりづらいですけど蚊取り線香のような渦巻状になっています。

しかし、このままだと発射ノードから出るモノの100個の制限に引っかかってしまい、先に出た弾から順番に消えてしまう(結果、画面の一番下まで届かない)ため、フィールド外(左右の壁、画面の上端)に達した球をワープさせるノード(ワープ入口)を置きました。

ワープ出口を置かなければ行き場を失ったモノは消滅する仕様なので、これで不要な弾をワールドから消し去り、球の個数の上限を回避できました。

技の名前(β版)

そんな感じで敵の攻撃(技)を作っていきました。

敵の動きはいくつかありますが、カウンターを使ってモードという感じで管理するようにしました。
最初は、敵が上から登場する動きだけのモード0から始まり、ホームポジションまで行ったらモード1に移行し通常弾攻撃、HPが一定の値まで減ったらモード2の狙い撃ちに移行……(以下略)という形です。

また、モード0のとき、敵がゆっくりと出現してくる最中に攻撃できるとずるいのでマグロが攻撃できないようにするとかの制御も入れています。

このようなモードや技名もしっかりコメントに残しておかないとわけがわからなくなるので書いておきましたが、その場の思い付きで適当につけていました。
この時から随分名前変わりましたね。

自機のスピードを調節したい

敵のいろんな攻撃パターンを作っていったところ、どうもマグロの動きが早すぎてどうしても攻撃に当たってしまうようになってきました。

というわけで、Xボタン押している間はゆっくり動けるようにしました。

これが直す前のプログラムで、

こちらが直した後のプログラムです。

これは、Xボタンが押されているときは、約0.06秒ごとに1回だけスティックの入力が受理されるというような感じなのですけど、このノードたちの形がかっこよくなったのでお気に入りです。

パターンを埋める

いろいろ作ってテストしていると、敵の攻撃の穴が見つかることもありました。

これは、敵が左右に往復しながら弾を連続で撃つもので、トウモロコシを連想させる黄色い弾が左右にうねうねと連なる様子を川に例えて「とうもろこしの川」と名付けられた攻撃です。

これが敵の最終レベルの攻撃なのですけど、上の画像のマグロの位置は結構安全で、そのあたりで左右に動きながらヒット&アウェイのような動きをすると簡単だということがわかりました。パターン入った状態です。

というわけで、急遽、前の攻撃で使った「ダイコン弾」(白の円柱)を再利用することになりました。

これがかの有名な「とうもろこしの川 ~大根を添えて~」という攻撃になっております。

ちなみにこの時点(開発終了直前)での名称は「もろこしリバー ~大根を添えて~」でした。いずれにしても名前が適当すぎる。

完成

そんな感じでなんとか完成しました。

画面左上を見ると、ノード数、連結数、配置コストがギリギリな感じでした。
(ノード250/256、連結256/256、配置コスト1985/2000)

まとめ

というわけで、このブログも長くなってしまいましたが、一応弾幕シューティングらしくなったので良かったです。

時間かかりましたけど、悩んだり後戻りした時間が結構あったので、今度同じようなものを作ろうとするとたぶんスーッと作れるのではないかなと思います。

今回も楽しく遊べました。

おわり。

コメント

タイトルとURLをコピーしました