|
|
明白了!如果你想要修改敌人的图标,你需要像处理玩家飞机一样,为敌人也加载一个图像,并在 `drawEnemies` 函数中使用 `drawImage` 方法来绘制敌人。
以下是更新后的代码,包括如何为敌人加载和绘制图像:
### 更新后的 JavaScript(script.js):
- const canvas = document.getElementById('gameCanvas');
- const ctx = canvas.getContext('2d');
- canvas.width = 600;
- canvas.height = 600;
- const playerWidth = 50;
- const playerHeight = 50;
- let playerX = (canvas.width - playerWidth) / 2;
- let playerY = canvas.height - playerHeight - 10;
- const playerSpeed = 7;
- let bullets = [];
- let enemies = [];
- let score = 0;
- // 加载飞机图片
- const playerImage = new Image();
- playerImage.src = 'player.png';
- // 加载敌人图片
- const enemyImage = new Image();
- enemyImage.src = 'enemy.png';
- document.addEventListener('keydown', movePlayer);
- document.addEventListener('keydown', shootBullet);
- function movePlayer(e) {
- if (e.key === 'ArrowLeft' && playerX > 0) {
- playerX -= playerSpeed;
- }
- if (e.key === 'ArrowRight' && playerX < canvas.width - playerWidth) {
- playerX += playerSpeed;
- }
- }
- function shootBullet(e) {
- if (e.key === ' ') {
- bullets.push({ x: playerX + playerWidth / 2 - 2.5, y: playerY, speed: 10 });
- }
- }
- function drawPlayer() {
- const degrees = 0; // 旋转角度
- const radians = degrees * (Math.PI / 180); // 将角度转换为弧度
-
- ctx.save(); // 保存当前画布状态
- ctx.translate(playerX + playerWidth / 2, playerY + playerHeight / 2); // 将原点移动到图像中心
- ctx.rotate(radians); // 旋转画布
- ctx.drawImage(playerImage, -playerWidth / 2, -playerHeight / 2, playerWidth, playerHeight); // 绘制图像
- ctx.restore(); // 恢复画布到之前保存的状态
- }
- function drawBullets() {
- ctx.fillStyle = '#ff0';
- bullets.forEach((bullet, index) => {
- bullet.y -= bullet.speed;
- ctx.fillRect(bullet.x, bullet.y, 5, 15);
- if (bullet.y < 0) {
- bullets.splice(index, 1);
- }
- });
- }
- function drawEnemies() {
- enemies.forEach((enemy, index) => {
- enemy.y += enemy.speed;
- ctx.drawImage(enemyImage, enemy.x, enemy.y, enemy.width, enemy.height);
- if (enemy.y > canvas.height) {
- enemies.splice(index, 1);
- gameOver();
- }
- });
- }
- function generateEnemies() {
- if (Math.random() < 0.01) { // 敌人生成概率调整
- const x = Math.random() * (canvas.width - 50); // 假设敌人宽度为50
- enemies.push({ x: x, y: 0, width: 50, height: 50, speed: 3 });
- }
- }
- function detectCollisions() {
- bullets.forEach((bullet, bIndex) => {
- enemies.forEach((enemy, eIndex) => {
- if (bullet.x > enemy.x && bullet.x < enemy.x + enemy.width &&
- bullet.y > enemy.y && bullet.y < enemy.y + enemy.height) {
- score += 10;
- bullets.splice(bIndex, 1);
- enemies.splice(eIndex, 1);
- }
- });
- });
- enemies.forEach(enemy => {
- if (playerX < enemy.x + enemy.width &&
- playerX + playerWidth > enemy.x &&
- playerY < enemy.y + enemy.height &&
- playerY + playerHeight > enemy.y) {
- gameOver();
- }
- });
- }
- function gameOver() {
- alert(`Game Over! Your score is ${score}`);
- document.location.reload();
- }
- function update() {
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- drawPlayer();
- drawBullets();
- drawEnemies();
- detectCollisions();
- generateEnemies();
- requestAnimationFrame(update);
- }
- update();
复制代码
### 解释:
1. **加载敌人图片**:通过 `new Image()` 创建一个新的图片对象,并将 `src` 属性设置为敌人图片路径。
- const enemyImage = new Image();
- enemyImage.src = 'enemy.png';
复制代码
2. **使用 `drawImage` 方法绘制敌人**:在 `drawEnemies` 函数中,替换原来的填充矩形的方法,改用 `drawImage` 方法来绘制敌人图像。
- function drawEnemies() {
- enemies.forEach((enemy, index) => {
- enemy.y += enemy.speed;
- ctx.drawImage(enemyImage, enemy.x, enemy.y, enemy.width, enemy.height);
- if (enemy.y > canvas.height) {
- enemies.splice(index, 1);
- gameOver();
- }
- });
- }
复制代码
确保你的 `enemy.png` 图片文件存在于你的项目目录中,并且路径正确。这样,你的敌人就会显示为图片,而不是原来的方块。
如果你还有其他问题或需要进一步帮助,请随时告诉我! |
|