スクラッチコーチキャンプ スクラッチで使える無料素材集
  • 素材
  • 修行
  • はじめての方へ
  • スクラッチゲームの作り方

    #024 攻撃シューティングゲームっぽい作品の作り方|クローンと確率で縮むほど強くなるモンスター実装

    #024 攻撃シューティングゲームっぽい作品の作り方|クローンと確率で縮むほど強くなるモンスター実装
    この記事は スクラッチコーチで掲載されているオリジナル記事 のバックアップです。
    スターター作品
    なし
    今回の完成サンプル
    なし
    [soy-series name="はじめてのスクラッチ"]

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

    動画で見てみよう

    [talk]チャンネル登録して応援よろしく!チャンネル登録する[/talk]

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

    [prj-embed prj="1319670461" mini="1" title="プレイしておこう" prj-title="sb3_20260508230657" prj-author="ok-scratch"]今回の[prj-link prj="1319670461" title="sb3_20260508230657" author="ok-scratch"]スクラッチを作る参考作品[/prj-link]です。モンスターを追い詰めると逆に反撃が激しくなる──この仕掛け、ヤバくない?モンスターの大きさを確率の基準にしてて、弾を当てて縮めるほど反撃してくる頻度がグングン上がるんだ。「ランダム(1〜10) > 大きさ÷10」っていう数式1本でゲームバランスが動いてるのがキレッキレ。クローンと確率を組み合わせたシューティングの仕組みを、一緒に見ていこう。参考資料:スクラッチプログラミング事例大全集[/prj-embed]

    今回の目標

    • 矢印キーでエースを左右に動かす
    • スペースキーで攻撃を発射してモンスターを攻撃する
    • モンスターが縮むほど反撃が激しくなり、大きさ9%未満でゲームクリア

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

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

    #1エースの初期設定

    [talk class="m-l-n"]前回もスクラッチでゲームを作ったよね。今回はシューティングゲームに挑戦するよ!矢印キーでエースを動かして、攻撃の弾でモンスターを倒すゲームだ。[/talk]

    準備

    スプライト「エース」を開く

    エースエース
    スプライトについて
    プレイヤーが操作する攻撃使いキャラクター。左右の矢印キーで移動し、スペースキーでエースの攻撃を発動する。
    どんな役割か
    エースっていうキャラを動かせるようにするよ!矢印キーで左右に動けて、スペースを押したら攻撃が出るようにするんだ。効果音やBGMもつけていくよ!

    実装

    step-0

    まずは旗が押されたときの初期設定。見た目大きさを ( ) %にするで大きさを30%にして向きを90度(右向き)に合わせたら、x座標0・y座標-130の位置に配置するよ。画面の下のほうにエースがスタンバイする形になるんだ。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    旗を押すとエースがキュッと小さくなって、画面の下のほうにスッと移動したよね。ここがスタート位置になる感じ。

    #2左右の移動

    [talk class="m-l-n"]エースを矢印キーで左右に動かせるようにしよう。[/talk] step-1

    制御ずっとの中で、右向き矢印キーが押されたらx座標を10ずつ増やし、左向き矢印キーが押されたら10ずつ減らすよ。制御もし ( ) ならを2つ並べて、それぞれのキー入力をチェックする仕組みだね。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    右と左の矢印キーを押してみて。エースが左右にスイスイ動くようになったよ。シューティングの基本っしょ。

    #3攻撃の発射

    準備

    メッセージ「エースの攻撃発動」を追加

    エースがスペースキーを押したときに送信するメッセージ。MagicBallにエースの攻撃の弾を生成させる。

    メッセージ「エースの攻撃発動」を追加

    実装

    step-2

    次はスペースキーでエースの攻撃を発射するトリガーだ。別のイベントgreenflag が押されたときから始まる新しいスクリプトとして作るよ。

    スペースキーが押されたら「エースの攻撃発動」メッセージをイベント( ) を送るで送信するんだ。ポイントは制御( ) まで待つで、スペースキーが離されるまで待つこと。長押ししても1発だけ撃てる仕組みにしてるよ。

    移動処理と別のスクリプトにしている理由は、同じ「ずっと」ブロックに入れちゃうと、「〜まで待つ」が左右の動きまで止めちゃうから。この「処理の分離」はゲーム制作でめちゃくちゃ大事な考え方なんだ。

    #4攻撃の準備

    [talk class="m-l-n"]エースの基本操作ができたから、次は攻撃スプライトを準備していこう。[/talk]

    準備

    スプライト「攻撃」を開く

    攻撃攻撃
    スプライトについて
    エースの攻撃とモンスターの攻撃の弾として使われるクローンスプライト。ball_typeに応じて色やサイズが変わり、端や他スプライトに当たると消える。
    どんな役割か
    攻撃の弾を作るよ!エースの攻撃とモンスターの攻撃の2種類があって、クローン機能を使って複数の弾を同時に飛ばせるようにしていくよ。

    変数「球の種類」を追加

    クローンが何の攻撃の弾かを識別する変数。「なし」「エースの攻撃」「モンスターの攻撃」のいずれかが入る。

    変数「球の種類」を追加

    実装

    step-3

    旗が押されたら「球の種類」変数を「なし」にして、スプライトを隠す。この攻撃は本体が画面に出ず、クローンだけを作り出す「工場」の役割なんだ。

    #5クローンの動き

    [talk class="m-l-n"]クローンが生まれたあとの動きを作るよ。[/talk] step-4

    制御クローンされたときでクローンを表示して、制御ずっとの中で動き( ) 歩動かすを使い10歩ずつ進む。これだけでクローンが生成された向きにまっすぐ飛んでいくんだ。

    #6クローンの消滅

    [talk class="m-l-n"]弾がずっと飛び続けたらスクラッチが重くなっちゃう。消えるタイミングが必要だよ。[/talk] step-5

    画面の端に触れたとき、エースに触れたとき、モンスターに触れたとき──この3つの条件を演算( ) または ( )でまとめて判定するんだ。どれか1つでも当てはまったら0.1秒待ってからクローンを削除するよ。少し待つのは、衝突した瞬間を相手側が検知するための猶予だね。

    [talk]スクラッチではクローンは最大300個までしか一度に作れない、という制限もある。だからクローンを片付けるのはけっこう大切な作業だったりする[/talk]

    #7攻撃のガード

    [talk class="m-l-n"]ここからが面白い。「エースの攻撃発動」メッセージを受け取ったときの処理を作るよ。[/talk] step-6

    最初に「球の種類」変数が「なし」と等しくなかったら、制御 でこのスクリプトを止める。これはクローンにメッセージが伝わるのを防ぐガードなんだ。メッセージって親スプライトだけじゃなくてクローン全員にも届いちゃうからね。

    ガードを通過したら「球の種類」を「エースの攻撃」にセットする。[talk]ここで使っているのは「1つのスプライトで2種類のクローンを管理する」パターンなんだよ。普通は弾の種類ごとに別スプライトを用意するけど、この作品では「球の種類」変数ひとつでエースの攻撃とモンスターの攻撃を切り替えてる。スプライトの数を減らせるし、あとで弾の種類を増やすのも変数の値を追加するだけでいけるから、拡張性もバッチリなんだ。[/talk]

    #8エースの攻撃の生成

    [talk class="m-l-n"]ガードを通ったあと、実際にクローンを作って飛ばす処理だよ。[/talk] step-7

    「色」の効果を100にして見た目を変え、大きさを50%にしたら、向きを0度(真上)にセット。調べる( ) の ( )でエースのx座標を取得して、そこからy座標-90の位置にワープするんだ。エースの少し上から弾がスポーンする形だね。

    最後に制御( ) のクローンを作るでクローンを作ったら、「球の種類」を「なし」に戻す。この「使ったら元に戻す」がガードと連動していて、次のメッセージを受けられる状態にリセットしてるよ。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    スペースキーを押すとエースからエースの攻撃の弾が上に飛んでいくよ。キーを離すまで次の弾は出ない仕組み。

    #9モンスターの初期化

    [talk class="m-l-n"]攻撃の仕組みが完成したから、いよいよ敵のモンスターを作っていこう。[/talk]

    準備

    スプライト「モンスター」を開く

    モンスターモンスター
    スプライトについて
    左右に動き回る敵キャラクター。攻撃の弾に当たるたびに縮み、十分に小さくなるとゲームクリアになる。
    どんな役割か
    モンスターの動きを作るよ!左右にランダムに動いて、攻撃の弾が当たったら縮んでいくようにするんだ。倒したらゲームクリア!

    変数「移動方向」を追加

    モンスターの横移動の方向を表す変数。1で右方向、-1で左方向に動く。

    変数「移動方向」を追加

    実装

    step-8

    旗が押されたら「移動方向」変数を1にセットして、画像効果をクリア、大きさを100%にする。「移動方向」は1なら右、-1なら左。掛け算ひとつで方向を反転できる、シンプルだけど便利な仕組みだよ。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    まだ何もしないけど、とりあえず表示されるようになった

    #10モンスターの移動

    [talk class="m-l-n"]モンスターを画面上で動かしていくよ。[/talk] step-9

    表示して向きを右向きにし、x座標0・y座標60に配置する。制御ずっとの中で、1〜10のランダムな数に「移動方向」を掛けた値だけx座標を変えるんだ。ランダムが入ることで動きに予測しにくいゆらぎが出る。

    #11方向転換

    [talk class="m-l-n"]モンスターが端にぶつかったときの反転処理を入れよう。[/talk] step-10

    調べる( ) に触れたで端に触れたかチェック。触れていたら「移動方向」に-1を掛けた値をセットするんだ。1なら-1に、-1なら1に。変数に-1を掛けるだけで方向が反転するのは、ゲーム制作でよく使われるテクニックだよ。

    画面端でハマってしまうバグはこれで直る。画面端で最大の移動幅である10の分だけ逆方向に移動させればOK、っていう理屈。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    モンスターが画面上のほうで左右にランダムに動き始めたね。スピードが毎回変わるから動きが読めない。

    #12被弾の音と色

    [talk class="m-l-n"]モンスターが攻撃の弾に当たったときの演出を作ろう。[/talk] step-11

    新しいイベントgreenflag が押されたときスクリプトで制御ずっとループを回して、攻撃に触れたら効果音「Croak」を鳴らし、「色」の効果を25ずつ変える。色がコロコロ変わることで「ダメージを受けた!」ってのがひと目でわかるね。

    #13縮小とノックバック

    [talk class="m-l-n"]色だけじゃ物足りないよね。弾に当たるたびにモンスターが縮んで、上方向にノックバックする演出も追加しよう。[/talk] step-12

    大きさを-10ずつ、y座標を10ずつ変えたら1秒待つ。当たるたびにどんどん小さくなっていくんだ。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    モンスターが端で反転するようになって、攻撃の弾が当たると音が鳴って色が変わる。そしてちょっと小さくなってノックバックする。ダメージ演出ってやつ。

    #14ゲームクリア

    [talk class="m-l-n"]モンスターが十分小さくなったら、ゲームクリアの演出に入るよ。[/talk] step-13

    まず制御 でスプライトの他のスクリプトを止めてから、「Ya」を鳴らしてモンスターを隠す。そのあと「Win」の効果音を最後まで再生して、すべてを止めてゲーム終了だ。

    他のスクリプトを先に止めるのは、勝利演出中にモンスターがまだ動いたり被弾処理が走ったりするのを防ぐため。この「先に止めてから演出」の順番が大事なんだ。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    弾が当たるたびにモンスターが縮んで浮いていくよ。十分に小さくなったら勝利の音が鳴ってゲームクリア。

    #15反撃の仕組み

    [talk class="m-l-n"]ここからモンスターの反撃を作るよ。一方的に撃つだけじゃゲームとしてぬるいからね。[/talk]

    準備

    メッセージ「モンスターの攻撃発動」を追加

    モンスターがランダムなタイミングで送信するメッセージ。MagicBallにモンスターの攻撃の弾を生成させる。

    メッセージ「モンスターの攻撃発動」を追加

    実装

    step-14

    新しいスクリプトで、1〜10のランダムな数がモンスターの大きさ÷10より大きいとき、「モンスターの攻撃発動」メッセージを送信して1秒待つ。

    [talk]この「ランダム(1〜10) > 大きさ÷10」って条件、実はかなり巧みなゲームデザインなんだよ。モンスターの大きさが100%のときは「10より大きい」になるから、条件を満たすことは絶対にない。でも弾を当てて50%まで縮めると「5より大きい」になって、約半分の確率で反撃してくる。追い詰めるほど反撃が激しくなる──これが最後までスリリングなゲーム体験を生み出す秘訣なんだ。[/talk]

    #16モンスターの攻撃ガード

    [talk class="m-l-n"]モンスターの反撃ロジックができたから、再び攻撃スプライトに戻ろう。[/talk]

    準備

    スプライト「攻撃」を開く

    攻撃
    攻撃

    実装

    step-15

    「モンスターの攻撃発動」メッセージを受け取ったときの処理は、エースの攻撃のときと同じ構造だよ。「球の種類」が「なし」じゃなければスクリプトを止めるガードを入れて、通過したら「モンスターの攻撃」にセットする。同じガードパターンの使い回しだね。

    #17モンスターの攻撃の見た目

    [talk class="m-l-n"]モンスターの攻撃はエースの攻撃と見た目もサイズも違うものにするよ。[/talk] step-16

    「色」の効果を0にして元の色に戻し、大きさは「100からモンスターの大きさを引いた値」にセット。モンスターが縮んでるほど弾は大きくなるってこと。向きは180度(真下)で、エースに向かって降ってくるんだ。

    調べる( ) の ( )でモンスターの大きさをリアルタイムに取得してるのがミソ。追い詰めるほど大きくてヤバい弾が降ってくるから、プレイヤーは油断できないわけ。

    #18モンスターの攻撃の生成

    [talk class="m-l-n"]モンスターの攻撃のクローンを実際に生成しよう。[/talk] step-17

    x座標は-255〜255のランダム、y座標はモンスターのy座標から90引いた位置に移動して、制御( ) のクローンを作るでクローンを作る。ランダムなx座標から降ってくるから、どこに落ちるか予測できないスリルがあるよ。

    最後に「球の種類」を「なし」に戻してリセット完了。エースの攻撃と同じパターンだね。

    確認プレビューしておこうという口コミを寄せてくれた方 確認プレビューしておこう
    モンスターが小さくなるほど反撃の確率が上がるロジックを仕込んだ。追い詰めるほどヤバくなる的な。

    #19BGMのループ

    [talk class="m-l-n"]バトル中のBGMをずっと流す仕組みを作るよ。[/talk]

    準備

    スプライト「エース」を開く

    エース
    エース

    実装

    step-18

    制御ずっとの中に終わるまで ( ) の音を鳴らすを入れるよ。「Video Game 1」が最後まで再生されたらすぐ頭から再び鳴り出す、無限ループBGMの完成だね。

    #20エースの被弾演出

    [talk class="m-l-n"]最後に、エースがモンスターの弾に当たったときの演出を追加するよ。[/talk] step-19

    攻撃に触れたら見た目( ) の効果を ( ) にするで「色」の効果を25にセットして、1秒後に画像効果をクリア。ダメージを受けたことが一瞬の色変化でわかる仕組みだ。

    これでゲームの全機能が揃ったよ!エースが攻撃を撃ち、モンスターが縮みながら反撃してくる、スリリングな攻撃バトルの完成。次回もまた新しいゲームを作っていくから、お楽しみに!

    まとめ

    クローンで2種類の弾を使い分けるパターン、面白かったでしょ?1つのスプライトと変数だけで複数タイプを管理できるって、めちゃ応用の利く考え方だよ。モンスターの反撃ロジックも、変数と確率を組み合わせたシンプルな仕組みなのに緊張感があって最高。ぜひアレンジして、自分だけの攻撃シューティングを作ってみて!

    ブクマよろしくお願いします!という口コミを寄せてくれた方 ブクマよろしくお願いします!
    どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!