【问题标题】:Collision check loop stops looping after enemy is spawned生成敌人后,碰撞检查循环停止循环
【发布时间】:2017-02-19 20:02:13
【问题描述】:

所以我一直在用 javascript 制作这个小型射击游戏,但遇到了一个我无法弄清楚的问题。

我有一个碰撞检查,它使用 for 循环检查是否有任何活着的敌人与玩家或子弹发生碰撞。循环运行良好,直到我产生一个敌人。

在for循环的开头你可以看到console.log,它只记录数字直到第一个活着的敌人的index。例如,如果enemies[4] 还活着,并且在此之前没有其他具有index 的敌人还活着,它会继续记录0, 1, 2, 34。如果我然后杀死所有敌人,循环会再次运行 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.e­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­nemies[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 的冲突,这是我想要它做的。

【问题讨论】:

  • 你能解释一下你是如何产生敌人的,并解释更多的错误吗?我什至不确定是否有意外行为或错误消息...
  • 有一个计时器,当它达到生成速率限制时,会调用生成函数,将第一个非存活敌人的存活布尔值设置为 true,并且游戏会继续更新该敌人。我希望碰撞检查来检查所有活动对象之间的碰撞,但这不是由于那个错误。控制台没有说任何错误。

标签: javascript for-loop collision-detection


【解决方案1】:

嗯,你有一个循环,它循环遍历所有敌人,但一次只检查一个敌人,并且只针对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 课程,它教你如何使用开源物理引擎,它可以处理这些事情。

在找工作时,我使用该开源项目和该课程中的信息制作了一个小型版本的马里奥。你可以在my website的“项目”下看到游戏。



编辑

所以在你的例子之后,我理解了你的问题。您正在关于子弹的内部循环中重用 imax 变量。因此,如果内循环完成,外循环也将终止,因为它们都检查了i &lt; max

【讨论】:

  • 感谢您的回答,但我想要的是敌人只能与玩家及其子弹相撞。
  • 天哪,我怎么没看到这个。十分感谢!我现在可以完美地工作了。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多