飞机大战javascript
时间: 2025-01-02 19:31:01 浏览: 8
### 使用JavaScript开发飞机大战游戏
#### 创建HTML结构
为了启动项目,需要建立一个基本的HTML框架用于承载游戏。此部分涉及创建画布(Canvas),这是绘制图形的地方。
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Plane War Game</title>
<style>
canvas {
border: 1px solid black;
}
</style>
</head>
<body>
<canvas id="gameCanvas" width="400" height="600"></canvas>
<script src="game.js"></script>
</body>
</html>
```
这段代码定义了一个具有固定尺寸的`canvas`元素作为游戏区域,并通过外部链接的方式加载了名为`game.js`的脚本文件[^1]。
#### 初始化游戏环境
接下来,在`game.js`中初始化必要的变量并设置循环更新机制以保持动画流畅运行。
```javascript
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
let player = { x: 175, y: 500 }; // 初始位置居中偏下
let keysDown = {};
// 处理键盘输入事件监听器注册
window.addEventListener("keydown", (e) => keysDown[e.key] = true);
window.addEventListener("keyup", (e) => delete keysDown[e.key]);
function update() {
if ('ArrowLeft' in keysDown && player.x >= 0) player.x -= 5;
if ('ArrowRight' in keysDown && player.x <= 350) player.x += 5;
draw();
}
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height); // 清除旧帧画面
// 绘制玩家飞船图像
ctx.fillStyle = "red";
ctx.fillRect(player.x, player.y, 50, 30);
requestAnimationFrame(update); // 请求下一帧渲染
}
requestAnimationFrame(update); // 启动首次调用
```
上述代码片段展示了如何利用HTML5 `Canvas API` 来处理绘图操作以及响应用户的按键指令来调整角色的位置[^2]。
#### 添加敌人和子弹功能
为了让游戏更加有趣,可以加入随机生成敌人的逻辑以及允许玩家射击的功能:
```javascript
class Bullet {
constructor(x, y) {
this.x = x;
this.y = y;
this.speedY = -10;
}
move() {
this.y += this.speedY;
}
isOffScreen() {
return this.y < 0 || this.y > canvas.height;
}
draw() {
ctx.fillStyle = 'yellow';
ctx.beginPath();
ctx.arc(this.x, this.y, 3, 0, Math.PI * 2);
ctx.fill();
}
}
class Enemy {
constructor() {
this.resetPosition();
}
resetPosition() {
const margin = 50;
this.x = Math.random() * (canvas.width - margin*2) + margin;
this.y = -margin;
this.speedY = Math.random()*2+1; // 随机速度范围内的下降速率
}
move() {
this.y += this.speedY;
if (this.isOffScreen()) {
this.resetPosition(); // 当超出屏幕底部时重置其坐标到顶部重新进入视野
}
}
isOffScreen() {
return this.y > canvas.height;
}
draw() {
ctx.fillStyle = '#ffcc00'; // 敌方单位颜色设定为橙黄色
ctx.fillRect(this.x, this.y, 40, 40);
}
}
let bullets = [];
let enemies = [];
keysDown[' '] = () => {
let bulletX = player.x + 25; // 子弹从玩家中心射出
let newBullet = new Bullet(bulletX, player.y);
bullets.push(newBullet);
};
update = function() {
[...]
// 更新所有活动对象的状态
bullets.forEach((bullet, index) => {
bullet.move();
if (!bullet.isOffScreen())
bullet.draw();
else
bullets.splice(index, 1); // 移除越界子弹
});
enemies.forEach(enemy => enemy.move());
enemies.forEach(enemy => enemy.draw());
// 定期添加新敌人
if(Math.floor(Math.random() * 100) === 42){
enemies.push(new Enemy());
}
};
```
这里增加了两个类——`Bullet` 和 `Enemy` ,分别代表玩家发射出去的子弹和自动生成并向下的敌人。每当按下空格键就会向列表里增加一颗新的子弹;而每隔一段时间也会有概率性地新增一名敌人参与战斗。
阅读全文