Scratchでアクションゲームを作る方法|ジャンプ・重力・当たり判定
マリオのような、横スクロールアクションゲーム。憧れる方も多いのではないでしょうか。実は、いくつかの仕組みを理解すれば、Scratchだけで作れます。本記事では、3つの要素に絞って解説します。重力の再現、ジャンプの処理、当たり判定です。実際のブロック例とともに、1つずつ丁寧に説明します。難しい物理の知識は、必要ありません。
🎮 最初に、ざっくりまとめます
むずかしい話は、あとで説明します。まずは全体のイメージだけつかんでください。
重力って何?
キャラクターを、毎回少しずつ下に動かし続ける処理です。「落ちる感覚」を作り出します。
ジャンプって何?
一瞬だけ、上向きの勢いを与える処理です。そのあとは、重力が自然に引き戻します。
当たり判定って何?
2つのキャラクターが触れたかどうかを、常にチェックする処理です。
誰向けの内容?
Scratchの基本操作を知っている方が対象です。ゲーム制作の一歩先に進みたい方におすすめです。
まとめ:3つの仕組みを組み合わせるだけで、本格的なアクションゲームが作れます。1つずつ、順番に試してみましょう。
01アクションゲームに必要な3つの要素

アクションゲームと聞くと、難しそうに感じるかもしれません。しかし、分解してみると、シンプルな要素の組み合わせです。本記事では、3つの要素に注目します。
1重力
キャラクターを、常に下へ引っ張る力です。これがないと、キャラクターは宙に浮いたままになってしまいます。
2ジャンプ
重力に逆らって、一瞬だけ上へ飛び上がる動きです。ボタンを押した瞬間に、上向きの勢いを与えます。
3当たり判定
キャラクターと、地面・敵・アイテムが触れたかどうかを調べる処理です。ゲームのルールの根幹を支えています。
この3つを組み合わせれば、多くのアクションゲームの基本形が完成します。1つずつ、順番に作っていきましょう。
02準備するもの
特別な準備は、必要ありません。Scratchの画面を開くだけです。今回は、2つのスプライトを用意しましょう。プレイヤー役のキャラクターと、地面役のスプライトです。地面は、画面の下の方に、横長の四角形を描くだけで十分です。ペイントエディタで、簡単に作成できます。
03重力を再現する

まずは、重力の仕組みから作りましょう。考え方は、シンプルです。「毎回、少しだけy座標を減らし続ける」。これだけです。
速度という変数を用意する
ただy座標を減らすだけでは、不自然な動きになります。本物の重力に近づけるには、「速度」という考え方が必要です。落ち始めは、ゆっくり落ちます。時間が経つほど、落ちる速さが増していきます。この「加速する感じ」を、変数で表現します。
ブロックの構成イメージ
[変数 速度y を作る]
[緑の旗が押されたとき]
[変数 速度y を 0 にする]
ずっと
[変数 速度y を -1 ずつ変える]
[y座標を (速度y) ずつ変える]
「速度y」という変数を、毎回-1ずつ減らしています。この値を、y座標に足し続けています。最初はゆっくり、だんだん速く落ちていく。この処理だけで、自然な落下が再現できます。ただし、このままでは、キャラクターが地面をすり抜けて、画面の外まで落ち続けてしまいます。次の章で、この問題を解決します。
04地面との当たり判定
地面に着地したら、落下を止める処理を加えましょう。「もし地面に触れたなら、速度をゼロにする」という考え方です。
ブロックの構成イメージ
[緑の旗が押されたとき]
[変数 速度y を 0 にする]
ずっと
[変数 速度y を -1 ずつ変える]
[y座標を (速度y) ずつ変える]
もし <地面 に触れた> なら
[変数 速度y を 0 にする]
[y座標を 1 ずつ変える]
「地面に触れた」ときに、速度yを0に戻しています。これで、それ以上落ち続けることはありません。最後に「y座標を1ずつ変える」という行があります。これは、地面にめり込んでしまうのを防ぐ、小さな補正です。ちょうど地面の表面に、キャラクターが乗っている状態を保てます。
05ジャンプ処理を作る

重力の土台ができました。次は、ジャンプです。考え方は、意外とシンプルです。「スペースキーが押されたら、速度yに、一瞬だけ大きなプラスの値を与える」。これだけです。あとは、3章で作った重力の処理が、自動的にキャラクターを引き戻してくれます。
ブロックの構成イメージ
[緑の旗が押されたとき]
[変数 速度y を 0 にする]
ずっと
[変数 速度y を -1 ずつ変える]
[y座標を (速度y) ずつ変える]
もし <地面 に触れた> なら
[変数 速度y を 0 にする]
[y座標を 1 ずつ変える]
もし <スペースキーが押された> なら
[変数 速度y を 15 にする]
大切なポイントがあります。「もし地面に触れたなら」という条件の、内側にジャンプの判定を置いていることです。こうすることで、地面にいるときだけ、ジャンプができるようになります。空中で何度もジャンプできてしまう、という不自然な動きを防げます。
06横移動と組み合わせる
ここまでで、縦方向の動きが完成しました。左右の移動も、加えてみましょう。
ブロックの構成イメージ
[緑の旗が押されたとき]
[変数 速度y を 0 にする]
ずっと
もし <右向き矢印キーが押された> なら
[x座標を 5 ずつ変える]
もし <左向き矢印キーが押された> なら
[x座標を -5 ずつ変える]
[変数 速度y を -1 ずつ変える]
[y座標を (速度y) ずつ変える]
もし <地面 に触れた> なら
[変数 速度y を 0 にする]
[y座標を 1 ずつ変える]
もし <スペースキーが押された> なら
[変数 速度y を 15 にする]
縦方向の処理(重力・ジャンプ)と、横方向の処理(左右移動)を、同じ「ずっと」ブロックの中に並べています。この2つは、独立して動きます。ジャンプ中でも、左右に移動できます。マリオのような、横スクロールアクションらしい動きになりました。
07敵との当たり判定でゲームオーバーにする

敵のスプライトを、新しく用意しましょう。敵に触れたら、ゲームオーバーになる処理を作ります。
ブロックの構成イメージ(プレイヤーのスプライトに追加)
ずっと
もし <敵 に触れた> なら
[「やられた!」と 2 秒言う]
[すべてを止める]
「もし〜なら」ブロックで、敵との接触を、常にチェックしています。触れたら、メッセージを表示して、「すべてを止める」ブロックで、プログラム全体を停止させています。もっと複雑なゲームオーバー処理(画面の切り替えなど)も、この仕組みを土台にして作れます。
08コインなどのアイテムを取得する
コインのスプライトを用意しましょう。触れたら、スコアが増えて、コインが消える処理です。
ブロックの構成イメージ(コインのスプライトに追加)
[変数 スコア を作る]
[緑の旗が押されたとき]
[表示する]
ずっと
もし <プレイヤー に触れた> なら
[変数 スコア を 1 ずつ変える]
[隠す]
触れた瞬間に、スコアを1増やし、「隠す」ブロックでコインを見えなくしています。「隠す」だけなので、スプライト自体は残っています。複数のコインを配置したい場合は、このスプライトを複製すれば、同じ仕組みをそのまま使い回せます。
09独自アイデア:二段ジャンプ
空中でもう一度ジャンプできる、二段ジャンプを作ってみましょう。ジャンプの回数を数える、新しい変数を使います。
ブロックの構成イメージ
[変数 ジャンプ回数 を作る]
[緑の旗が押されたとき]
[変数 速度y を 0 にする]
[変数 ジャンプ回数 を 0 にする]
ずっと
[変数 速度y を -1 ずつ変える]
[y座標を (速度y) ずつ変える]
もし <地面 に触れた> なら
[変数 速度y を 0 にする]
[変数 ジャンプ回数 を 0 にする]
もし <スペースキーが押された> かつ <ジャンプ回数 < 2> なら
[変数 速度y を 15 にする]
[変数 ジャンプ回数 を 1 ずつ変える]
地面に着地したときに、ジャンプ回数を0にリセットしています。ジャンプするたびに、回数を1つ増やしています。回数が2未満のときだけ、ジャンプできるようにしています。これにより、地上で1回、空中でもう1回、合計2回のジャンプが可能になります。
10独自アイデア:無敵時間を作る
敵に当たった直後、少しの間だけ無敵になる仕組みも、よく使われます。連続でダメージを受け続ける不公平感を、なくすための工夫です。
ブロックの構成イメージ
[変数 無敵中 を作る]
[緑の旗が押されたとき]
[変数 無敵中 を 0 にする]
ずっと
もし <敵 に触れた> かつ <無敵中 = 0> なら
[変数 体力 を -1 ずつ変える]
[変数 無敵中 を 1 にする]
[1 秒待つ]
[変数 無敵中 を 0 にする]
「無敵中」という変数が、0か1かで、状態を管理しています。敵に触れても、無敵中が1のときは、条件が満たされないため、何も起こりません。「1秒待つ」の間だけ、無敵状態が続きます。数値を変えれば、無敵時間の長さを自由に調整できます。
11独自アイデア:坂道・可変ジャンプ
ボタンを押す長さでジャンプの高さを変える
スペースキーを押す時間の長さで、ジャンプの高さを変える、というテクニックもあります。短く押せば低いジャンプ、長く押せば高いジャンプです。
もし <スペースキーが押された> かつ <地面に触れた> なら
[変数 速度y を 15 にする]
もし <スペースキーが押されていない> かつ <速度y > 5> なら
[変数 速度y を 5 にする]
スペースキーを早く離すと、速度yが強制的に小さくされます。上昇が、途中で頭打ちになるのです。多くの市販アクションゲームでも、実際に使われているテクニックです。
12次のステップ
ここまでの仕組みを組み合わせれば、簡単なアクションゲームが完成します。次のステップとして、いくつかの道があります。
画面の外の世界とつなげる
作ったゲームを、画面の中だけで終わらせない方法もあります。Scratchのブロックのまま、LEDやセンサーと組み合わせる方法です。ジャンプするたびにLEDを光らせる、といった演出も作れます。
文字のコードへ進む
本格的なゲームエンジンに興味が出てきた方もいるでしょう。PythonのPygameやPyxelといったツールでは、同じ重力・当たり判定の考え方を、文字のコードで実装します。Scratchで身につけた考え方は、そのまま役に立ちます。
13よくあるトラブルと対処法
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| キャラクターが地面をすり抜ける | 当たり判定の処理が抜けている | 4章の「地面に触れた」ブロックを確認する |
| ジャンプが不自然に重い・軽い | 速度yの初期値が合っていない | 数値を少しずつ変えて、好みの感覚に調整する |
| 空中で何度もジャンプできる | 地面判定の内側にジャンプ処理がない | 5章の入れ子構造を確認する |
| 敵に一瞬で何度も当たり判定される | 無敵時間の処理がない | 10章の仕組みを追加する |
数値は「正解」を探すのではなく「感覚」で調整する
重力やジャンプの数値には、絶対的な正解がありません。実際にプレイしながら、少しずつ数値を変えてみましょう。「気持ちいい」と感じる感覚を、自分の手で探すことが、ゲーム作りの醍醐味です。
ゲーム作りに挑戦していたMさんがいた。ジャンプを実装したが、キャラクターが地面にめり込んでしまう症状に悩んでいた。ブロックを何度も見直したが、原因が分からなかった。そこで、4章の内容を見直した。「y座標を1ずつ変える」という、めり込み防止の補正が、抜けていたことに気づいた。1行を追加すると、症状はすぐに解決した。小さな1つのブロックが、動きの自然さを大きく左右することもあります。
14よくある質問
基本のQ&A
応用のQ&A
関連記事・参考資料
基礎を学べる記事
- YOFUKASI LAB「Scratch入門|使い方・始め方を初心者向けにやさしく解説」2026年, https://yofukasi-lab-wp.com/2026/09/13/scratch-getting-started/
- YOFUKASI LAB「Scratchで電子工作入門|LED・センサーを動かして学ぶプログラミング」2026年, https://yofukasi-lab-wp.com/2026/09/13/scratch-electronics-getting-started/
応用・関連記事
- YOFUKASI LAB「Pygame入門|Pythonでゲームを作る方法」2026年, https://yofukasi-lab-wp.com/2026/09/05/pygame-python-game/
- YOFUKASI LAB「Pyxelの使い方|ゲーム制作をゼロから解説」2026年, https://yofukasi-lab-wp.com/2026/07/11/pyxel/
参考資料(外部・一次情報)
- Scratch公式サイト, https://scratch.mit.edu/
- Scratchウィキ「Simulating Gravity」, https://en.scratch-wiki.info/wiki/Simulating_Gravity
※本記事は個人の学習用途を対象にしています。教育機関での利用については、各校・各団体の方針もあわせてご確認ください。
コメント