scratch

Scratchでシューティングゲームを作ろう!初心者でもできる手順

ブログ / scratch / Scratchでシューティングゲームを作ろう!初心者でもできる手順

「ゲームを作ってみたいけど、何から始めればいいかわからない」——そんなふうに感じたことはありませんか。実は、Scratchを使えばプログラミング初心者でもシューティングゲームを作ることができます。この記事では、実際に手を動かしながら完成させるまでの流れを、つまずきやすいポイントも交えてお伝えします。

シューティングゲームってどんな仕組み?

シューティングゲームと聞くと、なんだか難しそうに思えるかもしれません。でも、よく観察してみると、基本の仕組みはとてもシンプルです。

大きく分けると、次の3つの要素でできています。

  • 自分のキャラクターを左右に動かす
  • を発射して飛ばす
  • 敵キャラクターが出てきて、弾が当たると消える

これだけ聞くと「自分にもできそう」と感じませんか。最初に全体像をつかんでおくと、一つひとつのステップが何のためにあるのか理解しやすくなります。私自身、最初は全体像を把握せずにいきなり作り始めてしまい、途中で何をしているのかわからなくなった経験がありました。まずは落ち着いて仕組みを知ることが大切だと感じています。

作り始める前に準備しておくこと

Scratchのプロジェクトを新規作成したら、まずは使うスプライトを整理しておきましょう。今回のゲームでは、以下の3つのスプライトを用意します。

スプライト名 役割 おすすめの素材
Player 自機 「Rocketship」や「Spaceship」
Bullet 「Ball」を小さくリサイズ
Enemy 「Bat」や「Ghost」など

スプライト名を英語にしておくと、プログラムの中で指定するときにわかりやすくなります。また、最初のうちにスプライトの大きさを調整しておくと、あとで当たり判定がうまくいかないというトラブルを防げます。Playerは大きさ60〜80%、Bulletは30%程度、Enemyは50〜70%程度にしておくのが目安です。

自機を動かして弾を発射してみよう

まずはScratchを開いて、自分のキャラクター(自機)を用意しましょう。Scratchにはたくさんのスプライト(キャラクター素材)が用意されているので、好きなものを選んでください。ロケットや宇宙船のスプライトを選ぶと、シューティングゲームの雰囲気が出ます。

自機を左右に動かす

自機の動きは「左矢印キーが押されたとき、x座標を-10ずつ変える」「右矢印キーが押されたとき、x座標を10ずつ変える」というブロックで作れます。「ずっと」ブロックの中に「もし〜なら」を入れて、キー入力を常にチェックする形です。

具体的には、Playerスプライトに以下のようなコードを組みます。

🟢 旗が押されたとき
  x座標を (0)、y座標を (-150) にする
  ずっと
    もし <[左向き矢印 v] キーが押された> なら
      x座標を (-10) ずつ変える
    end
    もし <[右向き矢印 v] キーが押された> なら
      x座標を (10) ずつ変える
    end
  end

最初の「x座標を0、y座標を-150にする」は、ゲームが始まったときに自機を画面の下中央に配置するための初期設定です。この一行がないと、前回遊んだときの位置からスタートしてしまうので、忘れずに入れておきましょう。

動かす数値を大きくすればスピードが上がりますし、小さくすれば慎重な動きになります。ここは好みで調整してみてください。「思ったより速すぎる」「遅すぎてつまらない」など、自分で遊んで調整するのもゲーム作りの楽しさの一つではないでしょうか。

画面の端で止まるようにする

このままだと、自機が画面の外に出てしまうことがあります。Scratchのステージはx座標が-240〜240なので、以下のように条件を追加すると画面内に収まるようになります。

🟢 旗が押されたとき
  x座標を (0)、y座標を (-150) にする
  ずっと
    もし <<[左向き矢印 v] キーが押された> かつ <(x座標) > (-230)>> なら
      x座標を (-10) ずつ変える
    end
    もし <<[右向き矢印 v] キーが押された> かつ <(x座標) < (230)>> なら
      x座標を (10) ずつ変える
    end
  end

「かつ」ブロックを使って、キーが押されていてなおかつ画面内にいるときだけ動くようにしています。こうした細かい制御を加えると、遊び心地がぐっとよくなります。

弾を発射する

次に弾のスプライトを作ります。小さな丸や光の玉のようなスプライトを用意して、スペースキーを押したら自機の位置から上に飛んでいくようにプログラムします。

ポイントは「クローン」という機能を使うことです。弾のスプライトそのものを動かすのではなく、「自分自身のクローンを作る」ブロックで弾のコピーを作り、そのクローンが上に飛んでいく仕組みにします。こうすることで、連続して弾を撃てるようになります。

Bulletスプライトのコードは次のようになります。

🟢 旗が押されたとき
  隠す
  ずっと
    もし <[スペース v] キーが押された> なら
      [Player v] へ行く
      [自分自身 v] のクローンを作る
      (0.3) 秒待つ
    end
  end

クローンされたとき
  表示する
  <<(y座標) > (180)> まで繰り返す>
    y座標を (10) ずつ変える
  end
  このクローンを削除する

いくつかのポイントを解説します。

  • 「隠す」: 元のスプライトは画面に表示せず、クローンだけが見える状態にします
  • 「Playerへ行く」: クローンを作る直前に自機の位置へ移動させることで、弾が自機から発射されたように見えます
  • 「0.3秒待つ」: この待ち時間がないと、スペースキーを押している間に大量の弾が出てしまいます。いわゆる「連射速度」の調整です
  • 「y座標が180より大きくなるまで繰り返す」: 画面の上端まで飛んだらクローンを削除します。削除しないとクローンがどんどん溜まってゲームが重くなる原因になります

正直に言うと、私は最初クローンを使わずに作ろうとして、弾が1発しか撃てない状態になってしまいました。同じところでつまずく方も多いかもしれませんので、ぜひクローン機能を使ってみてください。

敵キャラクターを登場させよう

自機と弾ができたら、次は敵キャラクターです。敵もスプライトとして用意し、画面の上のほうからランダムな位置に出現させます。

敵の動きを作る

敵の出現には、弾と同じく「クローン」を使います。一定の間隔でクローンを作り、それぞれが上から下へゆっくり降りてくるようにプログラムします。

Enemyスプライトのコードは以下のとおりです。

🟢 旗が押されたとき
  隠す
  ずっと
    (2) 秒待つ
    [自分自身 v] のクローンを作る
  end

クローンされたとき
  x座標を ((-200) から (200) までの乱数)、y座標を (170) にする
  表示する
  <<(y座標) < (-170)> まで繰り返す>
    y座標を (-3) ずつ変える
  end
  このクローンを削除する

「(-200)から(200)までの乱数」を使うことで、敵が毎回違う横位置から出現するようになります。これがないと、敵がいつも同じ場所から現れて単調なゲームになってしまいます。

敵の出現間隔や速さは、ゲームの難易度に直結します。最初はゆっくり、少なめに出現させるのがおすすめです。AとBどちらの速さがいいか迷ったら、まずは遅いほうで試して、物足りなければ速くするという進め方が失敗しにくいと感じました。

目安として、いくつかの設定パターンを載せておきます。

難易度 出現間隔 落下速度(y座標の変化)
かんたん 3秒 -2
ふつう 2秒 -3
むずかしい 1秒 -5

弾が当たったら敵を消す

敵のクローンに「もし弾に触れたなら、このクローンを削除する」というプログラムを追加します。Scratchでは「〜に触れた」という判定ブロックが用意されているので、それを使えば当たり判定は意外と簡単に実装できます。

先ほどのEnemyスプライトの「クローンされたとき」を、以下のように修正します。

クローンされたとき
  x座標を ((-200) から (200) までの乱数)、y座標を (170) にする
  表示する
  <<(y座標) < (-170)> まで繰り返す>
    もし <[Bullet v] に触れた> なら
      [スコア v] を (1) ずつ変える
      このクローンを削除する
    end
    y座標を (-3) ずつ変える
  end
  このクローンを削除する

繰り返しの中に「もしBulletに触れたなら」を追加しただけです。触れた瞬間にスコアを1増やし、クローンを削除しています。

当たり判定がうまくいかないときは、スプライトの大きさを確認してみてください。スプライトが小さすぎると弾がすり抜けてしまうことがあります。私も「プログラムは合っているはずなのに当たらない」と悩んだことがありましたが、原因はスプライトのサイズでした。こうした地味な部分の確認が大事だと気づかされました。

もう一つよくあるのが、弾の移動速度が速すぎて、1フレームで敵を飛び越えてしまうケースです。弾のy座標の変化量が大きすぎると感じたら、10から7や5に下げてみてください。

スコアをつけてゲームらしく仕上げよう

ここまでで基本の遊びはできていますが、スコアがあるとぐっとゲームらしくなります。

Scratchの「変数」機能を使って「スコア」という変数を作り、敵を倒すたびに1ずつ増やしていきます。ゲーム開始時にスコアを0にリセットすることも忘れずに設定しましょう。

Playerスプライトの旗が押されたときのコードの先頭に、以下を追加します。

🟢 旗が押されたとき
  [スコア v] を (0) にする
  x座標を (0)、y座標を (-150) にする
  ずっと
    ...(以下、先ほどと同じ)
  end

ゲームオーバーを実装する

さらに余裕があれば、以下のような工夫も加えてみてください。

  • ゲームオーバー判定: 敵が画面の下まで来たら「ゲームオーバー」と表示する
  • 効果音: 弾が当たったときや敵が消えるときに音を鳴らす
  • 背景の変更: 宇宙や空の背景に変えると雰囲気が出る

ゲームオーバーの仕組みは、「メッセージ」機能を使うときれいに実装できます。Enemyスプライトで、敵が画面下端まで到達したときに「ゲームオーバー」メッセージを送り、全スプライトがそのメッセージを受け取って動きを止めるようにします。

Enemyスプライトの「クローンされたとき」の末尾を修正します。

クローンされたとき
  x座標を ((-200) から (200) までの乱数)、y座標を (170) にする
  表示する
  <<(y座標) < (-170)> まで繰り返す>
    もし <[Bullet v] に触れた> なら
      [スコア v] を (1) ずつ変える
      このクローンを削除する
    end
    y座標を (-3) ずつ変える
  end
  [ゲームオーバー v] を送る
  このクローンを削除する

そしてPlayerスプライトに、メッセージを受け取ったときの処理を追加します。

[ゲームオーバー v] を受け取ったとき
  [すべてを止める v]

これだけだと突然止まるだけなので、もう少し演出を加えてみましょう。ステージ(背景)にも以下のコードを追加します。

[ゲームオーバー v] を受け取ったとき
  (Game Over) と (2) 秒言う
  [すべてを止める v]

効果音を追加する

Scratchには無料で使える効果音がたくさん用意されています。Enemyスプライトの「もしBulletに触れたなら」の中に「〇〇の音を鳴らす」ブロックを追加してみましょう。「Laser1」や「Pop」などの音がシューティングゲームに合います。

もし <[Bullet v] に触れた> なら
  [Laser1 v] の音を鳴らす
  [スコア v] を (1) ずつ変える
  このクローンを削除する
end

こうした細かい演出一つひとつが、遊ぶ人の体験を大きく変えます。全部を一度にやろうとすると大変なので、一つずつ追加していくのがおすすめです。完成したゲームを友達に遊んでもらうと、自分では気づかなかった改善点が見つかることもあるかもしれません。

さらにおもしろくするアレンジアイデア

基本のシューティングゲームが完成したら、自分なりのアレンジを加えてみましょう。ここでは、比較的かんたんに追加できる工夫をいくつか紹介します。

敵の種類を増やす

同じ敵ばかりだと単調になりがちです。2種類目の敵スプライトを作り、コスチュームや速さを変えてみましょう。たとえば「速いけど小さい敵」と「遅いけど大きい敵」を混ぜると、プレイに緩急が生まれます。

ライフ(残機)を追加する

ゲームオーバーが1回で終わりだと厳しいので、「ライフ」という変数を作って3からスタートし、敵が画面下に到達するたびに1減らすようにすると遊びやすくなります。

🟢 旗が押されたとき
  [ライフ v] を (3) にする

---(Enemyスプライト側)---

<<(y座標) < (-170)> まで繰り返す>
  ...
end
[ライフ v] を (-1) ずつ変える
もし <(ライフ) < [1]> なら
  [ゲームオーバー v] を送る
end
このクローンを削除する

だんだん難しくなる仕組み

スコアが上がるにつれて敵の出現間隔を短くすると、自然と難易度が上がっていきます。Enemyスプライトの「〇秒待つ」の部分を、変数を使って動的に変える方法です。

🟢 旗が押されたとき
  隠す
  ずっと
    もし <(スコア) < [5]> なら
      (2) 秒待つ
    でなければ
      もし <(スコア) < [15]> なら
        (1) 秒待つ
      でなければ
        (0.5) 秒待つ
      end
    end
    [自分自身 v] のクローンを作る
  end

スコアが5未満のうちは2秒おき、5〜14は1秒おき、15以上は0.5秒おきに敵が出現するようになります。「いつの間にか難しくなっていた」という体験は、遊ぶ人をぐっと引き込みます。

まとめ:作りながら学ぶのが一番の近道

シューティングゲームの制作を通じて、キャラクターの操作、クローンによる弾や敵の管理、当たり判定、変数によるスコア管理と、プログラミングの基本的な考え方をたくさん体験できます。一つひとつは小さな仕組みですが、組み合わせることで本格的なゲームになっていく過程はとてもワクワクするものです。

今回の記事で扱ったポイントをおさらいしておきます。

  1. 自機の操作 — 矢印キーでx座標を変え、画面端の制御も加える
  2. 弾の発射 — クローン機能で連射を実現し、画面外で削除する
  3. 敵の出現 — 乱数で位置を変え、クローンで次々と生成する
  4. 当たり判定 — 「〜に触れた」ブロックでシンプルに実装する
  5. スコアとゲームオーバー — 変数とメッセージでゲームの流れを管理する

うまくいかないときこそ、学びのチャンスです。「なぜ動かないんだろう?」と考えて原因を探る力は、プログラミングだけでなくいろいろな場面で役に立ちます。

「やってみたいけど、一人だと不安」と感じている方もいるのではないでしょうか。CODESTELLAでは、Scratchを使ったゲーム作りを楽しみながらプログラミングの考え方を身につけることができます。下田市で実際に手を動かしながら学べる環境に興味がある方は、ぜひCODESTELLAの無料体験に参加してみてください。一緒にゲーム作りを始めましょう。