javascript - 碰撞检查循环在敌人生成后停止循环

标签 javascript for-loop collision-detection

所以我一直在用 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 的碰撞,这正是我想要的。

最佳答案

好吧,你有一个循环,它会遍历所有敌人,但一次仅检查一个敌人,并且仅针对 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类(class)教您如何使用开源物理引擎来处理这些事情。

在找工作时,我使用该开源项目以及该类(class)中的信息制作了一个小版本的 Mario。您可以在my website上查看游戏在“项目”下。

<小时/> <小时/>

编辑

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

关于javascript - 碰撞检查循环在敌人生成后停止循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42326623/

相关文章:

javascript - 在 meteor 中每天安排一个任务

javascript - 使用对象文字表示法根据另一个属性设置属性的值

javascript - 在 JavaScript 中设置子类的 .prototype

c++ - for 循环在满足条件时不会结束

unity-game-engine - 2D 项目中的对象不发生碰撞

javascript - googlechart 可以同时查询超过 1 个电子表格吗?

Java:如何防止使用条件语句将重复项添加到 ArrayList 中?

ios - 在 SpriteKit 中检测多重碰撞

java - 平台碰撞和跳跃的奇怪行为

javascript - 如何根据用户在提示中输入的数字来减少 JavaScript 中的 for 循环?