スクラッチで跳ぶ!ジャンプゲームの作り方と重力・すり抜け対策
子どもから大人まで直感的にプログラミングを学べるScratch(スクラッチ)において、誰もが一度は挑戦するのが「ジャンプアクションゲーム」の制作です。しかし、いざ自作してみると「動きがカクカクして不自然」「ジャンプ中に地面をすり抜けて落下してしまう」といったトラブルに直面し、挫折してしまうケースが後を絶ちません。
こうした不具合が生じる根本原因は、画面上の座標処理とScratch特有のフレームレート(処理周期)の噛み合わせにあります。本稿では、滑らかな放物線を描く重力の再現ロジックから、すり抜けを完全に防ぐ当たり判定、さらには二段ジャンプや横スクロールへの応用まで、現場のプロが実践するゲームプログラミングの要点を分かりやすく解き明かします。
📌 【この記事の重要ポイントまとめ】
- 要点1:不自然なカクつきやすり抜けは「y座標の直接変更」と「落下速度の超過」が主な原因。
- 要点2:滑らかなジャンプには「y速度」変数を活用した等加速度運動(重力プログラム)が不可欠。
- 要点3:地面のすり抜けは「画面の再描画なし」で動く定義ブロックと押し戻し処理で完全解決できる。
【原因究明】なぜ「不自然なジャンプ」や「地面すり抜け」が起きるのか?
Scratchでキャラクターをジャンプさせようとして初心者が最初に書いてしまいがちなのが、「y座標を10ずつ変えるを10回繰り返す」「その後にy座標を-10ずつ変えるを10回繰り返す」というプログラムです。この組み方では、上昇時も下降時も速度が一定(等速運動)になるため、人間が日常で感じる「重力」とはかけ離れたロボットのようなぎこちない動きになってしまいます。
さらに深刻なのが「地面をすり抜ける」トラブルです。落下のスピードが大きくなると、キャラクターは1フレーム(約0.033秒)の間に一気に20ピクセル以上移動します。このとき、地面の厚みが15ピクセルしかなかった場合、キャラクターは地面に「接触」することなく、一瞬で地面の上側から下側へとワープしてしまいます。これが、当たり判定が反応せずにキャラクターがステージ外へ落ちていく物理的な真相です。
自然で気持ちの良いジャンプ体験を作るには、「ジャンプ初速」を与え、毎フレームごとに「重力(下向きの力)」を加え続ける計算式をプログラム上に組み立てる必要があります。
【基本実装】自然な重力を再現する「y座標変数」の基本コード
リアルな跳躍を表現するための第一歩は、キャラクター専用の変数「y速度」を作ることです。この変数を使うことで、物理法則に基づいた美しい放物線を描くことができます。
基本となるスクラッチ ジャンプ ゲーム コードの構造は以下の通りです。
【ステップ1:変数の初期化とメインループ】
・緑の旗が押されたとき
・変数を「y速度」を0にする
・ずっとループを開始する
【ステップ2:重力と移動の計算】
・ループ内で「y速度」を-1ずつ変える(毎フレーム下向きの力を蓄積)
・y座標を「y速度」ずつ変える(蓄積された速度分だけ実際にキャラを動かす)
【ステップ3:ジャンプのトリガー】
・もし「スペースキーが押された」かつ「地面に触れた」なら
・「y速度」を12にする(上向きの初速を与える)
このロジックを導入するだけで、上昇するにつれて徐々に減速し、頂点で一瞬静止してから加速しながら落下する、ゲームらしい手触りのアクションが簡単に実現します。障害物を跳び越えるミニゲームであれば、この基礎コードだけで十分に遊べるクオリティに仕上がります。
【徹底比較】ジャンプ実装パターン4選と挙動・難易度の違い
ジャンプのプログラミング手法には、初心者が数分で作れる簡易版から、市販アクションゲーム並みの精密な制御まで複数のアプローチが存在します。開発規模や目的に応じた選択が肝心です。
| 実装パターン | 詳細・実装コードの特徴 | 挙動の自然さ・FPS負荷 | 編集部の見解・おすすめ用途 |
|---|---|---|---|
| 等速ループ方式 | 「y座標を○ずつ変える」を繰り返すだけの初歩的コード | 不自然(カクつく) 負荷:極小 | プログラミング学習初日の入門用。本格的なゲーム制作には非推奨。 |
| 基本変数重力方式 | 「y速度」変数を作り、毎フレーム-1加算してy座標に反映 | 良好(綺麗な放物線) 負荷:極小 | 単一画面の障害物ジャンプや、アクションゲームの基礎に最適。 |
| 押し戻し補正方式 | 地面に埋まった瞬間、1ピクセルずつ上に移動させて境界に合わせる | 非常に高い(すり抜けゼロ) 負荷:小 | ステージの起伏がある本格横スクロールや高難度アクションに必須。 |
| 物理エンジン完全再現 | 空気抵抗、摩擦係数、可変ジャンプ高(ボタン押下時間連動)を実装 | 極めて滑らか(プロ級) 負荷:中 | Scratchコンテスト応募作品や、操作感を極限まで追求したい上級者向け。 |
プログラミング初心者であれば、まずは「基本変数重力方式」から着手し、ステージの地形に合わせて「押し戻し補正方式」へとステップアップするのが最も効率的な制作フローです。
【トラブル解決】「地面をすり抜ける」を完全防止する着地当たり判定の裏技
落下速度が上がっても絶対に地面を突き抜けないようにするには、Scratchの「定義ブロック(カスタムブロック)」にある「画面を再描画せずに実行する」というオプションを活用します。
通常のブロック処理は1コマ(1/30秒)ごとに画面を更新しながら実行されますが、このオプションを有効にすると、一瞬の間に最大数百回もの計算を画面の描画を挟まずに完了させることができます。
具体的なすり抜け防止手順は以下の通りです。
1. 新しいブロックを作る画面で、名前を「着地判定」にし、「画面を再描画せずに実行する」にチェックを入れる。
2. 定義ブロックの中に、「もし地面に触れたなら」を配置。
3. その内側に「地面に触れていないまで繰り返す」を入れ、y座標を1ずつ変えるを実行。
4. ループを抜けたら「y速度」を0にする。
このスクリプトにより、キャラクターが高速で地面にどれだけ深く突き刺さっても、画面が更新される前のミリ秒単位で「地面の表面(触れるか触れないかのギリギリ)」まで1ピクセルずつ上方向に押し戻されます。プレイヤーの目には「完璧なタイミングでピタッと地面に着地した」ようにしか見えません。
【実態検証】二段ジャンプと横スクロール実装で初心者が挫折する落とし穴
教育現場やプログラミング教室の指導現場を観察すると、基本ジャンプを習得した学習者が次に挑む「二段ジャンプ」と「横スクロール」で、ほぼ例外なくバグの壁にぶつかっています。
二段ジャンプの実装で最も多い失敗は、「空中ジャンプの回数制限を設けていない」ことです。スペースキーを押すたびに「y速度を12にする」とだけ設定していると、キーを連打することで無限に空を飛べてしまい、ゲームバランスが崩壊します。これを防ぐには「ジャンプ回数」という変数を用意し、地面にいるときは0、跳ぶたびに+1し、「ジャンプ回数 < 2」のときのみ跳べる条件分岐を組むのが鉄則です。
また、横スクロールアクションゲームにおいては、「キャラクターを動かす」のではなく「背景スプライトのx座標をスクロール変数に合わせて動かす」という設計思想への転換が求められます。ジャンプの上下運動(y軸)はキャラクター自身が担当し、左右の移動(x軸)は背景が逆方向に流れることでスクロールを表現する——この役割分担を整理できないと、コードが複雑化して修復不能なスパゲッティプログラムに陥ります。
【プロの結論】初心者が選ぶべき実装ルートと見送るべき過剰設計
Scratchでの作品作りを挫折せずに完走するためには、自分のスキルレベルに合わせた「引き算の設計」が重要です。
【今すぐ取り入れるべき人】
・シンプルなランゲームや、迫りくる障害物を避けるミニゲームを作りたい人
・変数を使ったプログラミングの基礎(加速度・フラグ管理)を体感的に学びたい人
・まずは「動いて遊べる完成品」を最短1日で作る成功体験を得たい人
【現時点では見送るべき設計】
・壁キック、坂道での滑り判定、慣性移動をすべて同時に組み込もうとすること
・当たり判定をキャラクターの精密なイラスト画像そのもので取ろうとすること(判定用のシンプルな「四角い透明コスチューム」を用意しないと、足の引っかかりバグが多発します)
【スクラッチ ジャンプ ゲーム】に関するよくある質問(FAQ)
Q1:ジャンプボタンを押しっぱなしにすると、高く跳びすぎてしまいます。どうすればいいですか?
A1:キーを押し続けた際の連打誤認識を防ぐため、「スペースキーが押されたではないまで待つ」というブロックをジャンプ処理の末尾に入れるか、「キーが離されたらy速度が正の値のときにy速度を半分にする」といったコードを追加すると、マリオのような小ジャンプ・大ジャンプの撃ち分けが可能になります。
Q2:地面の判定は「特定の色に触れた」と「地面スプライトに触れた」のどちらが良いですか?
A2:圧倒的に「スプライトに触れた」がおすすめです。「色に触れた」判定はScratchの処理負荷が高く、背景のグラデーションやコスチュームのわずかな色調変更で判定が抜けてしまうリスクがあるためです。
Q3:タブレットやスマートフォン(画面タップ)でジャンプさせるにはどう書きますか?
A3:「スペースキーが押された」の代わりに、「ステージがクリックされたとき」や、画面上に配置したジャンプボタン用スプライトの「このスプライトが押されたとき」をイベントトリガーに設定すれば、モバイル環境でも軽快に遊べるようになります。
Q4:ジャンプ中に左右に移動すると、壁の中に埋まって動けなくなります。
A4:上下(y軸)と左右(x軸)の移動処理を同じブロック内で同時に行っていることが原因です。「左右に動かしてから壁補正を行う」「その後に上下に動かして床・天井補正を行う」と、軸ごとの処理を完全に分離して記述してください。
まとめ:重力ロジックをマスターして独自の名作ゲームを作ろう
Scratchにおけるジャンプゲーム作りは、プログラミングにおける「変数」「条件分岐」「ループ処理」、そして初歩的な「物理演算」のエッセンスがすべて凝縮された最高の学習テーマです。
カクつく動きやすり抜け現象は、決してプログラムのバグではなく、コンピューターの計算順序を論理的に整理するための道標に過ぎません。まずは「y速度変数」を使った等加速度運動を導入し、「画面の再描画なし」による着地補正を組み込むことで、驚くほど手触りの良い本格的なアクションゲームへと進化させることができます。基本の跳躍をマスターしたら、二段ジャンプや敵キャラクターの配置など、オリジナルのアイデアを自由に詰め込んで名作ゲームを完成させてみてください。 (出典: スクラッチ ジャンプ ゲーム(Yahoo!ニュース))