簡體   English   中英

圓和矩形的碰撞檢測

[英]Collision Detection of Circle and Rectangle

我正在編寫一個游戲,該游戲涉及由用戶控制的運動圓和由計算機控制的運動矩形的碰撞。

完整的代碼可以在這里找到: 游戲

我在圓和矩形之間的碰撞檢測方面遇到麻煩。 當矩形是靜態的時,碰撞檢測可以完美地工作。 圓和矩形的邊緣在任意一側接觸時,程序將按照預期的方式運行。

但是,每當我進行矩形運動時,碰撞在矩形的右側都能很好地起作用,而在左側卻不能。

我可以使用數字來使其在左側但不能在右側工作,但是,我無法使其在兩側都能正常工作。 我缺少一個簡單的解決方法嗎?

我附了幾張照片來說明我的意思。

這是碰撞檢測功能。

function collisionDetection(player,rect) {
  var distX = Math.abs(player.x - player.dx - rect.x - rect.w/2);
  var distY = Math.abs(player.y - rect.y - rect.h/2);

  if (distX >= (rect.w / 2 + player.r - player.dx)) {
    return false;
  }
  if (distY > (rect.h / 2 + player.r)) {
    return false;
  }

  if (distX <= rect.w/2) {
    return true;
  }
  if (distY <= rect.h/2) {
    return true;
  }
}

if(collisionDetection(player,rect)) {
  alert("You Lose");
  document.location.reload();
}

右邊

左邊

謝謝

您的碰撞功能有一些小故障。

這是檢測矩形與圓形碰撞的工作代碼:

function collisionDetection(player,rect){
    var distX = Math.abs(circle.x - rect.x - rect.w/2);
    var distY = Math.abs(circle.y - rect.y - rect.h/2);

    if (distX > (rect.w/2 + circle.r)) { return false; }
    if (distY > (rect.h/2 + circle.r)) { return false; }

    if (distX <= (rect.w/2)) { return true; } 
    if (distY <= (rect.h/2)) { return true; }

    // also test for corner collisions
    var dx=distX-rect.w/2;
    var dy=distY-rect.h/2;
    return (dx*dx+dy*dy<=(circle.r*circle.r));
}

您不應使用寬度超過2的高度和高度超過2的高度。

您應該檢查player.x和player.y是否在矩形+半徑內。 本質上是將矩形的所有邊擴大半徑。

rect.y + rect.h + player.r
rect.x + rect.w + player.r
rect.x - player.r
rect.y - player.r

如果玩家的位置在新的放大區域內,則發生碰撞。

if(player.x > (rect.x - player.r) and player.x < (rect.x + rect.w + player.r) and player.y >  (rect.y - player.r) and player.y < rect.y + rect.h + player.r)
return true;

暫無
暫無

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

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