【保存版】「ゲームばかり」が「作る」に変わる!親子で挑戦する初めてのブラウザゲーム制作

ゲーム

こんにちは!「世界一わかりやすいプログラミング解説」記事へようこそ!

突然ですが、お父さん、お母さん。お子さんがスマートフォンやタブレットでゲームに熱中している姿を見て、ふとこんな不安を感じたことはありませんか?

「このままゲームばかりしていて、将来大丈夫なのかしら…」
「ただ時間を浪費しているだけに見えて、なんだかモヤモヤする」

そのお気持ち、痛いほどよくわかります。現代の子どもたち、いわゆる「デジタルネイティブ世代」にとって、ゲームは生活の一部であり、切り離すことが難しい存在です。無理に取り上げれば反発を招きますし、かといって放置するのも心配ですよね。

しかし、視点を少し変えてみてください。もしその「ゲームへの情熱」を、「消費する側」から「創造する側」へとシフトさせることができたらどうでしょう?

「このゲーム、どうやって動いているんだろう?」「自分ならもっとこうするのに!」
そんな好奇心の種は、プログラミングという魔法の水を与えることで、論理的思考力や問題解決能力という大きな木へと育ちます。

今日は、特別なアプリも、高額な教材も一切不要。
今あなたがこの記事を読んでいるブラウザ(ChromeやSafari)だけで、本格的な「インベーダー風シューティングゲーム」を作る方法を完全解説します。この記事を読み終える頃には、親子で「ゲームクリエイター」としての第一歩を踏み出しているはずです。

🎮 完成品で遊んでみよう!

百聞は一見にしかず。まずはこれから作るゲームを実際に体験してみてください。
下のスマホ画面のような枠の中にあるボタン(← SHOT →)をタップして操作します。

1. そもそも、なぜこのゲームが動くの?

これから皆さんにコピーしていただくコードは、実はとても高度なことをやっています。しかし、その仕組みは「パラパラ漫画」と同じです。

パラパラ漫画は、少しずつ変化する絵を高速でめくることで、動いているように見せますよね? コンピュータゲームも全く同じです。

  • 状態の更新 (Update): 「プレイヤーが右に動いた」「弾が少し進んだ」「敵が当たった」などの計算を一瞬で行います。
  • 画面の描画 (Draw): 計算結果をもとに、真っ黒な画面の上にキャラクターや敵の絵を描き直します。
  • 繰り返し (Loop): これを1秒間に約60回という猛スピードで繰り返します。

このサイクル(ループ)を作ることが、ゲーム開発の心臓部です。今回のコードでは gameLoop という名前の機能(関数)がその役割を担っています。

2. コピペで完成!ソースコード

では、いよいよ魔法の呪文(ソースコード)をお渡しします。
以下のボックスの中にあるコードを上から下まですべてコピーしてください。

Windowsであればメモ帳に、Macであればテキストエディット貼り付けて、ファイル名を game.html として保存すれば、すぐに動きます。*Macの場合は標準テキストにしておく必要があります。リッチテキストだとできませんので、注意。

▼ この下のコードを全選択してコピーしてください ▼

↑ ボックスの中をクリックすると全選択されます。

3. プログラミング完全解説(教科書)

「英語がいっぱいで難しそう…」と不安にならないでください。
実は、このゲームのコードはいくつかの「役割」を持ったチームメンバーが協力して動いています。一つずつ見ていきましょう。

🎨 1. お絵かきセットの準備:HTML5 Canvas

まず、ゲームの舞台となる「画用紙」を用意する必要があります。それが <canvas> というタグです。

コードの中ほどにある以下の部分を見てください。

<canvas id="game" width="360" height="480"></canvas>

これはコンピュータに「幅360、高さ480のサイズの画用紙を用意してね。名前は『game』だよ」と命令しています。
そしてJavaScript側では getContext("2d") という命令で、「2D(平面)の絵を描くための筆」を受け取っています。これを使って四角形を描いたり、色を塗ったりするのです。

💃 2. パラパラ漫画の監督:requestAnimationFrame

ゲームが滑らかに動く秘密は、コードの最後の方にあるこの一行です。

requestAnimationFrame(gameLoop);

これはブラウザ(ChromeやSafari)に対して、「次の画面を描く準備ができたら、gameLoopという関数を呼んでね」と予約を入れる命令です。
だいたい1秒間に60回、この予約が実行されます。「計算して、描いて、また予約する」。この無限ループがゲームの命の鼓動なのです。

📐 3. 位置の管理:X座標とY座標

プログラミングで物の位置を表すときは、数学のグラフのような「座標(ざひょう)」を使います。

  • X(エックス):横の位置。右に行くほど数字が増えます。
  • Y(ワイ):縦の位置。下に行くほど数字が増えます。(学校で習うグラフとは逆なので注意!)

例えば、弾を上に飛ばしたいときは、「弾のY座標を減らす」という計算をします。

bullet.y -= bullet.speed; // Yを減らす = 上に進む

💥 4. 当たり判定:衝突のロジック

ゲーム作りで一番難しいのが「当たったかどうか」の判定です。
このゲームでは isColliding という関数がその計算を担当しています。

考え方はシンプルです。「四角形A」と「四角形B」があったとき、「重なっていない状態」を考えます。

  1. AがBよりも完全に左にある
  2. AがBよりも完全に右にある
  3. AがBよりも完全に上にある
  4. AがBよりも完全に下にある

この4つのどれにも当てはまらない場合、つまり「上下左右どこにも逃げ場がない」=「当たっている」と判断するのです。これを「矩形(くけい)衝突判定」と呼び、プロのゲーム開発でも使われる基本テクニックです。

📱 5. スマホ対応の秘密:Pointer Event

スマホでゲームを作るときに一番困るのが、「ボタンを押したつもりなのに、画面がズームしたりスクロールしたりしちゃう!」という問題です。
このコードでは、それを防ぐために pointerdown という最新の技術を使っています。

e.preventDefault(); // 余計な動作(スクロールなど)をキャンセル!

この魔法の一行を入れることで、スマホでもアプリのように快適に操作できるようになっているのです。

4. 自分好みに改造(ハッキング)してみよう!

コードの仕組みがわかったら、今度は改造の時間です。
プログラミング学習で一番力がつくのは、「コードを書き換えて、何が起きるか実験するとき」です。

以下のポイントを探して、数字を変えてみてください。「壊れちゃったらどうしよう…」と心配する必要はありません。もし動かなくなったら、もう一度このページのコードをコピーし直せばいいだけです。

レベル1:ゲームバランスを変えよう

コードの中盤にある「設定値」を変えてみましょう。

  • let bulletSpeed = 7;
    この数字を 20 に変えると、レーザービームのような超高速弾になります!
  • let enemySpawnInterval = 800;
    この数字を 100 に変えると、敵が雨のように降り注ぐ「激ムズモード」になります。クリアできるかな?

レベル2:見た目を変えよう

色を変えるだけでも、ガラッと雰囲気が変わります。
draw() という関数の中を探してください。

  • ctx.fillStyle = "#00ffcc"; (自機の色)
    これを "#ff0000" に変えると、赤い機体になります。
  • ctx.fillStyle = "#ffff00"; (弾の色)
    これを "#0000ff" に変えると、青い弾になります。

レベル3:自機のサイズを変えよう

const player = { ... } の部分を探してください。

  • width: 40100 に変えると、巨大な戦艦になります。当たり判定も大きくなるので注意!
  • 逆に 10 にすると、豆粒のような小さな機体になります。

親御さんへのメッセージ:失敗こそが最高の先生

もしお子さんが改造に挑戦して、画面が真っ白になったり、エラーが出たりしても、決して叱らないでください。
むしろ「おめでとう!壊れる理由を見つけたね!」と褒めてあげてほしいのです。

プログラマーにとって、エラー(バグ)は敵ではありません。「コンピュータは命令された通りにしか動かない」ということを教えてくれる、厳しくも正直な先生です。
「どこを消したから動かなくなったのかな?」と一緒に探偵ごっこをして、原因を突き止めたとき、お子さんの論理的思考力は飛躍的に向上しています。

今日作ったこの小さなゲームが、お子さんの大きな未来への「最初のチケット」になることを願っています。
ぜひ親子で、「ああでもない、こうでもない」と言いながら、ハッキングを楽しんでください!

Pocket

コメント

タイトルとURLをコピーしました