JavascriptでリズムゲームのWebアプリ「Stein-ferno」を開発する事にした。
本開発に取り組む直前、HTML5+JavascriptによるWebアプリ開発のpreproductionとして、
タイマー付きアナログ時計を開発していた。
JSの開発経験はこれ以外ほぼゼロ。この時計で得たノウハウを使ってStein-ferno開発に取り組む。
完成予定日は6/27。あと20日。
さて、間に合うのだろうか。
Stein-ferno ver0.1α
最低限の入力と出力を実装。数値がゼロに近いほど高得点。
GoogleChromeに最適化。IE9動作確認。なぜかIE7は不可だった。
ちなみに、この程度でもJSのコード部分だけで530byte。
565byteのテトリスなどには頭が上がらない。
昨日作ったver0.1では、0.01秒に1回メインルーチンを呼び出して、画面を更新している。
要するに100fpsという訳。計算簡略化のため、60fpsで60四分音符/分(60bpm)のテンポにしようと思っている。
四部1拍間のリズムは、だいたい「四分音符」「八分音符」「三連符」「十六分音符」に大分される。

これ以上細かい音符は、難易度をいたずらに上げるだけのため考慮しない。
これらを基本リズムとして仕様を定めていく。
二拍三連なども、これらの組み合わせとして表現できる。
![]()
![]()
二拍三連ねえな。
さて、60fpsに対し60bpmのため、1拍は丁度60フレームである。
0フレーム目を強拍とし、各ノート(音符)の拍内の該当フレームを計算してみよう。
[0]
[0,30]
[0,20.40]
[0,15,30,45]
ここから入力精度の許容フレーム範囲を考えてみたい。
最も狭いノート間は15フレームのため、最大で前後7フレーム(15フレーム)の入力誤差を許容できる。
これ以上広い範囲を許容してしまうと複数のノートの許容範囲が重なってしまう。
Stein-ferno ver0.2α
先日のプログラムを大体60fpsに改変した。
上記の四分音符
[0]だけが延々と流れてくるだけのクソゲーが完成した。
93point以上が許容フレームである。
これなら、もう少し許容フレームを狭めたとしても問題なさそうだな。
少なくとも、この時点で難しすぎてゲームにならないといった事はない。
ちなみに現時点で既にiOSでの動作を諦めているのだが、どうしたものか。
Stein-ferno ver0.3α
小節クラスを実装し、譜面表示の基礎システムを作った。
スタートボタンでゲーム開始すると表示される「0,0,0,0」という謎の数字は、
譜面データの配列をそのままアウトプットしている。
こういったHTMLを動的に書き換える処理を入れると、すごく現代的なWebページを作っている気分になる。
見ての通り、実際には全く大したことをしていないのだが。
この日記とstein-fernoのコードを書くのにMS Visual Web Developerを使ってみた。
JSは書きやすいが、HTMLは微妙かな。
Stein-ferno ver0.4α
ステージの進行に応じて譜面を動的に書き換える処理を実装。
後は実際の判定を譜面に対応させれば、ゲームとしては成立する。
ちなみに細かいことを言うと、最初の小節にはテンポメーカーとして必ず休符を配置するので、
いわゆる弱起となる。だから"第0小節目"という表記は正しい。
Stein-ferno ver0.5β
お陰でゲームとして最低限の形にはなった。
というかもうインプット面は完成ではないだろうか。
あとはアウトプット面。このままの画面では意味が分からないので、
譜面のグラフィック表示とリズムガイドマーカーを実装する。
そして難易度別の譜面自動生成が出来れば、めでたくゲームは完成である。
要するに、残るはインターフェースとレベルデザインという訳だ。ゲーム開発っぽくなってきたな。
HTMLフォームボタン入力からのイベント呼び出しは、環境によっては実際のクリックからイベント実行まで
数フレームのタイムラグが発生するようだ。リズムゲームとしては致命的。
特にiOSで顕著。ただのタッチスクロールはあれだけスムーズに動くのに。
インプットの形式を考え直す必要があるな・・・。
Stein-ferno ver0.6β
リズムガイドマーカーと譜面表示を実装。直感的に遊べるようになった。
譜面の最初の音符に枠が付かないのは、とりあえず仕様。
ちなみに現在スクリプト部分で200行ぐらい。思ったより全然書いてないな。
その間に完成予定日を過ぎてしまったが、
とりあえず現段階で最低限の形になっているので良しとしよう。
新しい期限は、1週間送って7/7(木)だ。
ここまでには完成させて本業に移りたい。
Stein-ferno ver0.7β
デザインを大幅に整理。
見た目は一気に変わったが、実はHTMLやCSS部分はそれほどいじっていない。
簡単な手直しだけで、ここまで見た目を変えることができる、HTML5+CSS3の威力を改めて思い知った。
(ただしセンスが必要だが)
ゲームの方はライフを導入し、ゲーム性を高めた。
あとは楽譜の自動生成が完成すれば、開発は完了だ。
Stein-ferno ver1.0
楽譜の自動生成プログラムが完成。
まだ変拍子には対応していないが、後のアップデートにて高難易度ステージに実装する予定。
デザインもさらに磨き、IE9での見栄えも調整した(推奨環境はGoogleChrome)。
楽譜画像も一新し、さらに休符を混じえた複雑なリズムパターンを追加した(まだ実装はしていない)
それにしても自分では全くクリアできないのだが、難しすぎるか?
本当はコレを難易度「易しい」とする予定だったが・・・。
Stein-ferno ver1.1
難易度「やや易」「やや難」追加。
「やや難」には、先日用意した複雑なリズムパターンを実装。
その他、画像をCSSで縮小しデザインを調整した。
「普通」はクリアできるようになったが、「やや難」は全然無理。
「やや難」はこっそり救済措置としてライフの最大値を上げてあるので、
簡単なリズムで確実にEXELLENTを取ってライフを回復し
ライフを高く保つのが鍵となっている。
段々とリズムゲームの趣旨を外れてきている。どうしてこうなった。
Stein-ferno ver1.2
iPhone対応開始。
といってもまだ画面は最適化されてないし、
#4で述べたタイマーイベントの問題も解決していない。
とりあえずiPhoneのボタンイベントがクソかつキーボードが無いので、
画面をタッチしてTAPボタンと同じ効果が得られるように。最低限遊べるようになった。
しかしまあiPhoneごときで動けば、余程ロースペックなパソコンでも正常に動作するだろう。
Stein-ferno ver1.3
スコアボード実装。調子に乗った配置にしてみた。
こういうふざけた事を簡単にできるのがCSS3の力。
Androidエミュレータを導入して動作確認してみた。
とりあえず動くが、エミュ上では処理落ちが激しくて正常なプレイは不可能だった。
実機でもこんなにもっさりするのだろうか。
さてやりたい事が大体終わった(スマホ対応はまだ微妙だが…)ので、
これにてstein-fernoは完成としたい。
予定よりも随分伸びてしまったのが反省点。
のんびりし過ぎたが、まあ趣味でやるプログラミングなので問題はない。