|
|
好的!我们可以使用HTML、CSS和JavaScript来构建一个简单的飞机大战游戏。这个游戏将包括以下几部分:
1. **HTML**:用于定义游戏页面的结构。
2. **CSS**:用于给游戏添加样式。
3. **JavaScript**:用于实现游戏逻辑。
我们将按步骤进行,每一步都解释清楚。
### 第一步:创建 HTML 文件
首先,创建一个 `index.html` 文件,并添加基本的HTML结构:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>飞机大战游戏</title>
- <link rel="stylesheet" href="styles.css">
- </head>
- <body>
- <h1>飞机大战</h1>
- <canvas id="gameCanvas" width="800" height="600"></canvas>
- <script src="script.js"></script>
- </body>
- </html>
复制代码
### 第二步:创建 CSS 文件
接着,创建一个 `styles.css` 文件,为游戏画布和页面添加一些简单的样式:
- body {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- margin: 0;
- background-color: #000;
- color: #fff;
- font-family: Arial, sans-serif;
- }
- h1 {
- margin-bottom: 20px;
- }
- canvas {
- border: 2px solid #fff;
- }
复制代码
### 第三步:编写 JavaScript 文件
最后,创建一个 `script.js` 文件,用于实现游戏的逻辑:
- const canvas = document.getElementById("gameCanvas");
- const ctx = canvas.getContext("2d");
- const player = {
- x: canvas.width / 2 - 25,
- y: canvas.height - 60,
- width: 50,
- height: 50,
- color: 'blue',
- speed: 5
- };
- const bullets = [];
- const enemies = [];
- let gameRunning = true;
- const enemySpeed = 2;
- const bulletSpeed = 7;
- const enemySpawnInterval = 2000; // 每隔2秒生成一个敌机
- function drawPlayer() {
- ctx.fillStyle = player.color;
- ctx.fillRect(player.x, player.y, player.width, player.height);
- }
- function drawBullets() {
- ctx.fillStyle = 'red';
- bullets.forEach(bullet => {
- ctx.fillRect(bullet.x, bullet.y, bullet.width, bullet.height);
- });
- }
- function drawEnemies() {
- ctx.fillStyle = 'green';
- enemies.forEach(enemy => {
- ctx.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);
- });
- }
- function moveBullets() {
- bullets.forEach(bullet => {
- bullet.y -= bulletSpeed;
- });
-
- // 移除离开画布的子弹
- for (let i = bullets.length - 1; i >= 0; i--) {
- if (bullets[i].y < 0) {
- bullets.splice(i, 1);
- }
- }
- }
- function moveEnemies() {
- enemies.forEach(enemy => {
- enemy.y += enemySpeed;
- });
-
- // 移除离开画布的敌机
- for (let i = enemies.length - 1; i >= 0; i--) {
- if (enemies[i].y > canvas.height) {
- enemies.splice(i, 1);
- }
- }
- }
- function spawnEnemy() {
- const x = Math.random() * (canvas.width - 50);
- enemies.push({ x, y: 0, width: 50, height: 50 });
- }
- function detectCollisions() {
- bullets.forEach((bullet, bulletIndex) => {
- enemies.forEach((enemy, enemyIndex) => {
- if (
- bullet.x < enemy.x + enemy.width &&
- bullet.x + bullet.width > enemy.x &&
- bullet.y < enemy.y + enemy.height &&
- bullet.y + bullet.height > enemy.y
- ) {
- bullets.splice(bulletIndex, 1);
- enemies.splice(enemyIndex, 1);
- }
- });
- });
- enemies.forEach((enemy, enemyIndex) => {
- if (
- player.x < enemy.x + enemy.width &&
- player.x + player.width > enemy.x &&
- player.y < enemy.y + enemy.height &&
- player.y + player.height > enemy.y
- ) {
- gameRunning = false;
- alert('游戏结束!');
- window.location.reload();
- }
- });
- }
- function updateGame() {
- if (!gameRunning) return;
- ctx.clearRect(0, 0, canvas.width, canvas.height);
-
- moveBullets();
- moveEnemies();
- detectCollisions();
-
- drawPlayer();
- drawBullets();
- drawEnemies();
- requestAnimationFrame(updateGame);
- }
- function handleKeyDown(e) {
- if (e.key === 'ArrowLeft' && player.x > 0) {
- player.x -= player.speed;
- } else if (e.key === 'ArrowRight' && player.x + player.width < canvas.width) {
- player.x += player.speed;
- } else if (e.key === ' ') {
- bullets.push({ x: player.x + player.width / 2 - 2.5, y: player.y, width: 5, height: 10 });
- }
- }
- document.addEventListener('keydown', handleKeyDown);
- setInterval(spawnEnemy, enemySpawnInterval);
- updateGame();
复制代码
### 功能说明:
1. **玩家控制**:
- 使用箭头键左右移动玩家的飞机。
- 按空格键发射子弹。
2. **子弹**:
- 子弹由玩家的飞机向上发射,与敌人碰撞后消失。
3. **敌人**:
- 随机生成敌人,从上方落下。
- 如果敌人碰到玩家的飞机,游戏结束。
4. **碰撞检测**:
- 当子弹击中敌人时,子弹和敌人都消失。
- 当敌人碰到玩家的飞机时,游戏结束并弹出“游戏结束”的提示。
将这些代码分别保存到 `index.html`、`styles.css` 和 `script.js` 文件中,并确保它们在同一目录下。打开 `index.html` 即可在浏览器中运行飞机大战游戏。
如果你遇到任何问题或需要进一步帮助,请随时告诉我! |
|