#031 キャッチゲームの作り方|雪の結晶を集めて氷柱をよける!得点連動で難しくなるアクション

#031 キャッチゲームの作り方|雪の結晶を集めて氷柱をよける!得点連動で難しくなるアクション
ok-scratch

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

矢印キーかA/Dキーでキャラを左右に動かして、上から落ちてくる雪の結晶をキャッチ!スコアが上がるほど氷柱が速くなる動的難易度のアクションゲームをスクラッチで作ろう。

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

動画で見てみよう

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

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

sb3_20260602082158

sb3_20260602082158

by ok-scratch
プレイしておこう プレイしておこう
今回のスクラッチを作る参考作品です。スコアが上がるほど氷柱がどんどん速くなる動的難易度カーブがマジでヤバい。落下速度の式に「-3 - 得点」って変数を直接ぶっ込むだけで、上手くなるほど勝手に難しくなる自己調整型のゲームバランスが完成してる。難易度を管理するロジックをゼロで、既存の変数1本だけでプレイヤーの腕前に追いついてくる仕掛けがイカす。どう作ってるか、一緒に見ていこう。参考資料:スクラッチプログラミング事例大全集

今回の目標

上から降ってくる雪の結晶をキャッチして得点を稼ごう。落下する氷柱は避けないと残り時間が減るよ。時間切れまでにどれだけ高得点を出せるか、スコアアタックに挑戦だ!

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

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

#1ゲームの準備

ok-scratch ok-scratch
これまでスクラッチの基本をいろいろ触ってきたよね。今回はその力を全部使って、上から落ちてくる結晶をキャッチするゲームを作っていくよ。

準備

スプライト「プレイヤー」を開く

プレイヤープレイヤー
スプライトについて
キーボードで左右に移動して結晶をキャッチするプレイヤーキャラクター。氷柱に当たると点滅してダメージを受ける
どんな役割か
矢印キー(またはA/Dキー)で左右に動くプレイヤーを作るよ!結晶をキャッチするとスコアが増えて、氷柱に当たると残り時間が減るから気をつけてね。タイムアップ時はスコアによって違う演出が流れるよ!

変数「★残り時間」を追加

ゲームの制限時間を管理するグローバル変数。毎秒1ずつ減少し、0になるとゲーム終了

変数「★残り時間」を追加

変数「★スコア」を追加

プレイヤーがキャッチした結晶の得点を累計するグローバル変数

変数「★スコア」を追加

実装

step-0

まずはゲームの土台づくりから。イベントgreenflag が押されたときで旗が押されたら、ゲームに必要な数字を最初の状態に戻すんだ。

変数( ) を ( ) にするを使って、制限時間の「★残り時間」を50に、点数の「★スコア」を0にセット。最初にリセットしておかないと、前に遊んだときの数字が残ったまま始まっちゃうんだよ。

そのあと「★残り時間」と「★スコア」を画面に表示して、プレイヤーがいつでも残りをチェックできるようにしておく、親切な作りだね。

確認プレビューしておこう 確認プレビューしておこう
旗を押すと「残り時間」が50、「スコア」が0にセットされて、「残り時間」が画面に表示されたね。これでゲームの初期状態がきれいに整う感じ。

#2プレイヤーの定位置

ok-scratch ok-scratch
次はプレイヤーを画面の決まった場所にセットして、ゲーム開始の合図を出すよ。
step-1

動きx座標を ( ) 、y座標を ( ) にするでプレイヤーを画面下のまん中、x座標0・y座標-120に置くよ。サイズは50%にして、ちょっと小さめにしておくのがコツなんだ。

最後に見た目( ) と ( ) 秒言うで「結晶をキャッチ!」って1秒しゃべらせる。これでプレイヤーに何をすればいいか一目で伝わる、親切な作りみたいな感じ。

確認プレビューしておこう 確認プレビューしておこう
「スコア」も画面に出て、プレイヤーが画面下のまん中に移動してサイズが50%になったね。結晶をキャッチって1秒しゃべって、操作のヒントもくれる作り。

#3左右に動かす

ok-scratch ok-scratch
プレイヤーを左右に動かせるようにしよう。といっても、ここでは矢印キーを直接読まないのがこの作品の面白いところ。

準備

変数「★横方向入力」を追加

キーボードの入力から計算した横方向の入力値(右=1、左=-1、なし=0)

変数「★横方向入力」を追加

実装

step-2

制御ずっとの中で、x座標を「20 × ★横方向入力」ずつ変え続けるだけ。「★横方向入力」には右なら1、左なら-1、どっちも押してなければ0が入る仕組みになってるんだ。

入力の係を別のスプライトに任せて、プレイヤーは数字を掛けるだけにしてある。だから動く側のコードはたった1行でスッキリ。この値の正体は次で作るよ。

#4入力を数字にする

ok-scratch ok-scratch
ここからは「コントローラー」っていう見えないスプライトの担当だよ。さっきの「★横方向入力」を計算して作り出す、いわば司令塔みたいな役。

準備

スプライト「コントローラー」を開く

コントローラーコントローラー
スプライトについて
非表示で動作するキーボード入力管理スプライト。矢印キーとA/Dキーの押下状態をINPUT_X変数に変換してプレイヤーの移動を制御する
どんな役割か
キーボードの入力を管理する見えないコントローラーを作るよ!右キー/Dキーで1、左キー/Aキーで-1、何も押さなければ0をINPUT_Xにセットして、プレイヤーの動きに反映するんだ。

実装

step-3

見た目隠すで姿を消してから、制御ずっとの中でずっと計算し続けるよ。中身は「右向き矢印が押された」から「左向き矢印が押された」を引き算してるんだ。

右だけ押してれば 1 - 0 で1、左だけなら 0 - 1 で-1、両方押してなければ 0 - 0 で0。「押された」っていう判定が、計算の中では1か0の数字として扱われるのがミソだよ。

ok-scratch ok-scratch
コンピュータの世界では「はい」と「いいえ」を1と0で表すんだ。この考え方は19世紀の数学者ジョージ・ブールさんが作った「ブール代数」が元になってる。スマホもゲーム機も、結局はこの1と0のスイッチの組み合わせで動いてるんだよ。

#5A・Dキーにも対応

ok-scratch ok-scratch
矢印キーだけじゃなく、ゲームでおなじみのA・Dキーでも動かせるようにしよう。
step-4

制御もし ( ) ならで「★横方向入力」が0かどうかをチェック。0っていうのは矢印キーが何も押されてない状態だから、そのときだけDキーとAキーの引き算に切り替えるんだ。

矢印キーを優先して、空いてたらA・Dキーを見にいくっていう二段構え。これで右手でも左手でも遊べる、気の利いた操作になるよ。

確認プレビューしておこう 確認プレビューしておこう
コントローラーが右キーと左キーの引き算で「横方向入力」を作って、プレイヤーがそれを20倍して左右に動くようになったよ。矢印が空いてればA・Dキーでもいける。

#6BGMを流す

ok-scratch ok-scratch
コントローラーができたから、プレイヤーに戻って今度はゲーム中ずっと流れるBGMをつけるよ。

準備

スプライト「プレイヤー」を開く

プレイヤー
プレイヤー

実装

step-5

プレイヤーにもう一本ループを足して、音量を ( ) %にするで音量を20%に下げてから、終わるまで ( ) の音を鳴らすで「Xylo2」を終わるまで鳴らすよ。最後まで待ってからまた鳴らすから、曲がキレイにループするんだ。

#7時間のカウントダウン

step-6

別のイベントgreenflag が押されたときからもう一本ループを動かして、制御( ) 秒待つで1秒待つたびに「★残り時間」を-1ずつ減らしていくんだ。

1秒に1ずつ減るから、50からスタートしたこのゲームはだいたい50秒勝負ってこと。さっきの移動ループとは別に動く、並行作業みたいな感じだね。

確認プレビューしておこう 確認プレビューしておこう
もう一本のループが動き出して、1秒たつごとに「残り時間」が1ずつ減るようになったね。50スタートだから、だいたい50秒で時間切れになる計算。

#8時間切れの判定

ok-scratch ok-scratch
残り時間が0になったら、ゲームを終わらせる仕組みを作るよ。
step-7

制御もし ( ) ならで「★残り時間」が1より小さくなったら、まず制御 でこのスプライトの他のスクリプトだけを止めるんだ。移動やカウントダウンをここでストップさせる感じ。

「すべてを止める」じゃなく「他のスクリプトだけ止める」のがポイントなんだ。こうしておけば、このループ自体は生き残るから、このあと結果に応じた音を鳴らす処理を続けられるってわけ。

そのあと音量を50%にして、制御もし ( ) ならでなければで「★スコア」が100未満かどうかで結果を2つに分ける準備をするよ。

#9結果で音を変える

ok-scratch ok-scratch
さっき2つに分けた結果に、それぞれ違う音をつけていくよ。

準備

スプライト「結晶1」を開く

結晶1
結晶1

実装

step-8

「★スコア」が100未満ならちょっと控えめな「Win」の音、100以上なら盛り上がる「Triumph」の音を終わるまで ( ) の音を鳴らすで最後まで鳴らすんだ。終わるまで待つから、音がぶつ切りにならない自然な流れ。

音を鳴らし終わってから、最後に制御 で「すべてを止める」を実行。他のスクリプトを先に止めておいたおかげで、この結果音だけはちゃんと最後まで流れるって流れだね。

#10結晶を降らせる

ok-scratch ok-scratch
プレイヤー側がだいたい固まったから、次は主役の結晶を降らせるよ。まずは基本の「結晶1」から。

準備

スプライト「結晶1」を開く

結晶1結晶1
スプライトについて
上から落下してくる青い結晶。プレイヤーがキャッチすると1点獲得し、ランダムな位置に再配置される
どんな役割か
上からランダムに落ちてくる結晶を作るよ!プレイヤーに当たったら効果音が鳴ってスコアが1点増えるんだ。端に届いたらまたランダムな位置から落ちてくるよ。

実装

step-9

旗が押されたら1秒待って、サイズを10%に縮めてから動きx座標を ( ) 、y座標を ( ) にするで画面の上のほうに置くよ。x座標は演算( ) から ( ) までの乱数で-200から200までのランダム、y座標は140で固定。

出てくる横の位置が毎回バラバラになるから、どこに落ちてくるか分からないドキドキ感が出るんだ。制御ずっとの中で少しずつ回転させると、結晶がキラキラ落ちてくる雰囲気も出ていい感じだね。

#11キャッチで加点

ok-scratch ok-scratch
降ってくるだけじゃゲームにならないから、キャッチして点が入る仕組みをつけるよ。
step-10

動きy座標を ( ) ずつ変えるでy座標を-7ずつ変えて、結晶をまっすぐ下に落とすよ。落ちながら調べる( ) に触れたでプレイヤーに触れたかどうかを毎フレーム確認してるんだ。

触れた瞬間に「Collect」の音を鳴らして「★スコア」を1増やす。そのあとすぐ上のランダムな位置に戻すから、キャッチするたびに次の結晶がまた降ってくるってわけ。

確認プレビューしておこう 確認プレビューしておこう
結晶1が下に落ちてくるようになって、プレイヤーでキャッチするとCollectの音が鳴って「スコア」が1増えるね。取った瞬間にまた上のランダムな位置から落ちてくる。

#12取り逃した結晶

ok-scratch ok-scratch
もしキャッチし損ねて結晶が下まで落ちちゃったら、どうする?

準備

スプライト「結晶2」を開く

結晶2
結晶2

実装

step-11

制御もし ( ) ならで画面の端に触れたかを調べて、触れてたらまた上のランダムな位置に戻すよ。これで取り逃しても結晶が無限に降り続けるんだ。

落ちた結晶が消えてなくならずにグルグル使い回される作り。新しく作り直さず同じ結晶を再利用するから、動作も軽くてスマートだよね。

#13レアな結晶

ok-scratch ok-scratch
基本の結晶ができたから、今度はちょっと特別な「結晶2」を作るよ。これは当たると一気に5点入るレアキャラ。

準備

スプライト「結晶2」を開く

結晶2結晶2
スプライトについて
上から落下してくる希少な結晶。プレイヤーがキャッチすると5点獲得するが、キャッチ後や端到達後に一定時間消える
どんな役割か
スコアが5点も入る希少な結晶を作るよ!キャッチすると1秒、端に届くと3秒消えてから再出現するんだ。見かけたら積極的に狙おう!

実装

step-12

流れは結晶1とよく似てるけど、1つ違うのが見た目( ) の効果を ( ) にするで「色」の効果を100にしてること。これで見た目の色がガラッと変わって、普通の結晶とひと目で見分けがつくんだ。

サイズを10%にして、上のランダムな位置からスタートするのは同じ。色を変えるだけでレア感を出すのは、ゲームでよく使う分かりやすい演出だね。

確認プレビューしておこう 確認プレビューしておこう
取りこぼした結晶1も下まで落ちると上に戻って、ずっと降り続けるようになったね。さらに色を変えた結晶2が登場して、ひと目でレアだと分かる見た目になってる。

#14揺れて速く落ちる

ok-scratch ok-scratch
結晶2は、ただ落ちるだけじゃなくて捕まえにくくしてあるよ。
step-13

動きy座標を ( ) ずつ変えるでy座標を-10ずつ、結晶1の-7より速く落とすよ。さらに動きx座標を ( ) ずつ変えるに-10から10までの乱数を入れて、左右にフラフラ揺れながら落ちるようにするんだ。

落ちるのが速いうえに横にもブレるから、5点ぶんキャッチするのはなかなか手強い。リスクが高いほどリターンも大きいっていう、ゲームバランスの基本だね。

#15高得点と一時退場

step-14

落ちながらプレイヤーに触れたかも調べる( ) に触れたでしっかり見張ってるんだ。

「Magic Spell」の音を鳴らして「★スコア」を5増やしたら、上のランダムな位置に戻すよ。ここまでは結晶1とだいたい同じ流れ。

違うのはそのあとだよ。見た目隠すでいったん姿を消して、制御( ) 秒待つで1秒待つんだ。キャッチするとしばらく出てこないから、レアな結晶を取れたありがたみが出るんだよね。

#16見逃しと再登場

ok-scratch ok-scratch
結晶2を取り逃したときと、消えたあとに戻ってくる処理をまとめて作るよ。

準備

スプライト「氷柱」を開く

氷柱
氷柱

実装

step-15

制御もし ( ) ならで端に触れたら、ランダムな位置に戻してから見た目隠すで姿を消して3秒待つよ。取り逃すと、キャッチしたとき(1秒)より長めにお預けってわけ。

そして最後に見た目表示するでまた表示する。消す処理と表示する処理をセットにしておくことで、結晶2が出たり消えたりを自然に繰り返せるんだ。

確認プレビューしておこう 確認プレビューしておこう
結晶2が左右に揺れながら速く落ちて、キャッチするとMagic Spellの音で「スコア」が5も増えるようになったね。取ると1秒、取り逃すと3秒消えてから戻ってくる。

#17氷柱の登場

ok-scratch ok-scratch
結晶チームができたから、ここからは邪魔者の「氷柱」を作っていくよ。当たると残り時間が減る、避けたい存在。

準備

スプライト「氷柱」を開く

氷柱氷柱
スプライトについて
上から落下してくる障害物。スコアが高いほど落下速度が上がり、プレイヤーに当たると残り時間を3秒減らす
どんな役割か
スコアが上がるほど速くなる危険な氷柱を作るよ!プレイヤーに当たるとメッセージを送って残り時間が3秒減るから、うまく避けることが大事だよ。

実装

step-16

旗が押されたら1秒待って、サイズ30%で上のランダムな位置にセット。ここまでは結晶とだいたい同じ流れだね。

制御ずっとの中で具体的な処理を書いていく。

確認プレビューしておこう 確認プレビューしておこう
今度は邪魔者の氷が登場。旗を押すとサイズ30%で画面の上のランダムな位置に出てきて、出てきた直後かどうかをy座標が140かで見張り始めるよ。

#18タメてから落ちる

準備

メッセージ「被弾」を追加

氷柱がプレイヤーに当たった時に送信するダメージ通知メッセージ

メッセージ「被弾」を追加

実装

step-17

氷柱は、いきなり落ちてこないのがニクいところ。出てきた瞬間に、左右にプルプル揺れる「タメ」の動きをするんだ。まず制御もし ( ) ならでy座標が140かどうかをチェックするよ。140は出てきた直後の一番上の位置だから、今まさに出現したところかを座標で見分けてるんだ。

制御( ) 回繰り返すの回数に「1から★残り時間までの乱数」を入れて、左右に少し回す動きを繰り返すよ。揺れてる間に「あ、次はあそこに落ちてくる」って予告になるから、避ける余裕が生まれるんだ。

#19落下の挙動

step-18

揺れ終わったら動き( ) 度に向けるで向きをまっすぐ90度に戻すよ。

落下のしかたも一工夫。動きy座標を ( ) ずつ変えるの値を「-3 - ★スコア」にしてあるから、点を取れば取るほど氷柱がどんどん速く落ちてくる。上手い人ほど忙しくなる、よくできた仕掛けだよ。

ok-scratch ok-scratch
プレイヤーが強くなるほど難しくなるこの仕組み、プロのゲームでは「動的難易度調整」って呼ばれてるんだ。レースゲームで後ろの車がちょっと速くなるのも同じ考え方。強すぎず弱すぎず、ちょうどいい手応えをキープするための工夫なんだよ。

#20当たるとダメージ

ok-scratch ok-scratch
氷柱がプレイヤーに当たったときのダメージ処理を作るよ。

準備

メッセージ「被弾」を追加

氷柱がプレイヤーに当たった時に送信するダメージ通知メッセージ

メッセージ「被弾」を追加

実装

step-19

調べる( ) に触れたでプレイヤーに触れたら、イベント( ) を送るで「被弾」のメッセージを飛ばすんだ。同時に「Rip」の音を鳴らして、「★残り時間」を3も削る痛い一撃。

「被弾」を送るだけで、プレイヤー側が勝手に反応してくれるのがメッセージの便利なところ。氷柱はぶつかったことを知らせるだけで、見た目の演出はプレイヤーに任せるって役割分担だね。

当たったあとは上のランダムな位置に戻すよ。

確認プレビューしておこう 確認プレビューしておこう
氷が出てきた直後に左右へプルプル揺れてタメを作って、向きを戻して落下するようになったね。「スコア」が上がるほど速く落ちて、当たると「被弾」を送り「残り時間」が3減る。

#21氷柱の使い回し

step-20

制御もし ( ) ならで端に触れたかのチェックもする。

氷柱が下まで落ちて端に触れたら、結晶と同じように上のランダムな位置に戻すだけ。動きx座標を ( ) 、y座標を ( ) にするひとつで、当たっても外しても氷柱がずっと降り続ける仕組みが完成するよ。

#22被弾でピカッと光る

ok-scratch ok-scratch
氷柱の処理ができたから、プレイヤーに戻るよ。「被弾」のメッセージが届いたとき、どう反応するかを作っていくんだ。

準備

スプライト「プレイヤー」を開く

プレイヤー
プレイヤー

実装

step-21

イベント( ) を受け取ったときで「被弾」を受け取ったら、10回くりかえすループの中で見た目( ) の効果を ( ) にするの明るさを100にして、すぐ0に戻す。やってるのは明るさを上げて下げるだけなんだ。

パッと白く光ってすぐ戻る、これを10回でピカピカ点滅して見えるよ。最後に明るさを0に戻しておくのが大事で、これを忘れると白く光ったままになっちゃうから注意だね。

確認プレビューしておこう 確認プレビューしておこう
氷も端から上に戻って降り続ける形が完成。プレイヤーは「被弾」を受け取ると明るさを上げ下げして、白くピカピカ点滅するようになったね。当たった手応えがしっかり出る。

#23歩くアニメ

ok-scratch ok-scratch
プレイヤーが動いてるときだけ、足踏みするアニメをつけるよ。

準備

スプライト「プレイヤー」を開く

プレイヤー
プレイヤー

実装

step-22

ポイントは演算( ) の ( )の絶対値。「★横方向入力」は右で1・左で-1になるけど、絶対値をとれば右でも左でも1になるから、動いてるか止まってるかだけをスッキリ判定できるんだ。

制御もし ( ) ならで絶対値が0より大きい、つまり何かキーを押してる間だけ、0.1秒ごとに見た目次のコスチュームにするでコスチュームを切り替えるよ。止まってるときは切り替わらないから、ちゃんと歩いてるときだけ足が動いて見えるってわけ。

#24時間で画面が暗転

ok-scratch ok-scratch
ここからはステージ(背景)の担当だよ。残り時間に合わせて、画面全体の明るさを変える演出をつけるんだ。

準備

スプライト「stage」を開く

ステージ
スプライトについて
残り時間に応じて背景の明るさが変化するステージ。時間切れに近づくほど画面が暗くなり、プレイヤーに緊張感を演出する

実装

step-23

制御ずっとの中で、見た目( ) の効果を ( ) にするの明るさを「-50 + ★残り時間」に設定し続けるよ。残り時間が50なら明るさ0で普通、時間が減るほどマイナスに振れて画面が暗くなる。

残り時間っていう数字を、そのまま画面の明るさに変換してるのが面白いところ。数字を読まなくても、画面が暗くなってきたら「そろそろヤバい」って体で感じられるって作りだね。

これで結晶キャッチゲームの完成!自分でスピードや点数を変えたり、新しい結晶を足したりして、オリジナルに改造してみるのも楽しいよ。ここまで作れたら、もう自分だけのゲームを作る力は十分ついてるはず。

確認プレビューしておこう 確認プレビューしておこう
動いてる間だけプレイヤーのコスチュームが切り替わって歩くアニメがつき、背景は「残り時間」が減るほど暗くなる演出も入ったね。終盤の焦りが画面の暗さで伝わってくる。

まとめ

結晶キャッチゲームが完成したね!変数を速度の式に組み込むだけで、得点に連動して自動的に難しくなる仕掛けが作れるって分かった?残り時間を画面の明るさに変換する演出も、数値をそのまま視覚効果につなぐシンプルな発想だったね。学んだ仕組みを活かして、落下アイテムの種類や速度を自分なりにアレンジして、オリジナルキャッチゲームに挑戦してみよう!

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