window.onload = function() {
var gameCanvas = document.getElementById("gameCanvas");
var ctx = gameCanvas.getContext("2d");
// 游戏状态
var gameState = {
currentScene: "start", // 当前场景:start, game, end
score: 0,
lives: 3,
gameOver: false,
player: {
x: 50,
y: 150,
width: 50,
height: 50,
speed: 5,
isJumping: false,
jumpHeight: 100,
jumpSpeed: 10,
jumPCount: 0
},
obstacles: [],
obstacleSpeed: 5,
obstacleFrequency: 100,
obstacleTimer: 0,
bullets: [],
bulletSpeed: 10,
bulletFrequency: 20,
bulletTimer: 0,
enemies: [],
enemySpeed: 3,
enemyFrequency: 150,
enemyTimer: 0
};
// 加载图像
var images = {};
var imageSources = {
player: "images/player.png",
obstacle: "images/obstacle.png",
bullet: "images/bullet.png",
enemy: "images/enemy.png",
background: "images/background.png"
};
var imagesLoaded = 0;
var totalImages = Object.keys(imageSources).length;
for (var key in imageSources) {
images[key] = new Image();
images[key].src = imageSources[key];
images[key].onload = function() {
imagesLoaded++;
if (imagesLoaded === totalImages) {
startGame();
}
};
}
function startGame() {
// 设置游戏循环
setInterval(gameLoop, 1000 / 60);
}
function gameLoop() {
update();
render();
}
function update() {
if (gameState.currentScene === "game") {
// 更新玩家
updatePlayer();
// 更新障碍物
updateObstacles();
// 更新子弹
updateBullets();
// 更新敌人
updateEnemies();
// 检查碰撞
checkCollisions();
// 检查游戏结束
if (gameState.lives = player.jumpHeight) {
player.isJumping = false;
player.jumpCount = 0;
}
} else {
if (player.y gameCanvas.height - player.height) player.y = gameCanvas.height - player.height;
}
function updateObstacles() {
gameState.obstacleTimer++;
if (gameState.obstacleTimer >= gameState.obstacleFrequency) {
gameState.obstacles.push({
x: gameCanvas.width,
y: gameCanvas.height - 50,
width: 30,
height: 50
});
gameState.obstacleTimer = 0;
}
for (var i = 0; i = gameState.bulletFrequency) {
gameState.bullets.push({
x: gameState.player.x + gameState.player.width,
y: gameState.player.y + gameState.player.height / 2 - 5,
width: 10,
height: 10
});
gameState.bulletTimer = 0;
}
for (var i = 0; i gameCanvas.width) {
gameState.bullets.splice(i, 1);
i--;
}
}
}
function updateEnemies() {
gameState.enemyTimer++;
if (gameState.enemyTimer >= gameState.enemyFrequency) {
gameState.enemies.push({
x: gameCanvas.width,
y: gameCanvas.height - 50,
width: 30,
height: 50
});
gameState.enemyTimer = 0;
}
for (var i = 0; i obstacle.x &&
player.y obstacle.y) {
gameState.lives--;
gameState.obstacles.splice(i, 1);
i--;
}
}
// 检查与敌人的碰撞
for (var i = 0; i enemy.x &&
player.y enemy.y) {
gameState.lives--;
gameState.enemies.splice(i, 1);
i--;
}
}
// 检查子弹与敌人的碰撞
for (var i = 0; i enemy.x &&
bullet.y enemy.y) {
gameState.score += 10;
gameState.bullets.splice(i, 1);
gameState.enemies.splice(j, 1);
i--;
j--;
break;
}
}
}
}
function render() {
// 清空画布
ctx.clearRect(0, 0, gameCanvas.width, gameCanvas.height);
if (gameState.currentScene === "start") {
renderStartScene();
} else if (gameState.currentScene === "game") {
renderGameScene();
} else if (gameState.currentScene === "end") {
renderEndScene();
}
}
function renderStartScene() {
// 绘制背景
ctx.fillStyle = "#87CEEB";
ctx.fillRect(0, 0, gameCanvas.width, gameCanvas.height);
// 绘制标题
ctx.fillStyle = "#000";
ctx.font = "30px Arial";
ctx.fillText("子弹天堂", gameCanvas.width / 2 - 80, 100);
// 绘制开始按钮
ctx.fillStyle = "#0F0";
ctx.fillRect(gameCanvas.width / 2 - 50, 150, 100, 50);
ctx.fillStyle = "#000";
ctx.font = "20px Arial";
ctx.fillText("开始游戏", gameCanvas.width / 2 - 40, 180);
}
function renderGameScene() {
// 绘制背景
ctx.drawImage(images.background, 0, 0, gameCanvas.width, gameCanvas.height);
// 绘制玩家
ctx.drawImage(images.player, gameState.player.x, gameState.player.y, gameState.player.width, gameState.player.height);
// 绘制障碍物
for (var i = 0; i gameCanvas.width / 2 - 50 && mouseX 150 && mouseY gameCanvas.width / 2 - 50 && mouseX 200 && mouseY

