0

好的,所以我正在用 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=game.focusAreas[i].y1,
                F_y_2=game.focusAreas[i].y2;


        if      ( (O_x + O_aur_x_1) >= F_x_1 && (O_x + O_aur_x_1) <= F_x_2 || F_x_1 >= (O_x + O_aur_x_1) && F_x_1 <=(O_x + O_aur_x_2))
        {// if object's x1 is within xfocus range
        }
        else if ( (O_x + O_aur_x_2) >= F_x_1 && (O_x + O_aur_x_2)<= F_x_2  || F_x_2 >= (O_x + O_aur_x_1) && F_x_1 <=(O_x + O_aur_x_2))
        {// if object's x2 is within xfocus range
        }
        else{continue;}

        if      ( (O_y + O_aur_y_1) >= F_y_1 && (O_y + O_aur_y_1) <= F_y_2 || F_y_1 >= (O_y + O_aur_y_1) && F_y_1 <=(O_y + O_aur_y_2))
        {// if object's y1 is within yfocus range
        }
        else if ( (O_y + O_aur_y_2) >= F_y_1 && (O_y + O_aur_y_2) <= F_y_2 || F_y_2 >= (O_y + O_aur_y_1) && F_y_1 <=(O_y + O_aur_y_2))
        {// if object's y2 is within yfocus range
        }
        else{continue;}
4

1 回答 1

0

注意括号!

JS 使用 C 风格的短路求值,意思是:

  • 如果 "a && b" 则只计算 b,如果 a 为真,则只要任何表达式为假,评价就会作为假退出。
  • 如果 "a || b" 那么 b 仅在 a 为假时才被评估,只要任何表达式为真,评估就会作为真退出。

因此,您需要一对额外的括号来对 or 运算符两侧的表达式进行分组:

if ((ax1 >= bx1 && ax1 <= bx2) || (bx1 >= ax1 && bx1 <= ax2)) {
  // ...
}
于 2013-09-25T01:47:54.523 回答