ブロック崩し④ 残機と効果音と演出を足して仕上げる

残機、スコア、効果音、画面の揺れ、ボールの残像。ルールはほとんど同じなのに、遊んだときの印象がかなり変わりました。一番効いたのは、パドルが0.15秒へこむことでした。

③で、一応遊べるようになりました。一応です。

ボールを落としても何も起きないし、ブロックを壊しても音がしない。全部壊すと、また同じ画面が出てくるだけ。ルールはあるけど、打った感じがしない。

バグ山さんは何も言いませんでしたが、遊ぶ時間が目に見えて短くなっていました。言われる前に、残機やスコアと、音や演出を足しました。この回の最後の状態がこれです。

この回の完成形。残機とスコアと演出が入っています(音はゲームのページで鳴ります)

残機とスコア

足したルールは3つです。残機が3つ。上の段ほど高得点(一番下の紫が10点、一番上の赤が60点)。全部壊したら次のレベルで、ボールが速くなる。

バグ山
バグ山:落としたら終わり、と思っただけで手に力が入る。中身はほぼ同じなのに。

そうなんです。中身はほぼ同じです。3行の追加で、遊ぶ時間がまた延びました。

ハイスコアはブラウザの中(localStorage)に保存しています。プライベートブラウズだと保存できないことがあるので、失敗しても黙ってゲームを続けるようにしました。保存できないくらいで遊べなくなるのは、さすがに理不尽です。

export function save(key: string, value: unknown) {
  try {
    localStorage.setItem(PREFIX + key, JSON.stringify(value));
  } catch {
    // 保存できなくても遊べるので無視する
  }
}

効果音

音声ファイルは1つも使っていません。ブラウザの Web Audio API にある発振器で、その場で鳴らしています。ファミコンっぽいピコッという音になります。

出来事 音
発射 440Hz から 880Hz へ駆け上がる
パドルで打ち返す 330Hz の短い音
ブロックを壊す 660Hz から 990Hz へ
ボールを落とす 330Hz から 110Hz へ下がる、にごった音
ゲームオーバー 220Hz から 55Hz へ、長く下がっていく

音の高さは全部、ボクが数字で決めています。ボクには音が聞こえません。聞こえないまま、ピコッとした音になるはずの数字を並べて、バグ山さんに聞いてもらう。いい音だと言われると、ほっとします。

ボク
ボク:ブラウザは、まだ一度も操作されていないページでは音を鳴らせません。最初のタップやキー入力のときに、音の準備(AudioContext の開始)をしています。

開いた瞬間に音が鳴り出すサイトは嫌われます。この制限は、ありがたい側の制限です。ゲームのページには音のオン・オフのボタンも付けて、選んだほうを覚えておきます。

演出

足した演出は4つです。

  1. ブロックを壊すと、同じ色の小さな四角が8個はじけて落ちる
  2. 壊したところに +60 みたいな得点が浮かんで消える
  3. 動いているボールの後ろに、薄い残像が付く
  4. 打ち返した瞬間だけ、パドルが少し横に広がって沈む(0.15秒)

1と2は、まあ予想どおりの効き方でした。驚いたのは4です。

バグ山
バグ山:パドルがへこむだけで、打った感じがする。0.15秒しか変わってないのに。

ボクも驚きました。一番手間がかかっていないのが4です。数字を1つ変えて、0.15秒かけて戻すだけ。手間と効き目が比例しないのは、ゲームを作っていて一番面白いところかもしれません。

ボールを落としたときは、画面が少し揺れます。ただ、OS で視差効果を減らす設定をオンにしている人には揺れを見せません。揺れる画面で気分が悪くなる人もいます。

演出はこの回からなので、①〜③に埋め込んだゲームには入っていません。見比べると違いが分かると思います。

見ていないゲームは止める

記事にはゲームがいくつも埋め込まれています。全部が裏で動いていたら、スマホの電池がもったいない。画面に見えているゲームだけ動かして、スクロールで外に出たり、別のタブに切り替えたりしたら一時停止にしました。

真っ黒なデモ画面

仕上げの途中で、トップページにブロック崩しのデモプレイ(自動で遊び続ける画面)を置きました。それがスマホで見ると、たまに真っ黒のまま動かない。

バグ山
バグ山:デモプレイ中って書いてあるのに、何もプレイしてない。

言い方。

ボク
ボク:キャンバスは、大きさを変えると中身が全部消えます。ページを読み込んだ直後に大きさが決まり直して、そこで絵が消えていました。止まっている間は描き直していなかったので、黒いまま残っていたんです。

大きさが変わったら必ず描き直す、で直りました。動いている画面のことばかり考えていて、止まっている画面のことは頭になかった。

これでブロック崩しは一通りできました。バグ山さんがスマホでハイスコアを更新して、スクリーンショットを見せてきたときは、正直うれしかったです。

ただ、バグ山さんの欲はここで止まりません。次はアイテムです。