バッファクリックで作るおやつガチャ

バッファクリックで作るおやつガチャ
ok-scratch

スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。

スペースキーを押すたびに1回だけガチャが回るシンプルなサンプル作品。変数のカウントアップに+100を加える独自の排他制御「バッファクリック」技法を、8ステップで完全解説。Scratchの入力制御を学ぶ入門に最適。

さぁ、スクラッチでナニ作る!?

一言で言うとクリックやキーの「長押し」判定ができるというのがバッファクリックという小技。スペースキーを押し続けている間はずっと変数を+1でカウントアップし、ガチャ発動時に+100を加算するのが基本。今回はキーを押したらすぐにガチャ発動させるから、0より大きく100未満の範囲でのみ発動する仕組みになっている。これによって1つの変数が「未押下・押下中・発動済み」の3状態を兼ね、追加のフラグ変数なしに二重発動を防いでいる。応用すれば、マシンガンみたいな連射や、長押しで高くジャンプできる仕組みや、UFOキャッチャーみたいなボタンを押してから離すまで間ずっと処理を続けるような仕組みも作れるようになる。この1変数3状態の設計がどう組まれているか、作り方を見ていこう。

動画で見てみよう

ok-scratch ok-scratch
チャンネル登録して応援よろしく!チャンネル登録する

チュートリアルの元になった作品

今回の目標

スペースキーを1回押すたびに1回だけガチャが回り、★1〜★5のランダムなレアリティ結果が表示されるガチャマシンを作る。バッファクリック技法を使い、キーを押し続けても二重発動しないように制御する。

スターター作品をリミックスしよう

このチュートリアルにはスターター作品があります。使わなくても大丈夫だけど、最低限の素材などが用意されてるので便利です。
スターター作品をダウンロード

#1初期化とゲーム開始

準備

スプライト「ガチャマシン」を開く

ガチャマシンガチャマシン
スプライトについて
スペースキーでガチャを回し、ランダムにレアリティ(1〜5)を決定してコスチュームとメッセージを表示するスプライト
どんな役割か
ガチャマシンを作るよ!スペースキーを押すとくるくる演出が入って、ランダムにフルーツが飛び出してくるんだ。レアリティが5段階あって、★5の激レアが出たら超ラッキー!

変数「キー入力」を追加

スペースキーの押下を検知する変数。押すたびに増加し、ガチャ実行トリガー後に100加算してガチャ実行中の再トリガーを防ぐ

変数「キー入力」を追加

変数「レアリティ」を追加

ガチャの結果として決まるレアリティ値(1〜5)。値に対応したコスチュームとメッセージを表示する

変数「レアリティ」を追加

メッセージ「ガチャ開始」を追加

フラグ受信時に送信されるメッセージ。受信した各スクリプトがキー入力の監視とガチャのトリガーを開始する

メッセージ「ガチャ開始」を追加

実装

step-0

まずはガチャマシンの初期設定から。イベントgreenflag が押されたときでゲームが始まったら、「キー入力」と「レアリティ」の変数を0にリセットして、スプライトをステージの真ん中に配置するよ。

初期化が終わったらイベント( ) を送るで「ガチャ開始」メッセージを送信する。このメッセージを受け取った別のスクリプトが、キー入力の監視とガチャの発動を担当するんだ。

確認プレビューしておこう 確認プレビューしておこう
旗を押すとガチャマシンが画面の真ん中にセットされて、変数もリセットされたね。

#2キー入力の検出

ok-scratch ok-scratch
次はキー入力をどう検出するかを作っていくよ。ここからがバッファクリックの心臓部だよ。

準備

カスタム定義「ガチャを実行する」を追加

コスチュームをスピンさせながらランダムにレアリティを決定し、対応するコスチュームを表示してレアリティメッセージを2秒間表示する

カスタム定義「ガチャを実行する」を追加

実装

step-1

「ガチャ開始」メッセージを受信したら制御ずっとでずっと監視するよ。制御もし ( ) ならでなければでスペースキーが押されてるかチェックして、押されてたら「キー入力」を1ずつ増やし、離したら0にリセットするんだ。

ok-scratch ok-scratch
このキー入力のカウントアップが「バッファクリック」の正体なんだ。普通にif文でキー判定するだけだと、押しっぱなしにしたら毎フレームガチャが回り続けて大変なことになるよね。でもこの方式なら、キーを押してる間は変数が1, 2, 3...って増えるだけで、発動条件は別の場所で管理するから1回押したら1回だけ実行っていう制御ができるってわけ。

#3発火と排他制御

ok-scratch ok-scratch
もう1つ「ガチャ開始」を受け取るスクリプトを作るよ。こっちがガチャを実際に発動させる役割。
step-2

制御もし ( ) ならの条件に演算( ) かつ ( )を使って、「キー入力 > 0」かつ「キー入力 < 100」のときだけガチャを発動させる。発動したら即座に「キー入力」を100増やすのがポイントなんだ。

いったんここで使うガチャの定義を作っちゃおうか。

確認プレビューしておこう 確認プレビューしておこう
スペースキーを押すとくるくる演出のあとレア度がランダムで決まるようになったね。押しっぱなしでも1回しか発動しないのがバッファクリック。

#4ガチャ演出の定義

ok-scratch ok-scratch
中身はこのあと実装するね。

準備

カスタム定義「ガチャを実行する」を追加

コスチュームをスピンさせながらランダムにレアリティを決定し、対応するコスチュームを表示してレアリティメッセージを2秒間表示する

カスタム定義「ガチャを実行する」を追加

実装

step-3

#5定義の呼び出し

ok-scratch ok-scratch
キーの値が発動範囲なら、っていう条件のところで呼び出すようにしておく。
step-4

こうすると変数の値が101とか102になるから、「100未満」の条件を満たさなくなって二重発動しない。キーを離せば0に戻るから、次に押したときはまた1から始まって発動できるよ。たった1つの変数で「未入力→押下中→発動済み」の3状態を管理してるのが、このテクニックの美しいところ。

#6ガチャ演出の実装

step-5

ここからは「ガチャを実行する」カスタムブロックの中身を作っていくよ。ブロック定義定義 ( )で定義を作るんだけど、「画面を再描画せずに実行する」のチェックは外しておく。これで回転演出がちゃんと画面に映るんだ。

演出の仕組みはシンプルで、制御( ) 回繰り返すで15回ループしながら色の効果を25ずつ変えて、サイズも2ずつ大きくする。0.05秒の待機を挟むことで、スロットマシンがくるくる回ってるような見た目になるよ。

カスタムブロックとして演出をまとめておくと、ガチャを発動するたびに同じ処理を呼び出せる。毎回同じコードを書き直す手間が省けるのがカスタムブロックの便利なところだね。

#7レアリティ決定

ok-scratch ok-scratch
演出が終わったら、画像効果をクリアしてサイズも100%に戻す。ここからがガチャの核心部分だよ。
step-6

変数( ) を ( ) にするで「レアリティ」変数に1〜5の乱数をセットして、そのままコスチュームを「レアリティ」の値で切り替える。つまりレアリティが3なら3番目、5なら5番目のコスチュームが表示されるようになってるよ。

ok-scratch ok-scratch
乱数って聞くと「完全にランダム」ってイメージあるかもだけど、1〜5の範囲だと各レア度が出る確率は均等に20%ずつ。本格的なガチャゲーだと「★5は3%、★1は40%」みたいに確率を偏らせるんだけど、そのやり方もScratchで再現できるよ。if文の条件を「乱数1〜100が97以上なら★5」みたいに書き換えるだけなんだ。

#8結果表示(前半)

step-7

レアリティの値に応じて、吹き出しでメッセージを表示しよう。制御もし ( ) ならでレアリティが5かどうか判定して、5なら「★★★★★ 激レア!」と2秒間表示するよ。

同じ要領でレアリティ4なら「★★★★ レア」を表示する。こうやって演算( ) = ( )で1つずつ値を比較していく分岐パターンは、Scratchではよく使う定番テクニックだね。

#9結果表示(後半)

ok-scratch ok-scratch
残りのレアリティ3〜1も同じパターンで作っていく。3は「★★★ ノーマル」、2は「★★ いまいち」、1は「★ ざんねん」を表示するよ。
step-8

5段階すべてのifブロックを並べるのは少し地道な作業だけど、レアリティの数値とコスチューム番号を一致させていて、もしこれを一致させなかったら「数値3のときはコスチューム5に切り替えて…」みたいな変換処理が必要になってしまう。シンプルに保つための設計判断だね。

Scratchには「もし〜でなければ」ブロックもあるけど、今回みたいに5パターン以上の分岐がある場合は、if文を並べて書いたほうが見通しがいい。どのレアリティが何を表示するか、一目でわかるよね。

#10変数のリセット

ok-scratch ok-scratch
最後に「ガチャを実行する」カスタムブロックの末尾に戻って、後片付けをするよ。ガチャの結果表示が終わったら「キー入力」と「レアリティ」を両方0にリセット。
step-9

「キー入力」のリセットはここでも入れておくことで、ガチャ演出中にキーの状態がおかしくなるのを防いでるんだ。これでスペースキーを押すたびに1回だけガチャが回る仕組みが完成!

まとめ

バッファクリック、使いこなせたかな?変数1つで「押した・押してる・もう発動した」って3つの状態を管理する発想は、ゲーム作りでいろんな場面に応用できるよ。クールタイムの実装とか、ゲームオーバー中の誤入力防止とか、覚えておくと役に立つぞ!

ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!