- スターター作品
- なし
- 今回の完成サンプル
- なし
さぁ、スクラッチでナニ作る!?
動画で見てみよう
[talk]チャンネル登録して応援よろしく!チャンネル登録する[/talk]チュートリアルの元になった作品
[prj-embed prj="1322895673" mini="1" title="プレイしておこう" prj-title="sb3_20260520121127" prj-author="ok-scratch"]今回の[prj-link prj="1322895673" title="sb3_20260520121127" author="ok-scratch"]スクラッチを作る参考作品[/prj-link]です。スコアが増えるほど敵弾がえげつなくなる設計が、マジでよくできてる。条件分岐のウェイトを重ねるだけで発射間隔が0.5秒→0.3秒→0.2秒の3段階で変化して、上手い人ほど激しい状況に追い込まれる仕組みだ。単に時間経過で難化させると下手な人が詰むけど、スコア連動なら「腕がいいほど熱い」緊張感が生まれる。どうやって組んでるか、見ていこう。参考資料:スクラッチプログラミング事例大全集[/prj-embed]今回の目標
スターター作品をリミックスしよう
このチュートリアルにはスターター作品があります。使わなくても大丈夫だけど、最低限の素材などが用意されてるので便利です。
スターター作品をダウンロード
#1ファイターの初期設定
[talk class="m-l-n"]今回はスペースシューティングを作っていくよ。左右キーで戦闘機を動かして、敵を撃ち落とすゲーム。[/talk]準備
スプライト「ファイター」を開く
| スプライトについて |
|---|
| プレイヤーが操作する戦闘機。左右キーで横移動し、スペースキーでミサイルを発射する。HPとスコアを管理し、背景切り替えでゲーム進行を制御する |
| どんな役割か |
| プレイヤーが操る戦闘機だよ。左右キーで動いてスペースで弾を撃てるようにして、HPとスコアも表示しよう! |
実装
まずは
#2左右移動の完成
ずっとで右矢印キーが押されてるかをずっとチェックし続ける仕組み。左矢印も追加して両方向に移動できるようにしよう。
( ) 歩動かすで右は10歩、左は-10歩。マイナスの値を入れると逆方向に進むってのがポイントだよ。
#3スコアとHPの準備
[talk class="m-l-n"]ゲームの状態を管理するために「■スコア」と「■体力」の変数を用意するよ。ステージに表示して、プレイヤーが常に確認できるようにする。[/talk]準備
変数「■体力」を追加
プレイヤーの残り体力。初期値5で、敵ミサイルに当たるたびに1減る。0以下でゲームオーバー
変数「■スコア」を追加
プレイヤーの獲得スコア。敵爆撃機を撃墜するたびに1加算される。スコアが高いほど敵ミサイルが速くなる
実装
( ) を ( ) にするで「■スコア」を0、「■体力」を5にセットするんだ。ゲーム開始時に毎回リセットされるから、何度でも最初からやり直せるよ。
#4ミサイル発射の仕組み
[talk class="m-l-n"]次はスペースキーで弾を撃てるようにしよう。ファイターがミサイルのクローンを作る仕組みだよ。[/talk]もし ( ) ならでスペースキーが押されたか判定して、押されてたらミサイルのクローンを生成。直後に( ) 秒待つで0.1秒待つことで連射速度を制御してるんだ。
この0.1秒がないとフレームごとに弾が出まくって画面が弾だらけになる。待ち時間の値を変えれば連射の間隔を自由に調整できるよ。
#5ミサイルの初期化
[talk class="m-l-n"]ファイターの操作ができたから、次はミサイルスプライトの設定に移るよ。[/talk]準備
スプライト「ミサイル」を開く
| スプライトについて |
|---|
| プレイヤーの戦闘機から発射される弾。上方向に飛び続け、敵爆撃機に当たるとスコアを加算して消える |
| どんな役割か |
| 戦闘機が撃つ弾だよ。スペースキーで生まれて上に飛んでいって、敵に当たったらスコアが増えるようにしよう! |
実装
ミサイルの本体は隠すで非表示にして、大きさを20%に。本体は「設計図」の役割で、実際に飛ぶのはクローンの方なんだ。
#6ミサイルの飛行
[talk class="m-l-n"]クローンが生まれたら、まずファイターの位置に移動して表示するよ。そこから上に向かって飛んでいく処理。[/talk]クローンされたときでクローンがスタートしたら、ファイターの位置から出発してy座標を ( ) ずつ変えるでy座標を10ずつ増やし続ける。これで弾が上に飛んでいく動きが完成だよ。
#7敵爆撃機のワープ
[talk class="m-l-n"]弾が飛ぶようになったから、次は撃つ相手を用意しよう。敵爆撃機はランダムな位置にワープし続ける動きをするよ。[/talk]準備
スプライト「敵爆撃機」を開く
| スプライトについて |
|---|
| 画面上部にランダムな位置でランダムな間隔で出現する敵。ミサイルが当たると撃墜される |
| どんな役割か |
| ランダムに現れる敵の爆撃機だよ。画面上の方をうろうろして、ミサイルで倒せるようにしよう! |
実装
x座標を ( ) 、y座標を ( ) にするのx座標に-230〜230、y座標に0〜130の乱数を入れて、画面上部のどこかにランダム出現させるんだ。( ) 秒待つに0.5〜2.0秒の乱数を入れることで、出現タイミングも毎回バラバラになる。
乱数で位置も時間も変わるから、プレイヤーは次どこに出るか予測できないんだよ。シューティングの緊張感を生み出す仕組みなんだ。
#8敵への命中判定
[talk class="m-l-n"]敵爆撃機の動きができたから、ミサイルスプライトに戻って命中判定を作っていくよ。弾が敵爆撃機に当たったらスコアが増える仕組みだ。[/talk]準備
スプライト「ミサイル」を開く
メッセージ「敵撃破」を追加
ミサイルが敵爆撃機に命中して撃墜したときに送信するメッセージ
実装
( ) に触れたで敵爆撃機に触れたかチェックして、当たったらCollectの音を鳴らして「■スコア」を1増やす。「敵を撃破」メッセージも送信してるよ。
当たり判定の後に( ) 秒待つで0.1秒待ってからクローンを削除するんだ。この間があることで、音が途切れるのを防いでる。
#9ミサイルの後片付け
[talk class="m-l-n"]敵に当たらず画面の端まで飛んでいったミサイルも、ちゃんと消す必要があるよ。[/talk]端に触れたらこのクローンを削除するでクローンを削除する。クローンを放置すると300個の上限にすぐ達して新しい弾が撃てなくなるから、地味に大事な処理。
#10敵ミサイルの生成
[talk class="m-l-n"]ミサイルの処理が完成したから、今度は敵側の攻撃を作っていこう。敵ミサイルスプライトが自分自身のクローンを作り続ける仕組みだよ。[/talk]準備
スプライト「敵ミサイル」を開く
| スプライトについて |
|---|
| 敵爆撃機の位置からクローンとして落下してくる爆弾。プレイヤーに当たるとHPが1減る。スコアが高いほど落下速度が上がる |
| どんな役割か |
| 敵が落とす爆弾だよ。上から落ちてきてプレイヤーに当たるとHPが減るようにしよう!スコアが増えるほど速くなるよ! |
実装
( ) のクローンを作るで自分自身のクローンを生成し続けるのがベースの動き。本体は非表示にして、大きさ15%のクローンが実際に画面で飛ぶやつ。
#11敵弾のスピードと加速
[talk class="m-l-n"]敵ミサイルのクローンが生まれたら、敵爆撃機の位置から下に落ちてくる処理だよ。しかも「■スコア」によって弾の速さが変わるんだ。[/talk]もし ( ) ならでなければで「■スコア」が60未満かどうか判定して、60未満ならy座標を-10ずつ、60以上なら-15ずつ変える。スコアが上がると敵弾が速くなって、ゲームがどんどん難しくなる仕組み。
[talk]シューティングの難易度設計って、実はスコアをトリガーにするのが定番なんだ。固定の難しさだとすぐ飽きるし、時間経過で上げると下手な人が詰む。スコアに連動させると「上手い人ほど難しくなる」から、誰が遊んでもちょうどいい緊張感が保てる。プロのゲームでもこの考え方はよく使われてるよ。[/talk]
#12発射間隔の段階制御
[talk class="m-l-n"]敵弾の落下速度だけじゃなく、発射間隔もスコアに応じて変化させるよ。これがこの作品のキモになるテクニック。[/talk]「■スコア」が20未満なら0.2秒待って、さらに40未満なら0.1秒待つんだ。最後に全員共通で0.2秒待つ。つまり序盤(20点未満)は合計0.5秒間隔、中盤(20〜39点)は0.3秒間隔、終盤(40点以上)は0.2秒間隔になるんだよ。
普通はタイマーで一律に間隔を管理するけど、この作品ではもし ( ) ならの条件ウェイトを重ねて3段階の変化を作ってる。条件をすり抜けるほどウェイトが減る発想、けっこう賢いよね。
#13プレイヤーへのダメージ
[talk class="m-l-n"]敵ミサイルがファイターに当たったらダメージを受ける処理を追加するよ。端に到達した弾の削除もここで。[/talk]( ) に触れたでファイターに触れたらCrunchの音を鳴らして「■体力」を1減らし、クローンを削除するんだ。端に触れた場合もそのまま削除するよ。
当たった瞬間にクローンを消すから、1発で複数回ダメージを受けることはないよ。
#14ピンチ演出
[talk class="m-l-n"]敵ミサイルの処理が完成したから、ファイターに戻ってゲーム進行の演出を作ろう。「■体力」の残りに応じて背景を切り替える仕組みだよ。[/talk]準備
スプライト「ファイター」を開く
実装
最初に背景を「Blue Sky 2」にセットして、ずっとのなかで「■体力」が1になったら背景を「ピンチ」に切り替える。残りHP1で画面の雰囲気がガラッと変わるから、プレイヤーに危機感が伝わるやつ。
#15ゲームオーバー処理
[talk class="m-l-n"]「■体力」が0以下になったらゲーム終了だよ。背景を変えてメッセージを出してから全部止める処理。[/talk]まず でスプライトの他のスクリプトを止めて、背景を「GameOver」に切り替えるんだ。「やられた!脱出する」と1秒表示してから、すべてを止めるよ。
「スプライトの他のスクリプトを止める」を先に実行するのがポイントだよ。これがないとHP判定のループが動き続けて、処理が衝突しちゃうんだよ。
#16雲の生成ループ
[talk class="m-l-n"]ファイターのゲームオーバー処理が完成したから、最後に雲スプライトで背景演出を作ろう。[/talk]準備
スプライト「雲」を開く
| スプライトについて |
|---|
| 宇宙空間の雰囲気を演出する装飾用の雲。ランダムなサイズと透明度で画面上から下へスクロールする |
| どんな役割か |
| 背景を流れる雲だよ。ランダムな大きさと透明度で上から落ちてきて、宇宙っぽい雰囲気を出そう! |
実装
本体を非表示にして、ずっとでy座標を200(画面の上の外)にセットしてからクローンを作る。( ) 秒待つに0〜1秒の乱数を入れて、雲の出現タイミングをバラけさせてるんだ。
#17雲のランダム設定
[talk class="m-l-n"]クローンが生まれたら、x座標・大きさ・透明度をすべて乱数で決めるよ。同じ雲でも1つ1つ見た目が違うようにする。[/talk]x座標は-255〜255のランダム、大きさは50〜100%のランダム、「幽霊」の効果を10〜80のランダムに設定。大きい雲は近くに見えて、小さい雲は遠くに見える――この大きさの違いが次のステップで効いてくるよ。
#18パララックスに雲が流れる
[talk class="m-l-n"]雲を最背面に送って表示したら、いよいよ落下の処理だよ。ここがこの作品の面白いテクニック。[/talk]y座標を ( ) ずつ変えるの値に「0 − 大きさ ÷ 10」を入れてるんだ。大きさが100の雲は-10ずつ落ちて、大きさ50の雲は-5ずつ落ちる。大きい(近い)雲ほど速く、小さい(遠い)雲ほどゆっくり動くから、追加の変数なしで奥行き感が生まれるよ。
[talk]この「近いものは速く、遠いものは遅く動く」テクニックはパララックス(視差効果)って呼ばれてるんだ。電車の窓から外を見ると、近くの電柱はビュンビュン飛んでいくのに遠くの山はほとんど動かないよね。あれと同じ原理を、スプライトの大きさプロパティだけで再現してるのが面白いとこ。[/talk]
#19雲の削除判定
[talk class="m-l-n"]画面の下までいった雲はクローンを削除して、リソースを解放するよ。[/talk]y座標が-160より下になったらこのクローンを削除するで消す。上から次々新しいクローンが生まれて、下で消えて、を繰り返すことで無限に雲が流れ続ける仕組みの完成。
まとめ
宇宙シューティングゲームが完成したね!クローンで弾を管理する仕組みと、スコアで難易度を上げる設計の両方を実装できたはず。パララックス背景の雲のテクニックも、追加変数なしで奥行き感を出せるからぜひ覚えておいて。自分流にアレンジして、もっと激しいシューティングに仕上げてみよう!