3月のCoderDojo伊予で参加者から質問があって、その場ではすっきりと解決ができなかったのであらためて取り組んでみました。
やりたいことは、
ゲーム中にタイマーをカウントダウンさせる。
ある時間が過ぎたらBGMの再生速度を速くする。
さらに一定の時間が過ぎたらBGMの再生速度をもっと速くする。
という内容です。「ずっと」のループの中で「終わるまで音を鳴らす」を使うと音の再生に空白ができてしまったり、「音を鳴らす」だと音の先頭部分が何度も再生されてしまったりとうまくいかず。
スピードの違う音の素材はあらかじめ用意していて、ループ処理の中の待ち時間を調整すれば何とかなるか、と試してみたものの今ひとつタイミングが合わない感じ。
で、結果的にうまくいったのは速度を変えたいタイミングでメッセージを送るのと、ピッチの変更でした。
まずタイマーのカウントダウンを用意します。
この例では「スタートを受け取ったとき」としていますが、「🏴が押されたとき」でも構いません。ちなみに、リスタートと共通の処理にしたかったのでここでは「スタートを受け取ったとき」としています。
[スタート] を受け取ったとき
[timer] を (30) にする
ずっと
もし < (timer) = (20) > なら
(スピードアップ) を送る
end
もし < (timer) = (10) > なら
(スピードアップ) を送る
end
end
次にBGMの再生を書きます。
[スタート] を受け取ったとき
[ピッチ] の効果を (0) にする
ずっと
終わるまで (流したい音) の音を鳴らす
end
これでゲームの開始とともにBGMのループ再生が始まります。
そして再生速度を速くする部分を書きます。
[スピードアップ] を受け取ったとき
[ピッチ] の効果を (50) ずつ変える
出来上がったサンプルを貼っておきます。