【发布时间】:2016-01-30 00:31:33
【问题描述】:
我遇到了一个我无法弄清楚的碰撞问题。我的程序的重点是在 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;
}
}
}
然后圈子就互相忽略了,我不知道为什么。这是我唯一一次在此代码中使用双 for 循环,但我多次执行第一个 for 循环,并且它为每个其他函数正确处理它。
这是一个 jsfiddle。 https://jsfiddle.net/sekbr0pg/ 边界框有点偏离,但足以看出碰撞是不稳定的。
【问题讨论】:
-
提示:如果 x 与 y 碰撞,y 也会与 x 碰撞。如果你在 if 分支中放置一个断点,你会发现它们并没有完全相互忽略。
标签: javascript html canvas collision