基本画布碰撞不适用于for循环

时间:2016-01-29 15:51:43

标签: javascript html5 canvas collision

我遇到了一个我无法理解的碰撞问题。我的程序的要点是在一个1920x900的边界框中生成一个随机数的圆圈(2到15之间)和随机速度。如果他们互相接触,他们就应该朝着相反的方向飞去(不是很好的物理,我知道,但是后来会来。)

为此,我有四个阵列:两个用于圆圈的坐标(xcords []和ycords [],两个用于每个圆圈的动量(xdirs []和ydirs [])。

这是我的碰撞功能

function collides(x, y)
    {
        if(Math.hypot(xcords[y]-xcords[x], ycords[y]-ycords[x]) < 50)
        {
            return true;
        }
        else return false;
    }

当我对某些值进行硬编码时,例如

if(collides(xcords[1],xcords[0])
{
     xdirs[0] *= -1;
     xdirs[1] *= -1;
     ydirs[0] *= -1;
     ydirs[1] *= -1;
}

然后它工作正常。我硬编码的两个圆圈将正确碰撞。但是,当我尝试将其应用于每个圈子时:

for(i=0; i<circles; i++)
        {
            for(j=0; j<circles; j++)
            {
                if(collides(xcords[i], xcords[j]))
                {
                    xdirs[i] *= -1;
                    xdirs[j] *= -1;
                    ydirs[i] *= -1;
                    ydirs[j] *= -1;
                }   
            }
        }

然后圈子互相忽略,我不明白为什么。这是我在这段代码中唯一一次使用double for循环,但是我多次执行第一次for循环,并且它正确地为每个其他函数处理它。

这是一个jsfiddle。 https://jsfiddle.net/sekbr0pg/ 边界框略有偏差,但足以看到碰撞是不稳定的。

1 个答案:

答案 0 :(得分:0)

我们选择圈1和圈2.你想检查它们是否只碰撞一次。以下循环是否适用于此?

for(i=0; i<circles; i++) {
        for(j=0; j<circles; j++){
        // if collides ...
        }
}

答案是否定的,原因是它们会针对i=1 and j=2i=2 and j=1运行两次。所以基本上它不会改变任何东西,因为-1 * -1 = 1.在你的循环中将j=0更改为j=i+1

此外,您的collides功能接受圈子,因此我认为collides(i,j)可以完成这项工作。