#028 敵がワープするシューティングゲームの作り方|スコアで激化する難易度システム

#028 敵がワープするシューティングゲームの作り方|スコアで激化する難易度システム
ok-scratch

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

スクラッチで宇宙シューティングゲームを作る方法を解説。戦闘機を操作して弾を発射し、ランダムにワープする敵爆撃機を撃墜しよう。スコアが上がるほど難しくなる難易度システムとクローンを使った弾の管理方法が学べるよ。

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

動画で見てみよう

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

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

sb3_20260520121127

sb3_20260520121127

by ok-scratch
プレイしておこう プレイしておこう
今回のスクラッチを作る参考作品です。スコアが増えるほど敵弾がえげつなくなる設計が、マジでよくできてる。条件分岐のウェイトを重ねるだけで発射間隔が0.5秒→0.3秒→0.2秒の3段階で変化して、上手い人ほど激しい状況に追い込まれる仕組みだ。単に時間経過で難化させると下手な人が詰むけど、スコア連動なら「腕がいいほど熱い」緊張感が生まれる。どうやって組んでるか、見ていこう。参考資料:スクラッチプログラミング事例大全集

今回の目標

←→キーで戦闘機を左右に動かして、スペースキーで弾を撃てる宇宙シューティングゲームを作ろう。ランダムにワープする敵爆撃機を撃墜してスコアを稼ぎ、スコアが増えるほど敵の弾が速くなって難しくなる仕組みも実装するよ。

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

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

#1ファイターの初期設定

ok-scratch ok-scratch
今回はスペースシューティングを作っていくよ。左右キーで戦闘機を動かして、敵を撃ち落とすゲーム。

準備

スプライト「ファイター」を開く

ファイターファイター
スプライトについて
プレイヤーが操作する戦闘機。左右キーで横移動し、スペースキーでミサイルを発射する。HPとスコアを管理し、背景切り替えでゲーム進行を制御する
どんな役割か
プレイヤーが操る戦闘機だよ。左右キーで動いてスペースで弾を撃てるようにして、HPとスコアも表示しよう!

実装

step-0

まずはイベントgreenflag が押されたときで大きさを70%に設定して、画面の下(x座標0、y座標-145)に配置する。

確認プレビューしておこう 確認プレビューしておこう
旗を押すとファイターが画面下の真ん中に配置された。サイズは70%で、ここが自機のスタート位置になる感じ

#2左右移動の完成

step-1

制御ずっとで右矢印キーが押されてるかをずっとチェックし続ける仕組み。左矢印も追加して両方向に移動できるようにしよう。

動き( ) 歩動かすで右は10歩、左は-10歩。マイナスの値を入れると逆方向に進むってのがポイントだよ。

確認プレビューしておこう 確認プレビューしておこう
左右の矢印キーでファイターが動くようになった。10歩ずつスッと移動して、けっこうキビキビした操作感

#3スコアとHPの準備

ok-scratch ok-scratch
ゲームの状態を管理するために「■スコア」と「■体力」の変数を用意するよ。ステージに表示して、プレイヤーが常に確認できるようにする。

準備

変数「■体力」を追加

プレイヤーの残り体力。初期値5で、敵ミサイルに当たるたびに1減る。0以下でゲームオーバー

変数「■体力」を追加

変数「■スコア」を追加

プレイヤーの獲得スコア。敵爆撃機を撃墜するたびに1加算される。スコアが高いほど敵ミサイルが速くなる

変数「■スコア」を追加

実装

step-2

変数( ) を ( ) にするで「■スコア」を0、「■体力」を5にセットするんだ。ゲーム開始時に毎回リセットされるから、何度でも最初からやり直せるよ。

確認プレビューしておこう 確認プレビューしておこう
「スコア」と「体力」の変数がステージに表示されるようになった。「スコア」は0、「体力」は5からスタートする初期設定

#4ミサイル発射の仕組み

ok-scratch ok-scratch
次はスペースキーで弾を撃てるようにしよう。ファイターがミサイルのクローンを作る仕組みだよ。
step-3

制御もし ( ) ならでスペースキーが押されたか判定して、押されてたらミサイルのクローンを生成。直後に制御( ) 秒待つで0.1秒待つことで連射速度を制御してるんだ。

この0.1秒がないとフレームごとに弾が出まくって画面が弾だらけになる。待ち時間の値を変えれば連射の間隔を自由に調整できるよ。

#5ミサイルの初期化

ok-scratch ok-scratch
ファイターの操作ができたから、次はミサイルスプライトの設定に移るよ。

準備

スプライト「ミサイル」を開く

ミサイルミサイル
スプライトについて
プレイヤーの戦闘機から発射される弾。上方向に飛び続け、敵爆撃機に当たるとスコアを加算して消える
どんな役割か
戦闘機が撃つ弾だよ。スペースキーで生まれて上に飛んでいって、敵に当たったらスコアが増えるようにしよう!

実装

step-4

ミサイルの本体は見た目隠すで非表示にして、大きさを20%に。本体は「設計図」の役割で、実際に飛ぶのはクローンの方なんだ。

#6ミサイルの飛行

ok-scratch ok-scratch
クローンが生まれたら、まずファイターの位置に移動して表示するよ。そこから上に向かって飛んでいく処理。
step-5

制御クローンされたときでクローンがスタートしたら、ファイターの位置から出発して動きy座標を ( ) ずつ変えるでy座標を10ずつ増やし続ける。これで弾が上に飛んでいく動きが完成だよ。

確認プレビューしておこう 確認プレビューしておこう
スペースキーでミサイルが発射されるようになった。ファイターの位置から上に飛んでいって、0.1秒間隔の連射もきく

#7敵爆撃機のワープ

ok-scratch ok-scratch
弾が飛ぶようになったから、次は撃つ相手を用意しよう。敵爆撃機はランダムな位置にワープし続ける動きをするよ。

準備

スプライト「敵爆撃機」を開く

敵爆撃機敵爆撃機
スプライトについて
画面上部にランダムな位置でランダムな間隔で出現する敵。ミサイルが当たると撃墜される
どんな役割か
ランダムに現れる敵の爆撃機だよ。画面上の方をうろうろして、ミサイルで倒せるようにしよう!

実装

step-6

動きx座標を ( ) 、y座標を ( ) にするのx座標に-230〜230、y座標に0〜130の乱数を入れて、画面上部のどこかにランダム出現させるんだ。制御( ) 秒待つに0.5〜2.0秒の乱数を入れることで、出現タイミングも毎回バラバラになる。

乱数で位置も時間も変わるから、プレイヤーは次どこに出るか予測できないんだよ。シューティングの緊張感を生み出す仕組みなんだ。

確認プレビューしておこう 確認プレビューしておこう
敵爆撃機が画面上のランダムな位置にワープで出現するようになった。出現間隔も0.5〜2秒の乱数で、予測しづらい動き

#8敵への命中判定

ok-scratch ok-scratch
敵爆撃機の動きができたから、ミサイルスプライトに戻って命中判定を作っていくよ。弾が敵爆撃機に当たったらスコアが増える仕組みだ。

準備

スプライト「ミサイル」を開く

ミサイル
ミサイル

メッセージ「敵撃破」を追加

ミサイルが敵爆撃機に命中して撃墜したときに送信するメッセージ

メッセージ「敵撃破」を追加

実装

step-7

調べる( ) に触れたで敵爆撃機に触れたかチェックして、当たったらCollectの音を鳴らして「■スコア」を1増やす。「敵を撃破」メッセージも送信してるよ。

当たり判定の後に制御( ) 秒待つで0.1秒待ってからクローンを削除するんだ。この間があることで、音が途切れるのを防いでる。

確認プレビューしておこう 確認プレビューしておこう
ミサイルが敵爆撃機に当たるとCollectの音が鳴って「スコア」が1増える。撃墜メッセージも送信される当たり判定の処理

#9ミサイルの後片付け

ok-scratch ok-scratch
敵に当たらず画面の端まで飛んでいったミサイルも、ちゃんと消す必要があるよ。
step-8

端に触れたら制御このクローンを削除するでクローンを削除する。クローンを放置すると300個の上限にすぐ達して新しい弾が撃てなくなるから、地味に大事な処理。

#10敵ミサイルの生成

ok-scratch ok-scratch
ミサイルの処理が完成したから、今度は敵側の攻撃を作っていこう。敵ミサイルスプライトが自分自身のクローンを作り続ける仕組みだよ。

準備

スプライト「敵ミサイル」を開く

敵ミサイル敵ミサイル
スプライトについて
敵爆撃機の位置からクローンとして落下してくる爆弾。プレイヤーに当たるとHPが1減る。スコアが高いほど落下速度が上がる
どんな役割か
敵が落とす爆弾だよ。上から落ちてきてプレイヤーに当たるとHPが減るようにしよう!スコアが増えるほど速くなるよ!

実装

step-9

制御( ) のクローンを作るで自分自身のクローンを生成し続けるのがベースの動き。本体は非表示にして、大きさ15%のクローンが実際に画面で飛ぶやつ。

#11敵弾のスピードと加速

ok-scratch ok-scratch
敵ミサイルのクローンが生まれたら、敵爆撃機の位置から下に落ちてくる処理だよ。しかも「■スコア」によって弾の速さが変わるんだ。
step-10

制御もし ( ) ならでなければで「■スコア」が60未満かどうか判定して、60未満ならy座標を-10ずつ、60以上なら-15ずつ変える。スコアが上がると敵弾が速くなって、ゲームがどんどん難しくなる仕組み。

ok-scratch ok-scratch
シューティングの難易度設計って、実はスコアをトリガーにするのが定番なんだ。固定の難しさだとすぐ飽きるし、時間経過で上げると下手な人が詰む。スコアに連動させると「上手い人ほど難しくなる」から、誰が遊んでもちょうどいい緊張感が保てる。プロのゲームでもこの考え方はよく使われてるよ。

#12発射間隔の段階制御

ok-scratch ok-scratch
敵弾の落下速度だけじゃなく、発射間隔もスコアに応じて変化させるよ。これがこの作品のキモになるテクニック。
step-11

「■スコア」が20未満なら0.2秒待って、さらに40未満なら0.1秒待つんだ。最後に全員共通で0.2秒待つ。つまり序盤(20点未満)は合計0.5秒間隔、中盤(20〜39点)は0.3秒間隔、終盤(40点以上)は0.2秒間隔になるんだよ。

普通はタイマーで一律に間隔を管理するけど、この作品では制御もし ( ) ならの条件ウェイトを重ねて3段階の変化を作ってる。条件をすり抜けるほどウェイトが減る発想、けっこう賢いよね。

確認プレビューしておこう 確認プレビューしておこう
敵ミサイルが爆撃機の位置から落ちてくるようになった。「スコア」が上がるほど発射間隔が短くなるし、60点以上で弾速もアップする仕組み

#13プレイヤーへのダメージ

ok-scratch ok-scratch
敵ミサイルがファイターに当たったらダメージを受ける処理を追加するよ。端に到達した弾の削除もここで。
step-12

調べる( ) に触れたでファイターに触れたらCrunchの音を鳴らして「■体力」を1減らし、クローンを削除するんだ。端に触れた場合もそのまま削除するよ。

当たった瞬間にクローンを消すから、1発で複数回ダメージを受けることはないよ。

確認プレビューしておこう 確認プレビューしておこう
敵ミサイルがファイターに当たると「体力」が1減って、Crunchの効果音が鳴る。端に触れたクローンも自動で片付くやつ

#14ピンチ演出

ok-scratch ok-scratch
敵ミサイルの処理が完成したから、ファイターに戻ってゲーム進行の演出を作ろう。「■体力」の残りに応じて背景を切り替える仕組みだよ。

準備

スプライト「ファイター」を開く

ファイター
ファイター

実装

step-13

最初に背景を「Blue Sky 2」にセットして、制御ずっとのなかで「■体力」が1になったら背景を「ピンチ」に切り替える。残りHP1で画面の雰囲気がガラッと変わるから、プレイヤーに危機感が伝わるやつ。

#15ゲームオーバー処理

ok-scratch ok-scratch
「■体力」が0以下になったらゲーム終了だよ。背景を変えてメッセージを出してから全部止める処理。
step-14

まず制御 でスプライトの他のスクリプトを止めて、背景を「GameOver」に切り替えるんだ。「やられた!脱出する」と1秒表示してから、すべてを止めるよ。

「スプライトの他のスクリプトを止める」を先に実行するのがポイントだよ。これがないとHP判定のループが動き続けて、処理が衝突しちゃうんだよ。

#16雲の生成ループ

ok-scratch ok-scratch
ファイターのゲームオーバー処理が完成したから、最後に雲スプライトで背景演出を作ろう。

準備

スプライト「雲」を開く

雲
スプライトについて
宇宙空間の雰囲気を演出する装飾用の雲。ランダムなサイズと透明度で画面上から下へスクロールする
どんな役割か
背景を流れる雲だよ。ランダムな大きさと透明度で上から落ちてきて、宇宙っぽい雰囲気を出そう!

実装

step-15

本体を非表示にして、制御ずっとでy座標を200(画面の上の外)にセットしてからクローンを作る。制御( ) 秒待つに0〜1秒の乱数を入れて、雲の出現タイミングをバラけさせてるんだ。

#17雲のランダム設定

ok-scratch ok-scratch
クローンが生まれたら、x座標・大きさ・透明度をすべて乱数で決めるよ。同じ雲でも1つ1つ見た目が違うようにする。
step-16

x座標は-255〜255のランダム、大きさは50〜100%のランダム、「幽霊」の効果を10〜80のランダムに設定。大きい雲は近くに見えて、小さい雲は遠くに見える――この大きさの違いが次のステップで効いてくるよ。

確認プレビューしておこう 確認プレビューしておこう
「体力」が1になると背景がピンチに切り替わって、0以下でゲームオーバー。雲のパーティクルもランダムなサイズと透明度で生成が始まった

#18パララックスに雲が流れる

ok-scratch ok-scratch
雲を最背面に送って表示したら、いよいよ落下の処理だよ。ここがこの作品の面白いテクニック。
step-17

動きy座標を ( ) ずつ変えるの値に「0 − 大きさ ÷ 10」を入れてるんだ。大きさが100の雲は-10ずつ落ちて、大きさ50の雲は-5ずつ落ちる。大きい(近い)雲ほど速く、小さい(遠い)雲ほどゆっくり動くから、追加の変数なしで奥行き感が生まれるよ。

ok-scratch ok-scratch
この「近いものは速く、遠いものは遅く動く」テクニックはパララックス(視差効果)って呼ばれてるんだ。電車の窓から外を見ると、近くの電柱はビュンビュン飛んでいくのに遠くの山はほとんど動かないよね。あれと同じ原理を、スプライトの大きさプロパティだけで再現してるのが面白いとこ。

確認プレビューしておこう 確認プレビューしておこう
雲が最背面に表示されて、サイズに比例した速度で下に流れていく。大きい雲ほど速く動くパララックス効果、変数なしで実現してるのがうまい

#19雲の削除判定

ok-scratch ok-scratch
画面の下までいった雲はクローンを削除して、リソースを解放するよ。
step-18

y座標が-160より下になったら制御このクローンを削除するで消す。上から次々新しいクローンが生まれて、下で消えて、を繰り返すことで無限に雲が流れ続ける仕組みの完成。

確認プレビューしておこう 確認プレビューしておこう
y座標がマイナス160を下回った雲のクローンは削除される。画面外のパーティクルを片付けて、これで背景演出の完成

まとめ

宇宙シューティングゲームが完成したね!クローンで弾を管理する仕組みと、スコアで難易度を上げる設計の両方を実装できたはず。パララックス背景の雲のテクニックも、追加変数なしで奥行き感を出せるからぜひ覚えておいて。自分流にアレンジして、もっと激しいシューティングに仕上げてみよう!

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