基本画布冲突在 for 循环中不起作用
Basic canvas collision not working in for loops
我遇到了一个我不太清楚的碰撞问题。我的程序的要点是在 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/边界框有点偏离,但足以看出碰撞是不可靠的。
让我们以圆圈 1 和圆圈 2 为例。您想检查它们是否只碰撞一次。以下循环对此有好处吗?
for(i=0; i<circles; i++) {
for(j=0; j<circles; j++){
// if collides ...
}
}
答案是否定的,原因是他们会运行两次,为了i=1 and j=2
和i=2 and j=1
.所以基本上它不会改变任何东西,因为 -1*-1 = 1。在您的循环中,将j=0
更改为j=i+1
。
此外,您的collides
功能接受圆圈,所以我认为collides(i,j)
会完成这项工作。
相关文章:
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 我的javascript for循环不起作用
- For循环冻结Javascript
- 如何在for循环中添加事件侦听器
- 双“for”循环(循环)
- javascript for循环不起作用
- for循环中的javascript if语句找不到==
- Javascript在for循环中等待处理请求
- For循环在Jquery中只运行一次
- 如何在for循环中使用计数器
- for循环中的JavaScript闭包
- 为什么我们在ES2015中需要一个新的for循环结构,而我们已经有了for、forEach
- For循环在调用时未运行
- 如何使用for循环添加所有按钮'单击事件
- 如何更改在for循环中生成的圆的位置
- 为什么这个For循环会使浏览器实验室崩溃
- 为什么我使用javascript获得了一个无限的for循环
- 在for循环中使用多维数组设置google.maps.Marker图标
- 如何在angularJS中运行for循环而不使用html标记