生成敌人后碰撞检查循环停止循环
Collision check loop stops looping after enemy is spawned
所以我一直在用 javascript 制作这款小型射击游戏,但我有 运行 一个我无法解决的问题。
我有一个碰撞检查,它使用 for 循环检查是否有活着的敌人与玩家或子弹发生碰撞。循环 运行 没问题,直到我生成一个敌人。
在 for 循环的开头你可以看到 console.log
,它只记录数字直到第一个活着的敌人的 index
。例如,如果 enemies[4]
还活着并且之前没有其他具有 index
的敌人还活着,它会一直记录 0, 1, 2, 3
和 4
。如果我然后杀死所有敌人,循环 运行 又满 50 次(这是数组的长度),直到敌人产生。
checkCollision: function(){
function calculate(enemy, other){
var r = enemy.r + other.r;
var dx = enemy.posX - other.posX;
var dy = enemy.posY - other.posY;
var d = Math.sqrt((dx * dx) + (dy * dy));
if(r > d){
enemy.alive = false;
other.alive = false;
return true;
}
return false;
}
for (var i = 0, max = this.enemies.length; i < max; i++) {
console.log(i);
if(this.enemies[i].alive){
if(calculate(this.enemies[i], this.player)){
continue;
}
for (var i = 0, max = this.player.weapon.bullets.length; i < max; i++){
if(this.player.weapon.bullets[i].alive){
if(calculate(this.enemies[i], this.player.weapon.bullets[i])){
break;
}
}
}
}
}
}
这里是一个小可视化:
[0] = !alive
[1] = alive
[2] = !alive
[3] = alive
[4] = alive
现在 for 循环只会 运行 2 次,因此不检查 3 和 4 的碰撞,这正是我想要它做的。
好吧,你有一个循环,循环遍历所有敌人,但一次只检查一个敌人,并且只检查 player
,而不检查彼此。
所以尝试这样的事情:
for (var i = 0, max = this.enemies.length; i < max; i++) {
for (var j = 0, max = this.enemies.length; j < max; j++) {
if(calculate(this.enemies[i], this.enemies[j]){
doSomething();
}
}
}
// Don't forget the player.
如果您有兴趣,有一门很好的 HTML5 Game Development 课程教您如何使用开源物理引擎,它会处理这些事情。
在找工作时,我使用那个开源项目和那个课程的信息制作了一个小版本的马里奥。您可以在 "projects" 下的 my website 上看到游戏。
编辑
所以在你的例子之后我明白了你的问题。您正在有关项目符号的内部循环中重用 i
和 max
变量。因此,如果内循环完成,外循环也将终止,因为它们都检查 i < max
.
所以我一直在用 javascript 制作这款小型射击游戏,但我有 运行 一个我无法解决的问题。
我有一个碰撞检查,它使用 for 循环检查是否有活着的敌人与玩家或子弹发生碰撞。循环 运行 没问题,直到我生成一个敌人。
在 for 循环的开头你可以看到 console.log
,它只记录数字直到第一个活着的敌人的 index
。例如,如果 enemies[4]
还活着并且之前没有其他具有 index
的敌人还活着,它会一直记录 0, 1, 2, 3
和 4
。如果我然后杀死所有敌人,循环 运行 又满 50 次(这是数组的长度),直到敌人产生。
checkCollision: function(){
function calculate(enemy, other){
var r = enemy.r + other.r;
var dx = enemy.posX - other.posX;
var dy = enemy.posY - other.posY;
var d = Math.sqrt((dx * dx) + (dy * dy));
if(r > d){
enemy.alive = false;
other.alive = false;
return true;
}
return false;
}
for (var i = 0, max = this.enemies.length; i < max; i++) {
console.log(i);
if(this.enemies[i].alive){
if(calculate(this.enemies[i], this.player)){
continue;
}
for (var i = 0, max = this.player.weapon.bullets.length; i < max; i++){
if(this.player.weapon.bullets[i].alive){
if(calculate(this.enemies[i], this.player.weapon.bullets[i])){
break;
}
}
}
}
}
}
这里是一个小可视化:
[0] = !alive
[1] = alive
[2] = !alive
[3] = alive
[4] = alive
现在 for 循环只会 运行 2 次,因此不检查 3 和 4 的碰撞,这正是我想要它做的。
好吧,你有一个循环,循环遍历所有敌人,但一次只检查一个敌人,并且只检查 player
,而不检查彼此。
所以尝试这样的事情:
for (var i = 0, max = this.enemies.length; i < max; i++) {
for (var j = 0, max = this.enemies.length; j < max; j++) {
if(calculate(this.enemies[i], this.enemies[j]){
doSomething();
}
}
}
// Don't forget the player.
如果您有兴趣,有一门很好的 HTML5 Game Development 课程教您如何使用开源物理引擎,它会处理这些事情。
在找工作时,我使用那个开源项目和那个课程的信息制作了一个小版本的马里奥。您可以在 "projects" 下的 my website 上看到游戏。
编辑
所以在你的例子之后我明白了你的问题。您正在有关项目符号的内部循环中重用 i
和 max
变量。因此,如果内循环完成,外循环也将终止,因为它们都检查 i < max
.