「ゲームを自分で動かしてみたい。けれど、開発環境の準備から難しそう…」と感じる人は多いです。
そこでこの記事では、特別なゲームエンジンを使わず、HTML・CSS・JavaScriptの3ファイルだけで作れるシンプルな2Dアクションゲームを題材に、基本の流れを整理していきます。
ブラウザさえあれば試せる内容なので、プログラミングの練習用としてもおすすめです。
✨ この記事でわかること
- HTML5キャンバスとJavaScriptでゲームを動かす基本構造
- プレイヤーの移動・ジャンプ・重力・地面との当たり判定の考え方
- requestAnimationFrame を使ったゲームループの組み立て方
- サンプルコードをベースに機能を拡張するためのヒント

今回は「走ってジャンプするだけ」のミニゲームを題材に、2Dアクションの土台になる考え方を一通り確認していきましょう。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
準備するものは3ファイルだけ|最小構成を確認しよう

まずは、どんなファイル構成でゲームを動かすのか整理しておきます。
今回のサンプルでは、次の3ファイルだけを同じフォルダに配置すればOKです。
| ファイル名 | 役割 | 内容のイメージ |
| index.html | 画面の土台 | キャンバス要素を用意し、あとで書く JavaScript を読み込みます。 |
| style.css | 見た目・レイアウト | キャンバスを中央に配置し、背景色や枠線などを整えます。 |
| game.js | ゲームの本体 | プレイヤーの位置、重力、ジャンプ、キー入力、ゲームループなどを記述します。 |
フォルダ構成は次のようなイメージです。
|
1 2 3 4 5 6 |
project-folder/ ├─ index.html ├─ style.css └─ game.js |
- すべて同じ階層に置くこと
- ファイル名の綴りミスがあると読み込めないので要チェック
- 最初はこの構成のまま触り、慣れてきたらサブフォルダで整理してもOK
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
index.htmlを作る|キャンバスとスクリプトの入り口

続いて、ゲーム画面となるキャンバスと JavaScript ファイルの読み込み部分を用意します。
ここでは 800×600 ピクセルのキャンバスを1つだけ配置したシンプルなHTMLを使います。
サンプル:index.html
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<pre><code class="language-html"> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Jump & Run Demo</title> <link rel="stylesheet" href="style.css"> </head> <body> <canvas id="gameCanvas" width="800" height="600"></canvas> <script src="game.js"></script> </body> </html> </code></pre> |
<canvas id="gameCanvas">… ゲームを描くための領域width・height… キャンバスの解像度(今回は 800×600)<script src="game.js">… ゲームの処理を書いた JavaScript を読み込む
この段階ではまだ真っ白なキャンバスしか表示されませんが、ゲームの「入り口」は整いました。
style.cssを整える|キャンバスを画面中央に表示する

次に、キャンバスを画面中央に配置し、ゲーム画面らしい見た目に整えていきます。
最低限のレイアウトだけでも、デバッグ時の見やすさがだいぶ違ってきます。
サンプル:style.css
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #f0f0f0; } #gameCanvas { border: 2px solid #333; background-color: #aaddff; /* 空っぽのステージをイメージした背景色 */ } |
display: flex;とjustify-content/align-itemsでキャンバスを中央寄せheight: 100vh;により、ブラウザの高さ全体をレイアウト対象にしている#gameCanvasで枠線と背景色を指定し、ゲーム画面らしさを出している
ここまで設定すれば、ブラウザで index.html を開いたときに、水色のキャンバスが中央に表示されるはずです。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
game.jsの全体像を作る|ループとプレイヤー制御

最後に、ゲーム本体となる game.js を書いていきます。
ここでは、次の要素を1つのファイルにまとめます。
- キャンバスと描画コンテキストの初期化
- プレイヤーと地面のデータ
- キー入力の管理
- 描画処理(draw)
- 更新処理(update)
- ゲームループ(loop)
まずは全体のコードを通して眺め、そのあとで各パートを分解して見ていきましょう。
サンプル:game.js 全体コード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
// キャンバスの準備 const canvas = document.getElementById('gameCanvas'); const ctx = canvas.getContext('2d'); // ゲーム用の定数 const GRAVITY = 0.5; const JUMP_POWER = -12; const SPEED = 5; // プレイヤーの状態 let player = { x: 50, y: canvas.height - 50 - 50, width: 30, height: 50, color: 'red', velY: 0, isJumping: false }; // 地面の情報 const ground = { y: canvas.height - 50, height: 50, color: 'green' }; // キー入力管理用 const keys = {}; document.addEventListener('keydown', (e) => { keys[e.code] = true; }); document.addEventListener('keyup', (e) => { keys[e.code] = false; }); // 描画処理 function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); // 地面 ctx.fillStyle = ground.color; ctx.fillRect(0, ground.y, canvas.width, ground.height); // プレイヤー ctx.fillStyle = player.color; ctx.fillRect(player.x, player.y, player.width, player.height); } // 状態更新処理 function update() { // 重力 player.velY += GRAVITY; player.y += player.velY; // 地面との衝突判定 if (player.y + player.height > ground.y) { player.y = ground.y - player.height; player.velY = 0; player.isJumping = false; } // 左右移動 if (keys['ArrowRight'] || keys['KeyD']) { player.x += SPEED; } if (keys['ArrowLeft'] || keys['KeyA']) { player.x -= SPEED; } // ジャンプ(空中での連続ジャンプ不可) if ((keys['Space'] || keys['ArrowUp'] || keys['KeyW']) && !player.isJumping) { player.velY = JUMP_POWER; player.isJumping = true; } // 画面外に出ないよう制限 if (player.x < 0) { player.x = 0; } if (player.x + player.width > canvas.width) { player.x = canvas.width - player.width; } } // メインループ function loop() { update(); draw(); requestAnimationFrame(loop); } // ゲーム開始 loop(); |
コード自体はそこまで長くありませんが、「状態を更新して描画する」ループになっている点が重要です。
各パートの役割を分解して理解する

ここからは、先ほどの game.js を部分ごとに確認していきます。
キャンバスとコンテキストの取得
|
1 2 |
const canvas = document.getElementById('gameCanvas'); const ctx = canvas.getContext('2d'); |
canvas は HTML 側のキャンバス要素そのもの、ctx は「絵を描くためのペン」のようなイメージです。
この ctx を通して、四角形や画像、テキストなどを描画していきます。
プレイヤー・地面・物理パラメータ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
const GRAVITY = 0.5; const JUMP_POWER = -12; const SPEED = 5; let player = { x: 50, y: canvas.height - 50 - 50, width: 30, height: 50, color: 'red', velY: 0, isJumping: false }; const ground = { y: canvas.height - 50, height: 50, color: 'green' }; |
- 重力・ジャンプ力・移動速度は「後から調整しやすいように」定数として定義
- プレイヤーは位置・大きさ・縦方向の速度・ジャンプ中かどうかを1つのオブジェクトで管理
- 地面は「高さだけを持つシンプルな長方形」として扱っている
ゲームでは、このような「数字の集まり」が毎フレーム少しずつ変化していきます。
キー入力を押しっぱなしで判定する仕組み
|
1 2 3 4 5 6 7 8 9 10 11 |
<pre><code class="language-javascript"> const keys = {}; document.addEventListener('keydown', (e) => { keys[e.code] = true; }); document.addEventListener('keyup', (e) => { keys[e.code] = false; }); </code></pre> |
キーが押された瞬間だけを見るのではなく、keys オブジェクトに「今押されているかどうか」を保存しておくスタイルです。
こうしておくと、更新処理の中で
|
1 2 3 4 5 |
<pre><code class="language-javascript"> if (keys['ArrowRight']) { // 右に移動 } </code></pre> |
という書き方で、現在の入力状態を毎フレーム参照できるようになります。
描画処理(draw)の役割
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<pre><code class="language-javascript"> function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); // 地面 ctx.fillStyle = ground.color; ctx.fillRect(0, ground.y, canvas.width, ground.height); // プレイヤー ctx.fillStyle = player.color; ctx.fillRect(player.x, player.y, player.width, player.height); } </code></pre> |
後から背景画像や敵キャラクターを追加する場合も、この中に『描く順番』を追記していくイメージです。
更新処理(update)で重力と当たり判定を実装する
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
function update() { // 縦方向の速度に重力を加算 player.velY += GRAVITY; player.y += player.velY; // 地面との衝突 if (player.y + player.height > ground.y) { player.y = ground.y - player.height; player.velY = 0; player.isJumping = false; } // 左右移動 if (keys['ArrowRight'] || keys['KeyD']) { player.x += SPEED; } if (keys['ArrowLeft'] || keys['KeyA']) { player.x -= SPEED; } // ジャンプ(空中での連続ジャンプ不可) if ((keys['Space'] || keys['ArrowUp'] || keys['KeyW']) && !player.isJumping) { player.velY = JUMP_POWER; player.isJumping = true; } // 画面端の制限 if (player.x < 0) { player.x = 0; } if (player.x + player.width > canvas.width) { player.x = canvas.width - player.width; } } |
✅ 重要ポイント
- 位置そのものではなく「速度」を通してキャラクターを動かす
- 地面にめり込んだら「位置を戻して速度を0」にするのがシンプル
- ジャンプ中かどうかをフラグで管理して、空中連打による多段ジャンプを防ぐ
ゲームループ(loop)と requestAnimationFrame
|
1 2 3 4 5 6 7 8 9 10 |
<pre><code class="language-javascript"> function loop() { update(); draw(); requestAnimationFrame(loop); } // ゲーム開始 loop(); </code></pre> |
requestAnimationFrame は「次の描画タイミングでこの関数を呼んでください」という指示です。
ブラウザ側がよきタイミングで loop を繰り返し実行してくれるため、おおよそ 60FPS 程度で
- update … 数字(位置・速度・入力状態)を更新
- draw … 更新された状態を画面に描き直す
というサイクルが続いていきます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
ここまでの動作チェックリスト

コードを書き終えたら、ブラウザで index.html を開き、次のポイントを確認してみましょう。
| 項目 | チェック内容 |
| 左右移動 | 左右キー or A / Dでプレイヤーがスムーズに左右へ動くか |
| ジャンプ | スペース or W / ↑キーでジャンプし、空中連打で無限に飛べないか |
| 重力 | ジャンプ後に自然に落下しているか、ふわふわしすぎていないか |
| 地面との接触 | 地面にしっかり乗り、めり込まずに止まるか |
| 画面端 | 左右の端から外に出てしまわないか |
⚠️ よくあるつまずき
- キャンバスIDの綴りが違い、
getContextが null になっている - ファイル名・パスのミスで
game.jsが読み込まれていない - 条件式の不等号(< と >)を逆にしてしまい、当たり判定が機能しない
動きが想定と違うときは、update() 内の処理順と条件を重点的に見直してみてください。
機能を広げるための発展アイデア

ここまでで「走る」「ジャンプする」「地面に立つ」という最低限のアクションは実装できました。
ここから少しずつ要素を増やしていくと、ぐっとゲームらしさが出てきます。
- 足場ブロックの追加
地面とは別に小さな四角形をいくつか用意し、同じように当たり判定を入れる。 - 敵キャラクターの配置
プレイヤーとは別のオブジェクトを動かして、触れたらゲームオーバーにする。 - 画像の描画
fillRectの代わりにdrawImageを使い、キャラクター画像や背景画像に差し替える。 - スコアや残機の追加
右上にスコアを描いたり、残りライフを表示してゲーム性を高める。

一度に全部を盛り込もうとすると大変なので、「今日は足場だけ」「次はスコア表示」といった形で区切って進めるのがおすすめです。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

JavaScriptとHTML5キャンバスを使った2Dアクションゲームの基本的な作り方を見てきました。
この記事の要点
- HTML・CSS・JavaScriptの3ファイルだけでシンプルな2Dアクションは十分作れる
- キャラクターは「位置」と「速度」を分けて管理し、重力やジャンプを実装する
- ゲームは「状態を更新 → 描画」をループさせる構造が基本
- まずは地味でもよいので「1本動くもの」を完成させることが大切
今回の土台ができていれば、あとは敵やステージ、演出などを少しずつ追加していくだけで、オリジナルのアクションゲームへと育てていけます。
より本格的なゲーム制作に挑戦したくなったら、Unityなどのゲームエンジンでの2Dアクションにもステップアップしてみてください。考え方は共通している部分が多く、今回の経験が必ず活きてきます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント