所以我一直在努力使用 HTML5 和 JavaScript 进行游戏。我正在尝试制作一个太空侵略者风格的游戏,结果我有很多敌人。我有单独的函数专门用于创建敌人数组、将它们绘制到屏幕上、移动敌人并最终移除它们。然而,清除敌人会引起问题。这是我的逻辑,如果敌人的生命值小于或等于 0,则从数组中删除敌人并将数组长度缩小 1。现在逻辑表明这可能是一场灾难,如果你开始从数组的开头,因为数组长度会减少,这正是我的问题,如此之低,看我的代码。
function hostile(x, y) {
this.speed = 1;
this.health = 100;
this.x = x;
this.y = y;
this.height = 32;
this.width = 32;
this.isDead = false;
this.direction = 0;
this.deadCount = 0;
this.firing = false;
//this.moving = true;
this.move = function () {
if (this.isDead === false && gameStart === true) {
context.clearRect(0, 0, canvas1.width, canvas1.height);
if (this.x > canvas.width - 64) {
this.y += 10;
this.direction = 0;
}
if (this.x < 0) {
this.y += 10;
}
if (this.direction === 1) {
this.x += this.speed;
} else {
this.x -= this.speed;
}
if (this.x < 0) {
this.direction = 1;
}
if (this.y > 420) {
this.x = 600;
}
}
};
this.draw = function () {
context.drawImage(sprite, 0, 480, 65, 68, this.x, this.y, 65, 65);
};
this.reset = function () {
context.clearRect(this.x, this.y, 65, 65);
this.x = 20;
this.y = 20;
this.health = 100;
};
};
var enemylist = [];
function createEnemies() {
for (var i = 0; i < 6; i++) {
enemylist.push(new hostile(75 * i, 20));
}
};
function deleteEnemy(a) {
enemylist.splice(a);
enemyBulletList.splice(a);
//enemylist.length = enemylist.length-1;
//enemyBulletList.length = enemyBulletList.length - 1;
};
createEnemies();
function moveEnemies() {
for (var i = 0; i < enemylist.length; i++) {
if (enemylist[i].isDead === false && gameStart === true) {
if (enemylist[i].x > canvas.width - 64) {
enemylist[i].y += 10;
enemylist[i].direction = 0;
}
if (enemylist[i].x < 0) {
enemylist[i].y += 10;
}
if (enemylist[i].direction === 1) {
enemylist[i].x += enemylist[i].speed;
} else {
enemylist[i].x -= enemylist[i].speed;
}
if (enemylist[i].x < 0) {
enemylist[i].direction = 1;
}
if (enemylist[i].y > 420) {
enemylist[i].x = 600;
}
}
}
};
所以为了解释我的问题,我可以射击并杀死阵列中的敌人,这也会将它们从屏幕上移除。但是,如果我从阵列的开头射击敌人,我会导致所有敌人从屏幕上清除并且游戏崩溃。如果您需要更多信息,请随时询问。
根据要求,我提交了更多与我的问题相关的代码。上面的代码包括敌对函数和其他直接关联的函数。
编辑: Vitim.us 就我的问题提供了一个非常有用的提示,他建议创建某种标志(var dead = false/true 等),一旦更改值,就可以简单地从屏幕上删除特定实例远离玩家。