碰撞检测算法中的错误,Javascript

碰撞检测算法中的错误,Javascript,javascript,collision-detection,Javascript,Collision Detection,好的,我正在用JavaScript制作一个2D平台游戏,对于碰撞检测,我有两种类型的对象: 由焦点区域检测到的游戏对象 和重点领域;它们可以探测物体 两者都有4个坐标,构成方框x1和y1为左/上,x2和y2为左/下 游戏对象的框坐标是不变的数字,必须根据游戏对象的位置进行计算,而焦点区域坐标则更新为精确的点 我的问题是,出于某种原因,当这段代码(如下)遇到一个比游戏对象(坐标)小的焦点区域时,除非焦点区域与游戏对象框的左上像素冲突,否则它不会被检测到,我如何解决这个问题?(顺便说一下,这是一个双

好的,我正在用JavaScript制作一个2D平台游戏,对于碰撞检测,我有两种类型的对象: 由焦点区域检测到的游戏对象 和重点领域;它们可以探测物体 两者都有4个坐标,构成方框x1和y1为左/上,x2和y2为左/下

游戏对象的框坐标是不变的数字,必须根据游戏对象的位置进行计算,而焦点区域坐标则更新为精确的点

我的问题是,出于某种原因,当这段代码(如下)遇到一个比游戏对象(坐标)小的焦点区域时,除非焦点区域与游戏对象框的左上像素冲突,否则它不会被检测到,我如何解决这个问题?(顺便说一下,这是一个双“for循环”)

var O_x=game.objects[ii].phy.pos.x,
O_aur_x_1=game.objects[ii].col.aur.x1,
O_aur_x_2=game.objects[ii].col.aur.x2,
F_x_1=game.focusAreas[i].x1,
F_x_2=game.focusAreas[i].x2,
O_y=game.objects[ii].phy.pos.y,
O_aur_y_1=game.objects[ii].col.aur.y1,
O_aur_y_2=game.objects[ii].col.aur.y2,
F_y_1=游戏。焦点区域[i]。y1,
F_y_2=game.focusAreas[i].y2;
如果((O_x+O_aur_x_1)>=F_x_1&(O_x+O_aur_x_1)=(O_x+O_aur_x_1)&F_x_1=F_y_1&(O_y+O_aur_y_1)=(O_y+O_aur_y_1)&F_y_1注意括号

JS使用C型短路评估,意思是:

  • 如果“a&&b”,则仅计算b,如果a为真,则计算为 一旦任何表达式为false,就以false退出
  • 如果“a | | b”,则b仅在a为false时计算,计算为 任何表达式为真时,立即退出为真
因此,您需要一对额外的括号来对or运算符两侧的表达式进行分组:

if ((ax1 >= bx1 && ax1 <= bx2) || (bx1 >= ax1 && bx1 <= ax2)) {
  // ...
}

如果((ax1>=bx1&&ax1=ax1&&bx1)我猜你需要4个以上的坐标来为你的正方形创建一个真正的“边界”不是精确的解决方案,但更好的是:你可能为我节省了很多时间,并且可能放弃了这个项目,谢谢!你也可以说“&&&”比“| |”绑定得更深。但是这个“短路”评估也是,为什么像
“var a=thisProperty | | thatProperty;”
这样的事情会起作用。你甚至可以做一些事情,比如说
“doThis()&&doThat();”
for
“if(doThis())doThat();”
。还有一个提示:您多次计算像
O_x+O_aur_x_1
这样的值,您可以将这些值分配给局部变量。此外,您可能还可以在外部循环中分配
F_x_1
等等。考虑到您正在进行i*ii迭代,这可以节省一些运行时间。
if ((ax1 >= bx1 && ax1 <= bx2) || (bx1 >= ax1 && bx1 <= ax2)) {
  // ...
}