圆和矩形的碰撞检测

时间:2015-12-17 22:49:26

标签: javascript html5-canvas collision-detection

我正在编写一个游戏,其中涉及由用户控制的移动圆与由计算机控制的移动矩形的碰撞。

可在此处找到完整代码:Game

我在圆圈和矩形之间碰撞检测时遇到问题。当矩形是静态时,碰撞检测工作完美。圆圈和矩形的边缘在任何一侧触摸的那一刻,程序按照预期的方式行动。

但是,每当我给出矩形运动时,碰撞在矩形的右侧工作正常,但不在左边。

我可以使用数字使其在左侧工作但不在右侧,但是,我不能让它在两侧都能正常工作。是否有一个我缺少的简单修复?

我附上了几张照片来说明我的意思。

这是碰撞检测功能。

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();
}

Right side

Left side

谢谢

2 个答案:

答案 0 :(得分:1)

你的碰撞功能有一些小问题。

这是检测矩形与圆形碰撞的工作代码:

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));
}

答案 1 :(得分:0)

您不应使用宽度超过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;