0

OK、JavaScript で 2D プラットフォーム ゲームを作成しています。衝突検出には 2 種類のオブジェクトがあります。フォーカス エリアとフォーカス エリアによって検出されるゲーム オブジェクトです。オブジェクトを検出すると、ボックスを形成する 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 が true の場合、式が false になるとすぐに、評価は false として終了します。
  • if "a || b" then b は、a が false の場合にのみ評価されます。式が true になるとすぐに、評価は true として終了します。

そのため、or 演算子の両側で式をグループ化するには、追加の括弧のペアが必要です。

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