さぁ、スクラッチでナニ作る!?
一言で言うとクリックやキーの「長押し」判定ができるというのがバッファクリックという小技。スペースキーを押し続けている間はずっと変数を+1でカウントアップし、ガチャ発動時に+100を加算するのが基本。今回はキーを押したらすぐにガチャ発動させるから、0より大きく100未満の範囲でのみ発動する仕組みになっている。これによって1つの変数が「未押下・押下中・発動済み」の3状態を兼ね、追加のフラグ変数なしに二重発動を防いでいる。応用すれば、マシンガンみたいな連射や、長押しで高くジャンプできる仕組みや、UFOキャッチャーみたいなボタンを押してから離すまで間ずっと処理を続けるような仕組みも作れるようになる。この1変数3状態の設計がどう組まれているか、作り方を見ていこう。
動画で見てみよう
チュートリアルの元になった作品
今回の目標
スターター作品をリミックスしよう
このチュートリアルにはスターター作品があります。使わなくても大丈夫だけど、最低限の素材などが用意されてるので便利です。
スターター作品をダウンロード
#1初期化とゲーム開始
準備
スプライト「ガチャマシン」を開く
| スプライトについて |
|---|
| スペースキーでガチャを回し、ランダムにレアリティ(1〜5)を決定してコスチュームとメッセージを表示するスプライト |
| どんな役割か |
| ガチャマシンを作るよ!スペースキーを押すとくるくる演出が入って、ランダムにフルーツが飛び出してくるんだ。レアリティが5段階あって、★5の激レアが出たら超ラッキー! |
変数「キー入力」を追加
スペースキーの押下を検知する変数。押すたびに増加し、ガチャ実行トリガー後に100加算してガチャ実行中の再トリガーを防ぐ
変数「レアリティ」を追加
ガチャの結果として決まるレアリティ値(1〜5)。値に対応したコスチュームとメッセージを表示する
メッセージ「ガチャ開始」を追加
フラグ受信時に送信されるメッセージ。受信した各スクリプトがキー入力の監視とガチャのトリガーを開始する
実装
まずはガチャマシンの初期設定から。 が押されたときでゲームが始まったら、「キー入力」と「レアリティ」の変数を0にリセットして、スプライトをステージの真ん中に配置するよ。
初期化が終わったら( ) を送るで「ガチャ開始」メッセージを送信する。このメッセージを受け取った別のスクリプトが、キー入力の監視とガチャの発動を担当するんだ。
#2キー入力の検出
準備
カスタム定義「ガチャを実行する」を追加
コスチュームをスピンさせながらランダムにレアリティを決定し、対応するコスチュームを表示してレアリティメッセージを2秒間表示する
実装
「ガチャ開始」メッセージを受信したらずっとでずっと監視するよ。もし ( ) ならでなければでスペースキーが押されてるかチェックして、押されてたら「キー入力」を1ずつ増やし、離したら0にリセットするんだ。
#3発火と排他制御
もし ( ) ならの条件に( ) かつ ( )を使って、「キー入力 > 0」かつ「キー入力 < 100」のときだけガチャを発動させる。発動したら即座に「キー入力」を100増やすのがポイントなんだ。
いったんここで使うガチャの定義を作っちゃおうか。
#4ガチャ演出の定義
準備
カスタム定義「ガチャを実行する」を追加
コスチュームをスピンさせながらランダムにレアリティを決定し、対応するコスチュームを表示してレアリティメッセージを2秒間表示する
実装
#5定義の呼び出し
こうすると変数の値が101とか102になるから、「100未満」の条件を満たさなくなって二重発動しない。キーを離せば0に戻るから、次に押したときはまた1から始まって発動できるよ。たった1つの変数で「未入力→押下中→発動済み」の3状態を管理してるのが、このテクニックの美しいところ。
#6ガチャ演出の実装
ここからは「ガチャを実行する」カスタムブロックの中身を作っていくよ。定義 ( )で定義を作るんだけど、「画面を再描画せずに実行する」のチェックは外しておく。これで回転演出がちゃんと画面に映るんだ。
演出の仕組みはシンプルで、( ) 回繰り返すで15回ループしながら色の効果を25ずつ変えて、サイズも2ずつ大きくする。0.05秒の待機を挟むことで、スロットマシンがくるくる回ってるような見た目になるよ。
カスタムブロックとして演出をまとめておくと、ガチャを発動するたびに同じ処理を呼び出せる。毎回同じコードを書き直す手間が省けるのがカスタムブロックの便利なところだね。
#7レアリティ決定
( ) を ( ) にするで「レアリティ」変数に1〜5の乱数をセットして、そのままコスチュームを「レアリティ」の値で切り替える。つまりレアリティが3なら3番目、5なら5番目のコスチュームが表示されるようになってるよ。
#8結果表示(前半)
レアリティの値に応じて、吹き出しでメッセージを表示しよう。もし ( ) ならでレアリティが5かどうか判定して、5なら「★★★★★ 激レア!」と2秒間表示するよ。
同じ要領でレアリティ4なら「★★★★ レア」を表示する。こうやって( ) = ( )で1つずつ値を比較していく分岐パターンは、Scratchではよく使う定番テクニックだね。
#9結果表示(後半)
5段階すべてのifブロックを並べるのは少し地道な作業だけど、レアリティの数値とコスチューム番号を一致させていて、もしこれを一致させなかったら「数値3のときはコスチューム5に切り替えて…」みたいな変換処理が必要になってしまう。シンプルに保つための設計判断だね。
Scratchには「もし〜でなければ」ブロックもあるけど、今回みたいに5パターン以上の分岐がある場合は、if文を並べて書いたほうが見通しがいい。どのレアリティが何を表示するか、一目でわかるよね。
#10変数のリセット
「キー入力」のリセットはここでも入れておくことで、ガチャ演出中にキーの状態がおかしくなるのを防いでるんだ。これでスペースキーを押すたびに1回だけガチャが回る仕組みが完成!
まとめ
バッファクリック、使いこなせたかな?変数1つで「押した・押してる・もう発動した」って3つの状態を管理する発想は、ゲーム作りでいろんな場面に応用できるよ。クールタイムの実装とか、ゲームオーバー中の誤入力防止とか、覚えておくと役に立つぞ!