また面倒なことを発見。
FireFoxではゲームパッドはセキュアな状況でないと動かない。具体的には navigator.getGamepads がエラーになる。
調べたところ、FireFoxではURLがhttpsでないとダメらしい。
幸いにもFC2では無料でhttpsに変更でき、これまでのhttpでのURLアクセスはhttpsのアドレスにリダイレクトされるので、単にFC2での設定で「httpsに変更」にチェックを入れるだけで良かった。
また面倒なことを発見。
FireFoxではゲームパッドはセキュアな状況でないと動かない。具体的には navigator.getGamepads がエラーになる。
調べたところ、FireFoxではURLがhttpsでないとダメらしい。
幸いにもFC2では無料でhttpsに変更でき、これまでのhttpでのURLアクセスはhttpsのアドレスにリダイレクトされるので、単にFC2での設定で「httpsに変更」にチェックを入れるだけで良かった。
ゲームパッドに対応できたことが嬉しくて、結局スティック付きも買ってしまった。
さすがにこっちは高かったけれど、型落ちなのか定価6380円のところAmazonで2000円(送料別)だった。
振動用モーターは付いていないけれど不要だしその分軽いのがいい。
というわけで疾走者たちへ、インベーダー、バトルゾーン、アステロイド、ゼビウスをスティック対応にした。
とりわけバトルゾーンは2スティックで実機と同じ用に操作できるようになったのは嬉しい、というかこれがやりたくて買ったんだけどね。
スタートボタンの問題は置いておいて、バトルゾーンと疾走者たちへもゲームパッドに対応した。
バトルゾーンは本来はこんな風にスティック2本で操作するゲームだけど
今の750円パッドにはスティックが無いので、スティックのついたゲームパッドを入手したときには改めて対応したい。
疾走者たちへはまだrequestAnimationFrameが無かった時代のコードなのでちょっと悩んだ。しばらくして、使ってないならゲームパッド専用にrequestAnimationFrame使えばいいやんと思い付いて解決。
残念!!
ゲームパッドの対応はすんなりできたわけだが、残念なことが起きた。
スタートボタンで開始すると効果音やBGMが鳴らない
javascriptでのサウンドオブジェクトは単にPlayしただけでは鳴らない。
これはページを開いた途端に音が鳴るのを防ぐためのもので、必ずユーザーのアクション、すなわちクリックやキーボード操作を行った後でないと鳴らない仕様なんである。
ところがゲームパッドでの入力はサウンドオブジェクトにとってユーザー操作とみなされないらしく、スタートボタンを押してゲームが始まっても無音。
先に画面をクリックとかしておいてからスタートボタンを押せば鳴るんだけどね。
というわけで残念ながらゲーム開始は今まで通り S キーを押すことにした。
Sキーを押してゲームが始まったらもちろんゲームパッドで操作できるんだけど、せっかくスタートボタンがあるのに変な感じである。
なんとかならんもんかねえ。
全く持って蛇足だが、実機のバグを敢えて再現した。
アンドア・ジェネシスのコアを破壊すると4000点だが実機ではそれ以上に点が入る。
これは参照するテーブルの初期化忘れにより直前の地上キャラの点数も加算されるためらしい。
こっちの実装ではそんなテーブルはそもそも持っていないが、加算される点数は毎回決まっているのでそのようにした。
具体的には4面:+800点、9面:+200点、14面:+400点である。
ただしその面でミスをして再出撃した場合は+10点
その他にも実機には不具合があるので整理してみる。
不具合 | 原因 | 実装状況 |
---|---|---|
ギドスパリオの爆発時に赤い板がチラチラする | 未定義の領域も表示しているためらしい | 実装したくない |
ミスする場所によってはエリアが2つ進む | メインCPUとサブCPUで進行が重複するためらしい | 実装したくない |
スコアが 1,000 万点弱になると何か得点する度に常にエクステンドする | 次のエクステンド点数がオーバーフローするため | オーバーフローしない |
ミス後のリスタート時、森の中に地上物が出現することがある | メインCPUとサブCPUの処理の行き違いが原因らしい | 実装したくない |
データ上は46本目のソルがあるが出現しない | スプライト番号の同じボザログラムが消える直前に出そうとしているため無効化されているそうだ | 46本目のソルが出る |
ボザログラムは下部分が突然7ドット現れる | 上部は画面外に32ドットあるが、ボザログラムは少し大きいため | 実装してもいいけどあまり意味がないので保留 |
14面最後に空中物停止コマンドがあるが機能していない | Y座標が間違っているため | どういうものか全く不明。機能していたらどんな風だったのか興味ある |
タイトルロゴのVの字の左上が欠けている | デザインのミス? ドッターのミス? | ちゃんと欠けてる。見映えを実機に合わせることにはこだわってる^^ |
出撃時の残機数が9を超えるとアルファベットになり、Zを超えるといろいろなキャラクタ(ゴミ)の表示になる | 残機数表示に1文字分しか確保していない。10機以上の残機を想定していないというのはちょっとお粗末 | 255まで数字で表示する |
残機が255を超えると0に戻る | 残機数に1バイトしか確保していない上にオーバーフローを考慮していないため | 255でカンストする |
条件によっては想定外の空中キャラが大量に発生する | 空中キャラテーブルの最大値127を超えて参照することがあるため。超えたら何が起こるかは不明 | 0~127の範囲に収まるようにしている |
ミスしてソルバルウが消えた後、敵が画面右上に向かって攻撃する | 画面右上が恐らくVRAMの原点で、ソルバルウが消えた後はそこがソルバルウの位置になっている | 実装済み。見た目は大事 |
エリア12の最後のグロブダは動かないのに200点ではなく1500点 | ブラスター着弾点を感知して後退・停止するグロブダなのだが、画面右上にブラスター着弾点があるものとして感知して画面外で後退し、停止してから画面に現れている | 停止しているが点数は1500点のグロブダとして実装 |