簡體   English   中英

碰撞檢測算法中的錯誤,Javascript

[英]Bug in collision detecting algorithm, Javascript

好的,所以我正在用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;}

注意括號!

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

  • 如果“ a && b”,則僅對b求值,如果a為true,則一旦任何表達式為false,就以false退出評估。
  • 如果“ a || b”,則僅當a為假時才對b求值,只要任何表達式為真,就以真值退出評估。

因此,您需要額外一對方括號以將or運算符兩側的表達式分組:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM