three.js + WebAudio + socket.io で作った2Dシューティングゲームを久しぶりにいじる。

公開:2014-09-07 19:12
更新:2020-02-15 04:37
カテゴリ:three.js,web audio api,javascript,シューティングゲーム,node.js,webgl,html5,ゲーム,web 2d shooting game,ゲーム製作

久しぶりに作りかけの2Dシューティングゲームをいじる

とりあえずブログカスタマイズも一段落したので、VPSサーバー内のコンテンツを整理しようとしている。以前作りかけていたシューティングゲームが動作するのかチェックしてみたところ、Chromeでは今のところは問題なく動作していた。Firefoxは途中まで動作が停止してしまうし、IE11はWebAudioがないので動かないが。

このゲームは高校生のころから作ってみたいと思っていた「ギャラガ」タイプの2Dシューティングを40半ば過ぎでようやく着手したものである。一応ゲームシステムとしては完成しているのだが(Bugはあると思うけど)敵の動きパターンとか、ステージ・データ作りが面倒になってきて放置してしまっている。アプリなら何でもそうかもしれないが、ゲームというのは技術的な側面だけが実現できても面白いものができるわけではない。「ギャラガ」タイプのシューティングだと敵の動きや弾のスピードや配置等、ゲームデザイン的な要素が面白さの8割を占める。頭を絞りに絞る部分であり、どうも私にはその能力は備わっていないらしい。企画力とでもいうのだろうか。

このタイプの2Dシューティングゲームの元祖であるインベーダーゲームがなかったら今ほどのゲームの一般化があっただろうかと思うとやっぱりゲーム業界の金字塔ではあるよね。
今ではこのジャンルのゲームはすっかり廃れてしまった。

実のところ私が本格的にゲームをやり始めたのはギャラガからである。インベーダーゲームもリアルタイムで遊べた年代なのだけれども、ゲームプレイをすると人だかりができて、へたくそだと「溜息」、悪ガキが混じっていると「野次」も飛んでくる。順番待ちの列もプレッシャーになる。私はこれらのプレッシャーに耐えられなかった。なので専らギャラリー側に回って静かにゲームを見ているほうだった。
ギャラクシアンも人だかりがなくなったころにこっそりとプレイしはじめたが、自機弾が単発であるため、守勢に回る時間が長くてちょっと我慢を強いるゲーム内容なので私はあまり遊ばなかった。
連発できる「ムーン・クレスタ」というゲームもあったけれども、これは敵の動きがまた独特でキャラクターデザインもちょっと淫靡が感じで、恥ずかしがり屋の私にはちょっと厳しかった。

でギャラガである。これは自機弾が2連発でき、合体すると4連発することが可能な仕様であった。私が不満に思っていた部分が解決されている。これは結構夢中になってプレイしたが、ハイスコアを出せるほどうまくなるくことはついにできなかった。

しばらく経って高校生になったころ、友達からギャラガに無限パターンがあるという話を聞いた。Wikipediaの記載を見るとそのことが書いてあったので引用する。

Dランク設定の場合、ステージ1で左端の2機の敵のどちらかを残してそのまま長時間(早い時は5分、遅い時は1時間半、平均で20分程度)待機していると、敵機が全く弾を撃って来なくなり、この状態になってその1機を倒すと、以降のステージでも敵機は全く弾を撃って来なくなるので、これが成功した場合は攻略はかなり楽になるであろう。ただし、このバグを利用して無限にプレイするプレイヤーが登場したことから、北米版(Midway en:Midway Games版)ではこの裏技を使用しようとすると自機が突然爆発するという制限が実装されている。また、希少ではあるがバグ修正版も存在する。その基板では残機表示が最大7機まで表示。

実際プレイしてみるとこれはできた。しかしあまり楽しくはないよね。。

少し技術面の話をすると

そんなに大したゲームではないが、そこそこトレンドな技術を使用してこのゲームは作られている。

2Dシューティングなのにthree.jsを使用しているのは、3Dエンジンというのは使い方次第で優秀な2Dエンジンにもなるからである。特にスプライトの回転・拡大・縮小・優先制御などは3Dエンジンでは難なくこなせるので、非常に楽に作ることができる。three.jsを使ってみたかったというのもあるけれども。

WebAudioはナムコ風の波形メモリ音源を作るためのベースライブラリとして使用している。波形メモリ音源の仕様は一応 8音出力で4ビット波形メモリをエミュレートしてみたものである。BGMを作るためにMML風の簡易シーケンサーも備えている。どんな音が鳴るのかは下記を試してもらうとわかると思う(Chrome限定だが)。本当はキーボードで波形を指定して演奏できるようにしていたのが、知らぬ間に動かなくなってしまっていた。直さないとね。。それに波形メモリのループのつなぎ目がうまくいってなくてプチプチ鳴るのもBugっぽいな。。

node.js,socket.io,Web Storageはハイスコア情報をプレイヤー・サーバー間で共有・管理するために使用している。プレイ前に名前を登録しておき、ハイスコアがどこかのプレイヤーで更新されたら、他のプレイヤーにも通知するような作りになっている。自分のブログエントリを読み返すとそうなっていた。すっかり忘れてますな。。

今日はちょっとゲームコードに手を入れて、タイトル画面とTop10表示を交互に表示するように変えてみた程度だが、コードを見るとやっぱり直したくなるね。