スクラッチのジャンプゲーム作り方!重力と着地判定のバグを完全解決
📌 【この記事の重要ポイントまとめ】
- 要点1:不自然なジャンプの原因は「Y座標を10ずつ変える」ことによる等速直線運動であり、解決には変数を使った「加速度(重力)のシミュレーション」が必須。
- 要点2:地面へのめり込みや浮遊バグは、毎秒30フレームの処理速度と当たり判定のズレが原因であり、定義ブロックの「画面を再描画せずに実行」で完全に解消できる。
- 要点3:初心者は固定値の単純ジャンプから始め、段階的に「Y速度変数」「着地補正」「2段ジャンプ」へと拡張することが挫折を防ぐ最短ルートである。
【違和感の正体】なぜ不自然に浮くのか?ジャンプが失敗する決定的理由
初心者が作成したスクラッチのアクションゲームを操作した際、真っ先に感じるのが「エレベーターのように上がってピタッと止まり、そのまま真下にカクンと落ちる」という独特のぎこちなさです。この不自然さを生み出している主因は、初心者が多用しがちな「Y座標を10ずつ変える」を10回繰り返し、その後「Y座標を-10ずつ変える」を10回繰り返すといった単純なコード構造にあります。 現実世界で人間や動物が跳躍するとき、足が地面を離れた瞬間のスピードが最も速く、上昇するにつれて重力に引っ張られて徐々に減速し、最高到達点で一瞬静止したあと、加速しながら落下していきます。しかし、一定の数値を足し引きするだけのコードでは速度の変化が一切起きず、物理学でいう「等速直線運動」になってしまいます。人間の脳は日常的に目にする重力加速度の動きを直感的に記憶しているため、速度が変化しない不自然な上下移動を目撃した瞬間に強い違和感を覚えるのです。 さらに、途中に「1秒待つ」といった待機ブロックを挟んでしまうと、キャラクターが空中で不気味に静止してしまい、ゲームとしてのテンポや爽快感が決定的に損なわれます。滑らかで気持ちの良いジャンプを作るためには、固定の数値を動かすのではなく、「スピードそのものが刻一刻と変化する仕組み」を導入しなければなりません。
【コード公開】リアルな放物線を描く!スクラッチ重力プログラムの決定版
名作アクションゲームのような手触りを再現する核心は、「スクラッチY座標変数」を用いた物理シミュレーションの実装にあります。これによって、美しい放物線を描く本格的なジャンプが実現します。1. 変数「Y速度」の導入と初期設定
まず、変数カテゴリーから「すべてのスプライト用」で「Y速度」という新しい変数を作成します。この変数は、キャラクターが上下に移動する瞬間のスピードを表すパラメータです。 基本となる考え方は極めて合理的です。「上向きのスピードを与え、毎フレームごとに重力を引き算し続ける」というサイクルを構築します。2. 放物線を生み出すメインループのコード
ジャンプのトリガー(上向き矢印キーやスペースキーが押されたとき)と、毎フレームの移動処理は以下のように構成します。 【ジャンプ開始時の処理】
・「スペースキーが押された」とき
・もし「地面に触れた」なら
└「Y速度」を 12 にする(※初期跳躍力)
【常時実行する重力ループ】
・「旗が押されたとき」
・「ずっと」
├「Y座標を (Y速度) ずつ変える」
├「Y速度を -1 ずつ変える」(※重力加速度)
└(※ここに着地判定処理を挿入)
【徹底比較】ジャンプ実装コード4パターンの特徴と難易度検証
スクラッチにおけるジャンプの実装方式は、学習者のレベルや目指すゲームのジャンルによって複数のアプローチが存在します。それぞれのメリット・デメリットを整理した比較表は以下の通りです。| 実装方式 | 詳細・コードの構成 | 適したゲームジャンル | 難易度と編集部評価 |
|---|---|---|---|
| ①固定値加算方式 | 「Y座標を〇ずつ変える」を反復。変数は一切使用しない極小構成。 | 入門用のシンプルな障害物避けゲーム | ★☆☆☆☆(初級) 導入は容易だが動きが機械的で拡張性がない。 |
| ②Y速度+色判定方式 | 変数「Y速度」で重力を再現し、ステージの特定の色に触れたら停止。 | 1画面完結型のアスレチックゲーム | ★★☆☆☆(初中級) 理解しやすいがステージの配色変更でバグが起きやすい。 |
| ③スプライト当たり判定方式 | 床を別スプライト化。「床に触れたまでY座標を変える」で着地。 | マリオ風の横スクロールアクションゲーム | ★★★☆☆(中級推奨) 最もバランスが良い。ギミック追加にも柔軟に対応可能。 |
| ④再描画なし補正方式 | カスタムブロック「画面を再描画せずに実行」でめり込みを1フレームで解消。 | 本格的な精密プラットフォーマーゲーム | ★★★★☆(上級) 商用ゲーム水準の滑らかさ。バグ耐性が極めて強固。 |

【実態検証】教育現場で見えた「着地判定バグ」の罠と解消法
プログラミング教室の現場や質問コミュニティで最も頻出するトラブルが、「スクラッチ着地判定バグ」です。「ジャンプしたキャラクターが地面の下へ沈んでいく」「床の上で小刻みに震え続けてジャンプできなくなる」という現象に遭遇し、制作を投げ出してしまう子どもが少なくありません。なぜ地面に「めり込む」のか? 30FPSのタイムラグ
Scratchは基本的に「毎秒約30フレーム(1秒間に30回画面を書き直す)」の仕様で動いています。 落下中、キャラクターの「Y速度」が「-15」にまで加速していたとします。すると、キャラクターは次の瞬間、現在の位置から一気に15ピクセル下へワープするように移動します。このとき、地面の厚みが10ピクセルしかなかった場合、キャラクターは地面の表面を飛び越えて、床の中にめり込んだ状態、あるいは床をすり抜けた位置に着地してしまうのです。 この状態で単純に「床に触れたならY速度を0にする」というコードを組んでいると、キャラクターの足が地面の内部に埋まったまま判定が固定され、二度と動けなくなります。めり込みを完全解消する「押し戻しアルゴリズム」
このバグを根本から根絶するプロの手法が、「めり込んだ分だけ上方向に微小移動させて押し戻す」という補正ロジックです。 【着地と押し戻しの黄金コード】
・もし「床(または地面のスプライト)に触れた」なら
├「床に触れたではない」まで繰り返す
│ └「Y座標を 1 ずつ変える」
└「Y速度を 0 にする」
一般に知られていない盲点とネットの誤解|2段ジャンプとスクロールの壁
ネット上に散見される古い解説記事や動画の中には、現在のScratchの動作環境や大規模開発において予期せぬ不具合を引き起こすコードが散見されます。ステップアップを目指す開発者が陥りがちな盲点を検証します。盲点1:「色判定」への過度な依存による処理落ち
初期の入門書でよく紹介される「○色に触れたなら」という判定は、非常に直感的ですが大きな罠を含んでいます。ステージの背景にグラデーションをかけたり、影の描写を入れたりしただけで判定がすり抜けてしまいます。さらに、色の当たり判定は内部的にCPUへの計算負荷が高く、オブジェクトが増える横スクロールゲームでは目に見えてフレームレートが低下し、カクつきの原因となります。 現場のプロエンジニアが推奨するのは、「床専用の透明なスプライトを用意し、『〇〇に触れた』ブロックで判定する」手法です。これによってデザインの変更に左右されない強固な設計が可能になります。盲点2:2段ジャンプにおける「無限空中浮遊」のバグ
アクションゲームの花形である「スクラッチ2段ジャンプ作り方」でも、典型的なロジック破綻が多発します。「ジャンプキーが押されたら、もう一度ジャンプを許可する」とだけ記述すると、空中でキーを連打した際に無限に上昇し続けて画面外へ消えてしまうバグです。 これを制御するには、必ず変数「ジャンプ可能回数」を設計に組み込みます。 【堅牢な2段ジャンプのロジック】
1. 地面に着地した瞬間、「ジャンプ可能回数」を「2」にリセットする。
2. スペースキーが押されたとき、「もしジャンプ可能回数が 0 より大きい」なら:
・「Y速度」を 10 にする
・「ジャンプ可能回数」を -1 ずつ変える

【プロの結論】小学生がつまずかないための判断基準とステップアップ戦略
小学校現場での指導経験や教育工学の観点から導き出される結論は、「子どもの認知発達段階を無視して最初から完璧な物理演算を教え込もうとしないこと」です。 プログラミング的思考の本質は、複雑な現象を小さな要素に「分解」し、論理的な順序で「再構成」する力にあります。しかし、いきなり変数や加速度の概念を突きつけられると、算数に対する苦手意識が先行し、ゲーム作りの楽しさを知る前に挫折してしまう危険性があります。【判断基準】おすすめできる人・慎重になるべき人の条件
▼ 変数を使った重力プログラムに今すぐ挑戦すべき人:- 小学校4年生以上で、算数の「正の数・負の数(マイナス)」の感覚やグラフの概念がなんとなく理解できている。
- 「マリオ風ゲーム」や精密な操作が求められるプラットフォーマーゲームを作りたいという明確な目標がある。
- キャラクターが地面にめり込む違和感を「なぜだろう?」と探求できる粘り強さがある。
- 小学校低学年、またはScratchに触れて間もない完全なプログラミング初心者。
- まずは1時間程度で完成するシンプルな「スクラッチ障害物避けゲーム」を作って達成感を味わいたい。
- 「変数」の概念(データを入れておく箱)に対してまだ抵抗感や混乱がある。
【スクラッチ ジャンプ ゲーム】に関するよくある質問(FAQ)
Q1:ジャンプの高さを変えたいときは、どの数値を調整すればよいですか?
A1:ジャンプした瞬間に代入する「初期のY速度」の数値を変更してください。数値を大きくする(例:12から16にする)と高く跳ぶようになり、小さくすると低くなります。また、「Y速度を-1ずつ変える」の重力値を「-1.5」などに強めると、素早くキビキビと着地する鋭いジャンプになり、滞空時間のコントロールが可能です。
Q2:スペースキーを押し続けたときに、大ジャンプと小ジャンプを撃ち分けるにはどうすればいいですか?
A2:キーを離した瞬間に上昇スピードをカットするロジックを追加します。メインループ内に「もしスペースキーが押されたではない、かつ Y速度が 0 より大きい なら、Y速度を 0 にする(または Y速度に 0.5 を掛ける)」というコードを組み込むことで、ボタンを短く押すと小ジャンプ、長押しすると最大の高さまで跳ぶ本格的な操作性を再現できます。
Q3:横スクロールゲームを作るとき、ジャンプの仕組みは変える必要がありますか?
A3:上下のジャンプ処理(Y座標とY速度の計算)は全く同じコードをそのまま流用できます。横スクロールの場合、変化するのは「X座標」の扱いです。キャラクター自身のX座標を動かすのではなく、キャラクターの「X速度」に応じて背景や床のスプライトを逆方向に動かす設計にすることで、スクロールジャンプが破綻なく成立します。
Q4:キャラクターのコスチューム(画像)が変わると着地判定が狂うのはなぜですか?
A4:Scratchはスプライトの「現在の見た目の輪郭」で当たり判定を計算するためです。歩行アニメーションやジャンプポーズでコスチュームのサイズや中心位置が1ピクセルでも変わると、地面に触れているかどうかの判定がブレてガタつきが発生します。解決策として、判定専用の見えない「四角い当たり判定用スプライト(ヒットボックス)」を用意し、見た目のキャラクター画像をその位置に追従させる手法がプロの標準テクニックです。 (出典: スクラッチ ジャンプ ゲーム(Yahoo!ニュース))
まとめ:今後の動向と失敗しないための判断基準
スクラッチでのジャンプアクション制作は、単なるゲーム作りのテクニックにとどまらず、「現実世界の物理現象を数式と論理でコンピュータ上に再構築する」という、プログラミング教育の本質を凝縮した体験です。 画面内でキャラクターが意図通りに動かないとき、そこには必ず論理的な理由が存在します。等速運動によるぎこちなさには「変数を活用した加速度」を、フレーム遅延によるめり込みには「定義ブロックによる再描画なしの押し戻し処理」を適用することで、いかなるバグも論理的にねじ伏せることができます。 まずは手元のプロジェクトで「Y速度」という1つの変数を作ることから始めてみてください。画面の中のキャラクターがまるで命を宿したかのようにしなやかに跳躍した瞬間、プログラミングの真の面白さと確かな成長を実感できるはずです。