- スターター作品
- なし
- 今回の完成サンプル
- なし
さぁ、スクラッチでナニ作る!?
動画で見てみよう
[talk]チャンネル登録して応援よろしく!チャンネル登録する[/talk]チュートリアルの元になった作品
[prj-embed prj="1325082501" mini="1" title="プレイしておこう" prj-title="sb3_20260524152128" prj-author="ok-scratch"]今回の[prj-link prj="1325082501" title="sb3_20260524152128" author="ok-scratch"]スクラッチを作る参考作品[/prj-link]です。子スライムが魔法弾に当たっても消えないのがマジでイカす。ふつうのシューティングなら敵弾を撃ち落とせば終わりだけど、この設計だと弾かれてランダムな方向に縮みながら飛んでいくだけ。完全には排除できない脅威がフィールドに漂い続けるから、大スライムを狙いながら子スライムを往なす2ライン思考が常に求められてくる。この緊張感の作り方、見ていこう。参考資料:スクラッチプログラミング事例大全集[/prj-embed]今回の目標
スターター作品をリミックスしよう
このチュートリアルにはスターター作品があります。使わなくても大丈夫だけど、最低限の素材などが用意されてるので便利です。
スターター作品をダウンロード
#1魔法少女の移動①
[talk class="m-l-n"]ここまでのシリーズでいろんなゲームを作ってきたけど、今回は上下左右に動けるシューティングゲームに挑戦。魔法少女がスライムを倒していく全方向シューティングを作っていくよ。[/talk]準備
スプライト「魔法少女」を開く
| スプライトについて |
|---|
| プレイヤーが操作する魔法少女。矢印キーまたはWASDで移動し、マウス方向を向く。スペースキーまたはクリックで魔法弾を発射する。魔力が尽きるとゲームオーバー。 |
| どんな役割か |
| プレイヤーキャラの魔法少女を作ろう!キーボードで動かして、スペースやクリックで魔法弾をバンバン飛ばすよ。魔力がなくなったらゲームオーバーだから、スライムにぶつかりすぎちゃダメだよ! |
実装
まず魔法少女の初期設定から。大きさを ( ) %にするでサイズを40%にして、x座標を ( ) 、y座標を ( ) にするで画面下部の(0, -140)に配置するんだ。
ずっとループの中で、マウスのポインターに向き続ける処理と移動する処理を入れていく。マウスで照準を合わせながらキーボードで移動する、いわゆるツインスティック操作みたいだね。
#2移動の追加
矢印とW A S Dで移動する処理を追加。y座標を ( ) ずつ変えるにマイナスの値を入れると下に動くし、x座標を ( ) ずつ変えるにプラスの値で右に動く仕組みなんだ。
( ) または ( )で2つのキー判定をまとめてるから、どっちのキーを使ってもOKだよ。値を変えるだけでスピード調整もカンタンだよね。
#3歩行アニメーション
動きに合わせてコスチュームが切り替わるアニメーションを付けよう。別の
ずっとの中で次のコスチュームにすると0.2秒の待機を繰り返す。0.2秒間隔だから、1秒で5コマ切り替わる計算で、ゲーム中ずっとパタパタ歩いてるように見えるんだよ。
#4スコアと魔力の準備
[talk class="m-l-n"]ここで魔法少女のスプライトに戻ってスコアとライフを管理する変数を用意しよう。[/talk]準備
変数「■倒した数」を追加
倒したスライムの総数。スコアとしても使用され、スライムの出現速度にも影響する
変数「■魔力」を追加
プレイヤーの魔力残量。スライムに触れると減少し、0になるとゲームオーバー
実装
「■倒した数」を0に、「■魔力」を10にセット。変数 ( ) を表示するで「■倒した数」をステージに表示するよ。魔力は10からスタートして、敵に当たるたびに減っていくんだ。
#5ゲームオーバー判定
準備
スプライト「大スライム」を開く
実装
ゲームオーバーの判定を作っていく。ずっとで常時チェックして、魔力が1未満になったら「魔力切れ!」と1秒間言ってから全停止させる。
ここで( ) < ( )で「■魔力 < 1」と判定しているのがポイント。大スライムに当たると魔力が一度に3減るから、10→7→4→1→-2みたいにマイナスになる場合があるんだよ。
「= 0」だと-2のときに引っかからないけど、「< 1」なら確実にキャッチできるってこと。だから「< 1」にしておくのが安全だよ。
#6BGMの追加
ずっとの中で終わるまで ( ) の音を鳴らすを使って「Dance Magic」をループ再生する。
#7大スライムの初期設定
[talk class="m-l-n"]魔法少女の基本操作ができたから、次は敵の大スライムを作っていこう。[/talk]準備
スプライト「大スライム」を開く
| スプライトについて |
|---|
| 上から落下してくる大型の敵スライム。プレイヤーに触れると魔力を3減らす。魔法弾が当たると明滅エフェクトで反応するが倒せない。 |
| どんな役割か |
| 上からゆっくり降ってくる大スライムを作るよ!プレイヤーに当たると魔力がどんどん減る強敵だよ。魔法弾が当たるとぴかっと光るエフェクトも付けよう! |
実装
旗クリックでサイズを100%にして、画像効果をなくすで画像効果をリセット。初期位置はx座標を-230〜230のランダム、y座標は130固定で、画面上部のどこかからスタートするんだ。
#8大スライムの移動
大スライムを表示して、ゆっくり落ちてくる動きを作るよ。ずっとの中でy座標を-3ずつ変えると、毎フレーム少しずつ下に降りてくるんだよ。
#9衝突ダメージとリスポーン
[talk class="m-l-n"]魔法少女に触れたら「魔力」を-3して、大スライムは画面上部のランダム位置にワープさせるんだ。[/talk]準備
スプライト「大スライム」を開く
実装
端に触れた場合も同じくランダム位置にリスポーン。x座標を ( ) 、y座標を ( ) にするで-230〜230のランダムなx座標、y座標は130に戻す。大スライムは何度でも上から降ってくるエンドレス仕様だよ。
[talk]でも魔法少女がダメージを受けたことが分かりづらいね!いいアイデアある?このあと的には被弾エフェクトを作るから、それを参考に魔法少女にも被弾エフェクトを付けるにはどうしたらいいか、余裕がある人はチャレンジしてみて。ブロックを消したり場所を変えたりしてもOKだから、自由に実装することを楽しんでね。[/talk]
#10魔法弾の初期設定
[talk class="m-l-n"]敵の動きができたから、次はプレイヤーの攻撃手段。魔法弾スプライトの準備をしよう。[/talk]準備
スプライト「魔法弾」を開く
| スプライトについて |
|---|
| プレイヤーが発射する魔法弾。スペースキーまたはマウスクリックでクローンが生成され、マウスの方向へ直進する。スライムに当たると消えて倒した数を1増やす。 |
| どんな役割か |
| プレイヤーが撃つ魔法弾を作るよ!スペースかクリックで弾がポンポン飛んでいく仕組みを作ろう。スライムに当たったら消えて、倒した数がカウントされるようにするよ! |
実装
旗クリックで隠すして非表示にして、サイズを20%に設定。本体は「設計図」として画面に出さず、クローンだけが実際に飛んでいく仕組みなんだよ。
#11魔法弾の発射
[talk class="m-l-n"]魔法弾の準備ができたから、魔法少女のスプライトに戻って弾の発射処理を作ろう。スペースキーかマウスクリックで魔法弾のクローンを生成するよ。[/talk]準備
スプライト「魔法少女」を開く
実装
もし ( ) ならの中で( ) のクローンを作るを使って魔法弾のクローンを作り、直後に0.25秒の待機を入れる。この待機が連射間隔の制限になっていて、0.25秒より短い間隔では撃てない。数値を小さくすれば、マシンガンみたいな連射も可能だよ。
#12魔法弾の飛翔
準備
スプライト「魔法弾」を開く
実装
発射のトリガーができたから、魔法弾スプライトに戻ってクローンが生まれたあとの動きを作るよ。クローンされたときで始動したら、まず魔法少女の位置に移動してマウスの方向を向く。
表示したあとずっとで10歩ずつ前進し続ける。発射時点でのマウスの方向がそのまま弾道になるから、一度飛び出したらまっすぐ飛んでいくだけだよ。
弾の軌道がマウスの位置で決まるから、狙いをつけて撃つ感覚がちゃんと出るのがいいよね。
#13命中判定
飛んでいく弾が大スライムに当たったときの処理を追加するよ。( ) に触れたで大スライムとの接触を検知したら、Pop音を鳴らして「■倒した数」を1増やす。
0.1秒だけ待ってからこのクローンを削除するでクローンを削除。命中した弾はちゃんと消さないと、クローンが際限なく増えて処理が重くなるんだ。
ヒット音+スコア加算+クローン削除っていう一連の流れ、シューティングの当たり判定では定番のパターンだよね。
#14弾の後片付け
画面の端まで飛んで外れた弾もきちんと消す処理。端に触れたらこのクローンを削除するで即削除。
クローンの後片付けは地味だけど大事なんだよ。スクラッチのクローン上限は約300体だから、使い終わったクローンをこまめに消さないと新しい弾が作れなくなったりするんだ。
#15被弾エフェクト①
[talk class="m-l-n"]魔法弾の弾道まわりが完成したから、大スライムに戻って被弾時のフィードバック演出を追加しよう。新しいスクリプトで魔法弾との接触を検知するよ。[/talk]準備
スプライト「大スライム」を開く
実装
ずっとの中で( ) に触れたをチェックして、魔法弾に触れたらCrunchの音を鳴らす。音が出ることで「ちゃんと当たった」感がプレイヤーに伝わるんだよね。
#16被弾フラッシュ
音だけじゃ物足りないから、視覚的なフィードバックも追加していくよ。( ) 回繰り返すで3回ループして、「明るさ」効果を100にしてから0.1秒後に0に戻す点滅を繰り返す。
( ) の効果を ( ) にするで「明るさ」を100にするとスプライトが真っ白に光って、0に戻すと元の色に戻る。この光る→戻るを3回やれば、ゲームでよくあるヒットフラッシュ演出の完成だね。
#17子スライムの量産
[talk class="m-l-n"]大スライムの動きが完成したから、次はプレイヤーを追いかけてくる子スライムを作るよ。これが攻撃をどんどん激しくしていくカギになるスプライトなんだ。[/talk]準備
スプライト「子スライム」を開く
| スプライトについて |
|---|
| 大スライムから生まれるクローンの小型敵スライム。プレイヤーを追いかけて魔力を1減らす。倒した数が増えるほど移動速度が上がる。魔法弾に当たるたびにサイズが縮む。 |
| どんな役割か |
| プレイヤーをぐんぐん追いかける子スライムを作ろう!倒した数が増えるとどんどん速くなるよ。魔法弾を当てるとだんだん小さくなっていく面白い仕組みも実装するよ! |
実装
旗クリックで隠すして本体を隠し、サイズを70%に設定。ずっとの中で( ) のクローンを作るを回して、自分自身のクローンをひたすら生成し続ける。
魔法弾と同じで、本体は非表示のまま「量産機」として裏で動く設計だね。
#18難易度カーブ
[talk class="m-l-n"]子スライムの出現間隔を「■倒した数」に応じて変えていくのがここのポイント。ゲームの難易度を段階的に上げていくための重要なパートだよ。[/talk]2つのもし ( ) ならを順番に並べていて、「■倒した数」が20未満なら0.5秒待ち、40未満ならさらに0.2秒待つ。つまり序盤(20未満)は合計0.7秒間隔、中盤(20〜39)は0.2秒間隔、終盤(40以上)は待機なしで最速生成になる仕組みなんだ。
[talk]この「連続する条件ブロックで待機時間を積み上げる」パターン、地味だけどけっこう面白い仕組み。ふつうなら条件分岐で場合分けするところを、条件ブロックを並べて条件を満たすたびに待機が加算されるから、難易度が3段階に自然と切り替わる。しかも待機時間の組み合わせだけで制御してるから、コードがシンプルなまま複雑な難度曲線が作れるってこと。ゲーム作りでけっこう使えるテク。[/talk]
#19子スライムの追尾
クローンが生まれたら、大スライムの位置からスタートして魔法少女に向かって飛んでいく動きを作るよ。クローンされたときで始動したら、大スライムの場所に移動して魔法少女の方を向く。
移動速度にも難度変化が入っていて、もし ( ) ならでなければで「■倒した数」が60未満なら3歩ずつ、60以上なら5歩ずつ進むよ。
生成間隔が速くなるだけじゃなく弾速まで上がるから、終盤はかなりの激戦になるんだよね。
#20子スライムの衝突処理
[talk class="m-l-n"]子スライムが魔法少女に当たったら「■魔力」を1減らしてクローン削除。大スライムの-3ダメージと比べると軽いけど、数が多いから累積ダメージがジワジワ効いてくるんだよ。[/talk]端に触れたときもクローン削除で後片付けだよ。魔法弾と同じく、画面外に出たクローンはちゃんと消してリソースを解放するのが鉄則。
#21子スライムの偏向①
ここからが子スライムの面白いところ。もうひとつのクローンされたときスクリプトで、魔法弾が当たったときのリアクションを作るよ。
ふつうのシューティングなら弾に当たった敵は消えるよね。でもこの子スライムは消えないんだ。( ) に触れたで魔法弾との接触を検知したら、まず音を鳴らす
#22子スライムの偏向②
音のあと、( ) へ向けるでどこかの方向にランダムで向きを変えて、大きさを ( ) ずつ変えるでサイズを-10する。弾が当たるたびにちょっとずつ小さくなっていくんだ。
[talk]この「倒せないけど弾ける」仕組み、ゲームデザイン的にうまい。スコアは大スライムに直接当てないと増えないから、子スライムを撃つのは防御的なアクション。完全には排除できない脅威がずっと残るから、プレイヤーはつねに緊張感を持ってプレイすることになる。弾の方向がランダムに変わるのも、予測不能な動きが生まれてゲームに変化をつけてくれるとこ。[/talk]
まとめ
これで魔法少女シューティングゲームの完成!クローンで弾や敵を管理しながら、得点に応じて難易度が変わる仕組みも作れたね。子スライムが消えずに偏向する独特のゲームデザインも、コードを見てみると意外とシンプルな仕組みで実現できてるんだよ。次回もまた別の作品でスクラッチを楽しんでいこう!