射的ゲーム 準備編 (前節までの復習とクリックイベント)
HTMLの基礎復習から始めて、クリックイベントの捕捉、要素の配置、的の見た目作りまで。射的ゲームを作るための土台をしっかりと固めましょう。
射的ゲームを作ってみよう!
Section titled “射的ゲームを作ってみよう!”今回からは、これまで学んだHTML、CSS、JavaScriptの知識を使って、本格的な射的ゲームを作っていきます!お祭りの射的のように、動く的をクリックしてスコアを競うゲームです1。
JavaScriptは現在、Webページ制作に欠かせないプログラミング言語として世界中で広く使われています2。最終的には制限時間やスコア表示がある本格的なゲームになりますが、まずはしっかりと基礎を固めることから始めましょう。
この回では、射的ゲームの土台となる部分を作ります:
- 前準備(前の勉強会の復習) - HTMLに要素を追加してCSSで装飾
- クリックイベントの捕捉 - JavaScriptでクリックを検知
- 要素の範囲を拡大する - 画面全体をクリック範囲に
- 的の見た目を整える - 赤い丸い的を画面中央に配置
あれ?いきなりゲームを作るの? でも、心配しないで!一つ一つ丁寧に進めていくから、きっとできるよ。プログラミングは積み重ねが大切なんだ。
1. 前準備(前の勉強会の復習)
Section titled “1. 前準備(前の勉強会の復習)”まずは、これまで学んだHTMLとCSSの基礎を使って、簡単な要素を作ってみましょう。
HTML に要素を追加する
Section titled “HTML に要素を追加する”HTMLファイルに div 要素を追加します。div は「division(分割)」の略で、特に意味を持たない汎用的な箱のような要素です:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 1</title>
<!-- CSSファイルを読み込む --> <link rel="stylesheet" href="style.css"></head><body> <!-- これが「的」の元となる要素です --> <div class="rect"></div></body></html>/* まだCSSは空っぽです */HTMLのポイント:
<div class="rect"></div>で箱を作成class="rect"でCSSから指定できるように名前を付ける<link rel="stylesheet" href="style.css">でCSSファイルを読み込み
CSS で色と大きさを付ける
Section titled “CSS で色と大きさを付ける”次に、CSSを使って .rect クラスに色と大きさを設定しましょう:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 1</title> <link rel="stylesheet" href="style.css"></head><body> <div class="rect"></div></body></html>.rect { width: 100px; height: 100px; background-color: red;}おお!赤い四角ができた!これが的の最初の形なんだね。
CSSのポイント:
width: 100pxで横幅を100ピクセルに設定height: 100pxで高さを100ピクセルに設定background-color: redで背景色を赤に設定
実践: 自分で要素を作ってみよう
Section titled “実践: 自分で要素を作ってみよう”以下のコメントを参考に、青い長方形を作ってみてください:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>練習: 青い長方形</title> <link rel="stylesheet" href="style.css"></head><body> <!-- TODO: class="blue-rect" のdiv要素を追加してください -->
</body></html>/* TODO: .blue-rect に以下のスタイルを設定してください *//* - 横幅: 150px *//* - 高さ: 80px *//* - 背景色: blue */解答例を見る
<div class="blue-rect"></div>.blue-rect { width: 150px; height: 80px; background-color: blue;}復習のポイント:
- HTMLで要素を作り、CSSで見た目を整える基本の流れ
- クラス名は意味がわかりやすいものを選ぶ
- 横幅と高さを変えることで、様々な形の要素が作れる
2. クリックイベントの捕捉
Section titled “2. クリックイベントの捕捉”次に、JavaScriptを使って、要素がクリックされたときに反応するようにしましょう。
JavaScript ファイルを HTML に読み込む
Section titled “JavaScript ファイルを HTML に読み込む”まず、HTMLファイルにJavaScriptファイルを読み込みます:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 2</title> <link rel="stylesheet" href="style.css"></head><body> <div class="rect"></div>
<!-- JavaScriptファイルを読み込む --> <script src="script.js"></script></body></html>.rect { width: 100px; height: 100px; background-color: red;}// まだJavaScriptは空っぽです重要なポイント:
<script src="script.js"></script>は</body>の直前に配置- これにより、HTMLが完全に読み込まれてからJavaScriptが実行される
要素を取得してクリックイベントを設定
Section titled “要素を取得してクリックイベントを設定”JavaScriptで要素を取得し、クリックイベントを設定します:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 2</title> <link rel="stylesheet" href="style.css"></head><body> <div class="rect"></div> <script src="script.js"></script></body></html>.rect { width: 100px; height: 100px; background-color: red;}// --- 要素の取得 ---// document.querySelector() は、CSSセレクタに一致する要素を見つけてくる命令です// ここでは、HTMLに書いた <div class="rect"></div> を取得していますconst rectElement = document.querySelector(".rect");
// --- イベントリスナーの設定 ---// addEventListener は、特定のイベントが発生したときに処理を実行する命令です// rectElement に対して「クリックされたら、次の処理をしてね」とお願いしていますrectElement.addEventListener("click", () => { // console.log() は、ブラウザの開発者ツールにメッセージを表示する命令です // プログラムが正しく動いているか確認するための重要なツールです console.log("クリックしました!");});おお!赤い四角をクリックしたら、 のところに「クリックしました!」って表示されるよ!
JavaScript の重要な概念:
- 要素の取得:
document.querySelector(".rect")で HTML の要素を JavaScript で操作できるようにする3 - イベントリスナー:
addEventListener("click", ...)でクリックを「聞き耳を立てて」待つ4 - コンソール出力:
console.log()で開発者ツールに情報を表示して動作確認5
実践: クリックイベントを自分で書いてみよう
Section titled “実践: クリックイベントを自分で書いてみよう”以下のコメントを参考に、クリックイベントを設定してみてください:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>練習: クリックイベント</title> <link rel="stylesheet" href="style.css"></head><body> <div class="my-button">ここをクリック!</div> <script src="script.js"></script></body></html>.my-button { width: 200px; height: 60px; background-color: green; color: white; text-align: center; line-height: 60px; cursor: pointer;}// TODO: .my-button 要素を取得してください// const buttonElement = document.querySelector("???");
// TODO: クリックイベントを設定してください// buttonElement.addEventListener("click", () => {// console.log("???");// });解答例を見る
// .my-button 要素を取得const buttonElement = document.querySelector(".my-button");
// クリックイベントを設定buttonElement.addEventListener("click", () => { console.log("ボタンがクリックされました!");});クリックイベントの流れ:
document.querySelector()で要素を取得addEventListener()でクリックを待機- クリックされたら指定した処理を実行
console.log()で動作確認
3. 要素の範囲を拡大する
Section titled “3. 要素の範囲を拡大する”射的ゲームでは、画面のどこをクリックしても反応するようにしたいので、要素の範囲を画面全体に広げてみましょう。
画面全体に要素を広げる
Section titled “画面全体に要素を広げる”CSSの vw(viewport width)と vh(viewport height)という単位を使います:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 3</title> <link rel="stylesheet" href="style.css"></head><body> <div class="rect"></div> <script src="script.js"></script></body></html>body { margin: 0; padding: 0; overflow: hidden;}
.rect { /* vw は 'viewport width' の略で、画面の横幅に対する割合を指定する単位です */ /* 100vw は「画面の横幅の100%」という意味になります */ width: 100vw;
/* vh は 'viewport height' の略で、画面の高さに対する割合を指定する単位です */ /* 100vh は「画面の高さの100%」という意味になります */ height: 100vh;
/* 次に作る的の色をわかりやすくするために背景色を変えます */ background-color: darkblue;}const rectElement = document.querySelector(".rect");
rectElement.addEventListener("click", () => { console.log("画面全体のどこかがクリックされました!");});わあ!画面全体が濃い青になって、どこをクリックしても反応するようになったよ!
viewport単位の便利さ:
100vw= 画面の横幅の100%(画面いっぱいの幅)100vh= 画面の高さの100%(画面いっぱいの高さ)- 画面サイズが変わっても自動的に調整される
- レスポンシブなデザインに重要
実践: 画面サイズに合わせた要素を作ってみよう
Section titled “実践: 画面サイズに合わせた要素を作ってみよう”viewport単位を使って、画面の半分のサイズの要素を作ってみてください:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>練習: viewport単位</title> <link rel="stylesheet" href="style.css"></head><body> <div class="half-screen">画面の半分</div> <script src="script.js"></script></body></html>.half-screen { /* TODO: 画面の横幅の50%に設定してください */ width: ???;
/* TODO: 画面の高さの50%に設定してください */ height: ???;
background-color: purple; color: white;
/* 最新のCSS Gridを使った中央寄せ */ display: grid; place-content: center;}const halfElement = document.querySelector(".half-screen");
halfElement.addEventListener("click", () => { console.log("画面の半分がクリックされました!");});解答例を見る
.half-screen { width: 50vw; height: 50vh; background-color: purple; color: white;
/* 最新のCSS Gridを使った中央寄せ */ display: grid; place-content: center;}viewport単位の活用例:
25vw= 画面幅の25%(4分の1)75vh= 画面高さの75%(4分の3)100vmin= 画面の縦横のうち小さい方の100%100vmax= 画面の縦横のうち大きい方の100%
4. 的の見た目を整える
Section titled “4. 的の見た目を整える”いよいよ射的の「的」を作ります!赤い丸い的を画面の中央に配置しましょう。
HTMLに的の要素を追加
Section titled “HTMLに的の要素を追加”まず、ゲームエリア(.rect)の中に的の要素(.target)を追加します:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 4</title> <link rel="stylesheet" href="style.css"></head><body> <!-- ゲームのプレイエリア --> <div class="rect"> <!-- "target"がプレイヤーが狙う「的」です --> <div class="target"></div> </div>
<script src="script.js"></script></body></html>.rect { width: 100vw; height: 100vh; background-color: darkblue;}
/* まだ .target のスタイルは空っぽです */const rectElement = document.querySelector(".rect");
rectElement.addEventListener("click", () => { console.log("ゲームエリアがクリックされました!");});的を丸い形にする
Section titled “的を丸い形にする”CSSを使って、的を赤い丸にしましょう:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 4</title> <link rel="stylesheet" href="style.css"></head><body> <div class="rect"> <div class="target"></div> </div> <script src="script.js"></script></body></html>.rect { width: 100vw; height: 100vh; background-color: darkblue;}
/* 的のスタイルを定義していきます */.target { /* 的の大きさを指定します */ width: 100px; height: 100px;
/* 的の形を丸くするために、角を丸くします */ border-radius: 50%;
/* 的の色を指定します */ background-color: red;}const rectElement = document.querySelector(".rect");
rectElement.addEventListener("click", () => { console.log("ゲームエリアがクリックされました!");});おお!赤い丸ができた!でも、画面の左上の角にあるね。これを真ん中に持っていきたいな。
丸い形を作るテクニック:
border-radius: 50%で角を丸くして円形に- 正方形(縦横同じサイズ)に
border-radius: 50%を適用すると完全な円になる
的を画面中央に配置する
Section titled “的を画面中央に配置する”CSS Gridを使って、最もシンプルな方法で的を中央に配置してみましょう:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 4 - 最新CSS</title> <link rel="stylesheet" href="style.css"></head><body> <div class="rect"> <div class="target"></div> </div> <script src="script.js"></script></body></html>.rect { width: 100vw; height: 100vh; background-color: darkblue;
/* CSS Gridで中央配置 - 最もシンプルな方法! */ display: grid; place-content: center;}
.target { /* 的の大きさを指定します */ width: 100px; height: 100px;
/* 的の形を丸くするために、角を丸くします */ border-radius: 50%;
/* 的の色を指定します */ background-color: red;
/* クリックできることを示すカーソル */ cursor: pointer;}const rectElement = document.querySelector(".rect");
rectElement.addEventListener("click", () => { console.log("ゲームエリアがクリックされました!");});わあ!たった2行で中央寄せができちゃった! CSS Gridの place-content: center ってすごくシンプルだね!
解説
display: gridでGridレイアウトを有効化place-content: centerで水平・垂直の両方向を一度に中央寄せ
Flexboxを使った方法も知っておこう
Section titled “Flexboxを使った方法も知っておこう”Flexboxも現在よく使われる中央配置の方法です:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 4 - Flexbox版</title> <link rel="stylesheet" href="style.css"></head><body> <div class="rect"> <div class="target"></div> </div> <script src="script.js"></script></body></html>.rect { width: 100vw; height: 100vh; background-color: darkblue;
/* Flexboxで中央配置 */ display: flex; align-items: center; justify-content: center;}
.target { /* 的の大きさを指定します */ width: 100px; height: 100px;
/* 的の形を丸くするために、角を丸くします */ border-radius: 50%;
/* 的の色を指定します */ background-color: red;
/* クリックできることを示すカーソル */ cursor: pointer;}const rectElement = document.querySelector(".rect");
rectElement.addEventListener("click", () => { console.log("ゲームエリアがクリックされました!");});モダンCSS Flexboxの特徴:
display: flexでFlexboxレイアウトを有効化align-items: centerで子要素を垂直方向に中央寄せjustify-content: centerで子要素を水平方向に中央寄せ- 幅広くサポートされており、信頼性が高い
従来の方法(position + transform)も知っておこう
Section titled “従来の方法(position + transform)も知っておこう”一方で、従来の position と transform を使った中央配置も重要なテクニックです:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム Step 4 - 従来版</title> <link rel="stylesheet" href="style.css"></head><body> <div class="rect"> <div class="target"></div> </div> <script src="script.js"></script></body></html>.rect { width: 100vw; height: 100vh; background-color: darkblue;
/* 位置指定の基準点にする */ position: relative;}
.target { /* 的の大きさを指定します */ width: 100px; height: 100px;
/* 的の形を丸くするために、角を丸くします */ border-radius: 50%;
/* 的の色を指定します */ background-color: red;
/* 画面の中心に配置するためのスタイルです */ /* 位置を自由に指定できるようにします */ position: absolute;
/* top: 50%; 親要素の上から50%の位置に、要素の「上辺」を移動します */ top: 50%;
/* left: 50%; 親要素の左から50%の位置に、要素の「左辺」を移動します */ left: 50%;
/* transform: translate(-50%, -50%); 要素自身の大きさの半分だけ、上と左に移動させます これにより、要素の「中心」が親要素の「中心」にぴったり合致します Web制作で非常によく使われるテクニックです */ transform: translate(-50%, -50%);
cursor: pointer;}const rectElement = document.querySelector(".rect");
rectElement.addEventListener("click", () => { console.log("ゲームエリアがクリックされました!");});すごい!赤い丸が画面のど真ん中に来た!この中央配置のテクニック、覚えておくと便利そうだね。
どの方法を使うべき?
- CSS Grid(最推奨): 最もシンプルで分かりやすく、最新の手法
- Flexbox(推奨): 安定しており、幅広くサポートされている
- position + transform: より細かい位置制御が必要な場合や、複数の要素を重ねる場合に有効
実践: 的のクリックイベントを設定してみよう
Section titled “実践: 的のクリックイベントを設定してみよう”今度は的自体にクリックイベントを設定してみましょう:
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>練習: 的のクリック</title> <link rel="stylesheet" href="style.css"></head><body> <div class="rect"> <div class="target"></div> </div> <script src="script.js"></script></body></html>body { margin: 0; padding: 0; overflow: hidden;}
.rect { width: 100vw; height: 100vh; background-color: darkblue;
/* CSS Gridで中央配置(推奨) */ display: grid; place-content: center;}
.target { width: 100px; height: 100px; border-radius: 50%; background-color: red; cursor: pointer; /* マウスを乗せたときに指のカーソルになる */}// TODO: .target 要素を取得してください/*const targetElement = document.querySelector("???");*/
// TODO: 的がクリックされたときのイベントを設定してください/*targetElement.addEventListener("click", () => { console.log("???");});*/解答例を見る
// .target 要素を取得const targetElement = document.querySelector(".target");
// 的がクリックされたときのイベントを設定targetElement.addEventListener("click", () => { console.log("的に命中しました!");});ユーザビリティの改善:
cursor: pointerでマウスを乗せたときに指のカーソルになる- クリックできることがユーザーに伝わりやすくなる
- ゲームの操作性が向上する
総合演習: 射的ゲームの基礎を完成させよう
Section titled “総合演習: 射的ゲームの基礎を完成させよう”これまで学んだ知識を使って、射的ゲームの基礎部分を完成させてみましょう。 以下の要件を満たすように、コメントを参考にして完成させてください。
要件:
- ゲームエリアは画面全体に広がり、濃い青色の背景
- 的は赤い丸で、画面中央に配置
- 的をクリックすると「命中!」とコンソールに表示
- ゲームエリア(的以外)をクリックすると「外れ」とコンソールに表示
- マウスを的に乗せるとカーソルが指の形になる
<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>射的ゲーム基礎完成版</title> <link rel="stylesheet" href="style.css"></head><body> <!-- TODO: ゲームエリアと的の要素を追加してください -->
<script src="script.js"></script></body></html>/*TODO: ゲームエリア(.rect)のスタイルを設定- 画面全体のサイズ- 濃い青色の背景- CSS Gridで中央配置の準備*/
/*TODO: 的(.target)のスタイルを設定- 100px × 100px のサイズ- 赤い色- 丸い形- カーソルを指の形に※ CSS Gridを使うので、positionでの配置は不要*//*TODO: ゲームエリア要素を取得*/
/*TODO: 的要素を取得*/
/*TODO: ゲームエリアのクリックイベント(外れの処理)*/
/*TODO: 的のクリックイベント(命中の処理)ヒント: event.stopPropagation() を使うと、親要素のイベントを止められます*/解答例を見る
<div class="rect"> <div class="target"></div></div>body { margin: 0; padding: 0; overflow: hidden;}
/* ゲームエリアのスタイル */.rect { width: 100vw; height: 100vh; background-color: darkblue;
/* 最新のCSS Gridで中央配置 */ display: grid; place-content: center;}
/* 的のスタイル */.target { width: 100px; height: 100px; border-radius: 50%; background-color: red; cursor: pointer;}// ゲームエリア要素を取得const rectElement = document.querySelector(".rect");
// 的要素を取得const targetElement = document.querySelector(".target");
// ゲームエリアのクリックイベント(外れの処理)rectElement.addEventListener("click", () => { console.log("外れ");});
// 的のクリックイベント(命中の処理)targetElement.addEventListener("click", (event) => { console.log("命中!"); // 親要素(ゲームエリア)のクリックイベントが発火しないように止める event.stopPropagation();});重要なテクニック:
今回は射的ゲームの基礎となる部分を学びました:
今回学んだこと:
- ✅ HTMLとCSSの基礎復習(要素の作成と装飾)
- ✅ JavaScriptによるクリックイベントの捕捉
- ✅ viewport単位を使った画面全体への要素拡大
- ✅ 最新CSS Grid(place-content: center)を使った中央配置
- ✅ Flexboxやposition + transformによる中央配置の選択肢
- ✅ 的の見た目作り(丸い形と配置)
- ✅ イベントバブリングの制御
基礎がしっかりできた!次回はこの的を動かしたり、スコアをつけたりして、本格的なゲームにしていくんだね。楽しみ!
次回は、この土台を使って的をランダムに動かしたり、スコアをカウントしたりして、本格的な射的ゲームに発展させていきます。
しっかりと基礎を理解して、次のステップに進みましょう!
チェックポイント!
- HTMLに要素を追加し、CSSで装飾できる
- JavaScriptでクリックイベントを設定できる
- viewport単位(vw、vh)を理解して使える
- CSS Grid(place-content: center)で中央配置ができる
- Flexbox や position + transform の中央配置手法を理解している
- border-radius で丸い要素を作れる
- event.stopPropagation() でイベント伝播を制御できる
- コンソールでJavaScriptの動作確認ができる
Footnotes
Section titled “Footnotes”-
射的ゲーム実装仕様 ↗ - esa#1049 ↩
-
JavaScriptとは ↗ - esa#1049 ↩
-
JavaScriptでHTMLとCSSを操作する ↗ - esa#1049 ↩
-
HTMLのイベント ↗ - esa#1049 ↩
-
JavaScriptデバッギング ↗ - esa#1049 ↩
-
イベントとJavaScriptを関連付ける方法 ↗ - esa#1049 ↩
-
イベントとJavaScriptを関連付ける方法 ↗ - esa#1049 ↩
射的ゲーム!お祭りの射的みたいで楽しそう!でも、最初は簡単なところから始めるのが大切だよね。