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