フロントエンドゲーム開発の実践

目次

1 はじめに

2. 準備

2.1 エディター

2.2 ブラウザ

2.3 HTML、CSS、JavaScript の基本的な知識

2.4 バージョン管理ツール

3. ゲームを初期化する

3.1 HTML構造の作成

3.2 ゲームの基本構成を設定する

4. ゲーム要素をレンダリングする

4.1 ゲーム要素の作成

4.2 ゲームインタラクションの追加

5. ゲームアニメーション

5.1 requestAnimationFrame の使用

5.2 ゲーム要素の位置を更新する

6. 衝突検知

6.1 AABB 衝突検出

6.2 衝突検知の応用

7. ゲームオーバー

7.1 ゲーム終了条件の判定

7.2 ゲーム結果の表示

7.3 ゲームの再開

8. パフォーマンスの最適化

8.1 CSSアニメーションの使用

8.2 Web ワーカーの使用

8.3 頻繁な DOM 操作を避ける

9. テストと展開

9.1 テストの実行

9.2 最適化とバグ修正

9.3 ゲームのデプロイ

10. まとめ


1 はじめに

フロントエンド ゲーム開発は、挑戦的で創造的な分野です。Web テクノロジーの継続的な発展により、フロントエンド ゲームはパフォーマンス、インタラクション、視覚効果の点で大幅に向上しました。このブログでは、HTML5、CSS3、JavaScript テクノロジを使用して、ゲームの初期化、レンダリング、インタラクション、アニメーションなどのコア機能を含むシンプルなフロントエンド ゲームを開発する方法を段階的に紹介します。

2. 準備

フロントエンドゲーム開発を始める前に、開発環境とツールを準備する必要があります。基本的な準備は次のとおりです。

2.1 エディター

好みのコード エディターを選択してください。豊富なプラグインや機能をサポートし、開発効率を向上させることができる Visual Studio Code を使用することをお勧めします。

2.2 ブラウザ

ゲーム開発には多くの HTML、CSS、JavaScript コードが含まれるため、開発とテストのプラットフォームとして最新のブラウザを選択する必要があります。最新バージョンの Chrome または Firefox ブラウザを使用することをお勧めします。

2.3 HTML、CSS、JavaScript の基本的な知識

ゲーム開発には、HTML タグ、CSS スタイル、JavaScript プログラミングなど、ある程度のフロントエンドの知識が必要です。これらの知識に慣れていない場合は、まず基本的なチュートリアルを学ぶことをお勧めします。

2.4 バージョン管理ツール

コード管理とチームのコラボレーションを容易にするために、バージョン管理ツールとして Git を使用することをお勧めします。

準備作業が完了したら、フロントエンドゲームの開発を開始できます。

3. ゲームを初期化する

ゲーム開発を始める前に、ゲームシーンと要素を初期化し、ゲームの基本構成とパラメータを設定する必要があります。

3.1 HTML構造の作成

まず、ゲーム シーンと要素をホストする HTML ファイルを作成する必要があります。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Frontend Game</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <div id="game-container">
    <!-- 游戏元素将会渲染在这里 -->
  </div>
  <script src="game.js"></script>
</body>
</html>

上記のコードでは、divゲーム シーンと要素をホストする要素を作成しました。またgame.js、ゲーム ロジックの実装に使用される という JavaScript ファイルが導入されました。

3.2 ゲームの基本構成を設定する

このファイルではgame.js、ゲームの基本構成とパラメータを設定する必要があります。

const gameConfig = {
  width: 800, // 游戏宽度
  height: 600, // 游戏高度
  backgroundColor: '#f0f0f0', // 背景颜色
};

// 获取游戏容器元素
const gameContainer = document.getElementById('game-container');

// 设置游戏容器大小
gameContainer.style.width = `${gameConfig.width}px`;
gameContainer.style.height = `${gameConfig.height}px`;
gameContainer.style.backgroundColor = gameConfig.backgroundColor;

上記のコードでは、gameConfigゲームの基本構成とパラメータを保存するために使用される という名前のオブジェクトを定義しました。次に、ゲームコンテナ要素を取得し、ゲームシーンに合わせてコンテナのサイズと背景色を設定します。

4. ゲーム要素をレンダリングする

次に、プレイヤー キャラクター、敵、障害物などのゲーム要素をゲーム シーンにレンダリングする必要があります。

4.1 ゲーム要素の作成

まずはプレイヤーキャラクター要素を作成しましょう。

const playerConfig = {
  width: 50,
  height: 50,
  color: 'red',
  x: gameConfig.width / 2 - 25,
  y: gameConfig.height - 100,
};

const player = document.createElement('div');
player.style.width = `${playerConfig.width}px`;
player.style.height = `${playerConfig.height}px`;
player.style.backgroundColor = playerConfig.color;
player.style.position = 'absolute';
player.style.left = `${playerConfig.x}px`;
player.style.top = `${playerConfig.y}px`;

gameContainer.appendChild(player);

上記のコードでは、playerConfigプレイヤー キャラクターの基本構成とパラメータを保持するために使用される という名前のオブジェクトを定義しました。次に、div要素を作成し、要素のサイズ、色、位置などのスタイルを設定します。最後に要素をゲームコンテナに追加します。

4.2 ゲームインタラクションの追加

キーボード イベントを通じてプレイヤー キャラクターの動きを制御できます。

const playerSpeed = 5;

document.addEventListener('keydown', (event) => {
  if (event.key === 'ArrowLeft') {
    const currentLeft = parseInt(player.style.left);
    player.style.left = `${currentLeft - playerSpeed}px`;
  } else if (event.key === 'ArrowRight') {
    const currentLeft = parseInt(player.style.left);
    player.style.left = `${currentLeft + playerSpeed}px`;
  }
});

keydown上記のコードでは、イベントをリッスンし、押されたキーが左矢印か右矢印かを判断します。ボタンに応じてプレイヤーキャラクターの位置を更新し、プレイヤーキャラクターの左右の動きを実現します。

5. ゲームアニメーション

ゲームをよりダイナミックでインタラクティブにするために、ゲーム アニメーション効果を追加できます。

5.1 使用方法requestAnimationFrame

ゲーム開発では、requestAnimationFrame滑らかなアニメーション効果を実現するためによく使用されます。

function gameLoop() {
  // 游戏逻辑和渲染

  requestAnimationFrame(gameLoop);
}

requestAnimationFrame(gameLoop);

上記のコードでは、gameLoopゲーム ロジックとレンダリングを処理する という関数を定義しました。次に、関数を再帰的にrequestAnimationFrame呼び出してgameLoopゲーム アニメーションを実現します。

5.2 ゲーム要素の位置を更新する

ゲーム ループでは、ゲーム要素の位置と状態を更新して、ゲームのアニメーション効果を実現できます。

let playerX = gameConfig.width / 2 - 25;

function gameLoop() {
  // 更新玩家角色位置
  player.style.left = `${playerX}px`;

  requestAnimationFrame(gameLoop);
}

requestAnimationFrame(gameLoop);

上記のコードでは、変数を使用してplayerXプレイヤー キャラクターの位置を保持します。gameLoop関数では、更新されたplayerX値はプレイヤー キャラクターをアニメーション化するために使用されます。

6. 衝突検知

ゲーム開発において、衝突検出はゲーム要素間で衝突が発生したかどうかを検出する重要な機能です。

6.1 AABB 衝突検出

この例では、単純な AABB (Axis-Aligned Bounding Box) 衝突検出を使用して、2 つの要素が衝突するかどうかを判断します。

function isColliding(element1, element2) {
  const rect1 = element1.getBoundingClientRect();
  const rect2 = element2.getBoundingClientRect();

  return (
    rect1.left < rect2.left + rect2.width &&
    rect1.left + rect1.width > rect2.left &&
    rect1.top < rect2.top + rect2.height &&
    rect1.top + rect1.height > rect2.top
  );
}

上記のコードでは、isColliding2 つの要素が衝突するかどうかを判断する関数を定義します。衝突検出は、2 つの要素のバウンディング ボックスの境界を取得し、重なりがあるかどうかを判断することで実行されます。

6.2 衝突検知の応用

ゲーム ループ内で関数を呼び出して、isCollidingプレイヤー キャラクターが他のゲーム要素と衝突するかどうかを検出できます。

function gameLoop() {
  // 更新玩家角色位置
  player.style.left = `${playerX}px`;

  // 碰撞检测
  if (isColliding(player, enemy)) {
    // 处理碰撞逻辑
  }

  requestAnimationFrame(gameLoop);
}

requestAnimationFrame(gameLoop);

上記のコードでは、関数内で関数をgameLoop呼び出して、プレイヤー キャラクターが敵要素と衝突したかどうかを検出します。isColliding衝突が発生した場合、体力の減少やゲームオーバーなど、衝突のロジックをここで処理できます。

7. ゲームオーバー

ゲームの終了はゲーム開発の重要な部分であり、ゲームが特定の条件に達したときにゲームを終了し、ゲーム結果を表示する必要があります。

7.1 ゲーム終了条件の判定

ゲーム開発では、プレイヤーのライフ値がゼロになる、プレイヤーがエンドに到達するなど、ゲームの終了条件をいくつか設定できます。

function gameLoop() {
  // 更新玩家角色位置
  player.style.left = `${playerX}px`;

  // 碰撞检测
  if (isColliding(player, enemy)) {
    // 处理碰撞逻辑
  }

  // 判断游戏结束条件
  if (playerHealth <= 0) {
    endGame('Game Over');
    return;
  }

  requestAnimationFrame(gameLoop);
}

playerHealth上記のコードでは、プレーヤーの健康状態を保持する変数を設定します。gameLoop関数内ではplayerHealthゼロかどうかを判定し、ゼロであればendGame関数を呼び出してゲームを終了し、ゲームオーバーの情報を表示します。

7.2 ゲーム結果の表示

ゲームが終了すると、ダイアログ ボックスをポップアップ表示したり、ゲーム シーン全体をカバーしてゲーム結果を表示したりできます。

function endGame(message) {
  const endGameOverlay = document.createElement('div');
  endGameOverlay.className = 'end-game-overlay';
  endGameOverlay.innerHTML = `<p>${message}</p>`;

  gameContainer.appendChild(endGameOverlay);
}

上記のコードでは、divゲーム シーン全体をカバーし、ゲーム オーバー情報を表示する要素を作成します。

7.3 ゲームの再開

ゲーム結果を表示した後、ゲームを再起動するオプションを提供できます。

function endGame(message) {
  const endGameOverlay = document.createElement('div');
  endGameOverlay.className = 'end-game-overlay';
  endGameOverlay.innerHTML = `<p>${message}</p><button onclick="restartGame()">Restart</button>`;

  gameContainer.appendChild(endGameOverlay);
}

function restartGame() {
  // 重置游戏状态和元素
  playerHealth = 100;
  playerX = gameConfig.width / 2 - 25;

  const endGameOverlay = document.querySelector('.end-game-overlay');
  gameContainer.removeChild(endGameOverlay);

  requestAnimationFrame(gameLoop);
}

上記のコードでは、ゲームオーバーメッセージにゲームを再開するボタンを追加しました。ユーザーがボタンをクリックすると、restartGame関数が呼び出され、ゲームの状態と要素がリセットされ、ゲーム ループが再開されます。

8. パフォーマンスの最適化

ゲーム開発では、パフォーマンスが重要な要素です。ゲームをスムーズに実行するには、ゲームのパフォーマンスを最適化する必要があります。

8.1 CSSアニメーションの使用

いくつかの単純なアニメーション効果では、JavaScript アニメーションの代わりに CSS アニメーションを使用できるため、CPU への負担が軽減されます。

@keyframes moveLeft {
  0% { left: 0; }
  100% { left: 100px; }
}

.player {
  animation: moveLeft 1s linear infinite;
}

moveLeft上記のコードでは、要素の左側への移動を制御するために使用される という CSS アニメーションを定義しました。このアニメーションはプレーヤー キャラクター要素に適用され、プレーヤー キャラクターが左に移動するアニメーションが生成されます。

8.2 Web ワーカーの使用

一部の複雑なゲームでは、メイン スレッドのブロックを避けるために、Web ワーカーを使用して時間のかかるコンピューティング タスクを処理できます。

// main.js
const worker = new Worker('worker.js');

worker.onmessage = (event) => {
  const result = event.data;
  // 处理计算结果
};

// worker.js
function complexCalculation(data) {
  // 复杂计算
  return result;
}

self.onmessage = (event) => {
  const data = event.data;
  const result = complexCalculation(data);
  self.postMessage(result);
};

上記のコードでは、main.jsで Web ワーカーを作成し、複雑な計算タスクをワーカーに渡しました。ではworker.js、複雑な計算タスクを処理する関数を定義しますcomplexCalculation次に、ワーカーでイベントをリッスンし、messageデータを受信した後にcomplexCalculation計算する関数を呼び出し、postMessageメソッドを通じて結果をメインスレッドに送信します。

8.3 頻繁な DOM 操作を避ける

DOM 操作には時間がかかるため、ゲーム ループでは、頻繁な DOM 操作を避けるようにしてください。キャッシュされた DOM 要素を使用すると、クエリ操作を減らし、パフォーマンスを向上させることができます。

const player = document.getElementById('player');

function gameLoop() {
  // 更新玩家角色位置
  player.style.left = `${playerX}px`;

  requestAnimationFrame(gameLoop);
}

上記のコードでは、ゲーム ループの外側でプレイヤー キャラクター要素をキャッシュしますplayer。これにより、ゲーム ループ内での要素の頻繁なクエリが回避されます。

9. テストと展開

ゲームの開発後は、ゲームをテストしてデプロイして、さまざまな環境やデバイスでゲームが正常に実行できることを確認する必要があります。

9.1 テストの実行

テスト段階では、ゲームの機能テストとパフォーマンス テストを実行する必要があります。機能テストは、プレーヤーの制御、衝突検出、ゲームオーバーなど、ゲームのさまざまな機能が正しく動作していることを確認するために使用されます。パフォーマンス テストは、さまざまなデバイスでのゲームのパフォーマンスを評価し、さまざまな状況でゲームがスムーズに実行できることを確認するために使用されます。

9.2 最適化とバグ修正

テスト中に、パフォーマンスの問題やバグが発見される場合があります。テスト結果によると、ゲームの安定性と流暢性を確保するには、ゲームを最適化してバグを修正する必要があります。

9.3 ゲームのデプロイ

テストと最適化の後、プレーヤーがアクセスしてプレイできるオンライン環境にゲームを展開できます。

10. まとめ

このブログの実践的なデモンストレーションを通じて、HTML5、CSS3、JavaScript などのテクノロジを使用して単純なフロントエンド ゲームを開発する方法を学びました。ゲームの初期化、レンダリング、インタラクション、アニメーションから、衝突検出、ゲームの終了、パフォーマンスの最適化まで、シンプルなフロントエンド ゲーム開発プロセスを段階的に完了しました。

おすすめ

転載: blog.csdn.net/m0_68036862/article/details/132040136