Javascript 检测矩形的哪一侧与另一矩形碰撞

Javascript 检测矩形的哪一侧与另一矩形碰撞,javascript,html,Javascript,Html,我正在尝试使用HTML5画布和javascript开发一个游戏,如果不使用两个对象的(x,y)坐标对其进行硬编码,我就很难检测冲突。在我的基于代码的研究中,找到了检查两个对象是否碰撞的常用算法,即 Object1 = a moving player Object2 = fixed (x,y) points. Non movable object (object1.x < object2.x + object2.width && object1.x + object1.w

我正在尝试使用HTML5画布和javascript开发一个游戏,如果不使用两个对象的(x,y)坐标对其进行硬编码,我就很难检测冲突。在我的基于代码的研究中,找到了检查两个对象是否碰撞的常用算法,即

Object1 = a moving player
Object2 = fixed (x,y) points. Non movable object

(object1.x < object2.x + object2.width  && object1.x + object1.width  > object2.x &&
    object1.y < object2.y + object2.height && object1.y + object1.height > object2.y)

此碰撞函数将告诉您rect2的哪一侧与rect1碰撞:

当然,rect1的另一侧与rect2碰撞

此功能为两次通过测试:

  • 测试1:检查两个矩形的中心是否足够近,以致于发生碰撞

  • 测试2:如果是,检查交叉点深度,以确定哪一侧最容易发生碰撞

碰撞功能

function collide(r1,r2){
    var dx=(r1.x+r1.w/2)-(r2.x+r2.w/2);
    var dy=(r1.y+r1.h/2)-(r2.y+r2.h/2);
    var width=(r1.w+r2.w)/2;
    var height=(r1.h+r2.h)/2;
    var crossWidth=width*dy;
    var crossHeight=height*dx;
    var collision='none';
    //
    if(Math.abs(dx)<=width && Math.abs(dy)<=height){
        if(crossWidth>crossHeight){
            collision=(crossWidth>(-crossHeight))?'bottom':'left';
        }else{
            collision=(crossWidth>-(crossHeight))?'right':'top';
        }
    }
    return(collision);
}

移动鼠标拖动黄金矩形
黄金矩形的任何碰撞面都将高亮显示
此碰撞功能将告诉您rect2的哪一侧与rect1碰撞:

当然,rect1的另一侧与rect2碰撞

此功能为两次通过测试:

  • 测试1:检查两个矩形的中心是否足够近,以致于发生碰撞

  • 测试2:如果是,检查交叉点深度,以确定哪一侧最容易发生碰撞

碰撞功能

function collide(r1,r2){
    var dx=(r1.x+r1.w/2)-(r2.x+r2.w/2);
    var dy=(r1.y+r1.h/2)-(r2.y+r2.h/2);
    var width=(r1.w+r2.w)/2;
    var height=(r1.h+r2.h)/2;
    var crossWidth=width*dy;
    var crossHeight=height*dx;
    var collision='none';
    //
    if(Math.abs(dx)<=width && Math.abs(dy)<=height){
        if(crossWidth>crossHeight){
            collision=(crossWidth>(-crossHeight))?'bottom':'left';
        }else{
            collision=(crossWidth>-(crossHeight))?'right':'top';
        }
    }
    return(collision);
}

移动鼠标拖动黄金矩形
黄金矩形的任何碰撞面都将高亮显示
您需要记录正在设置动画的元素的位置,并找出您的if没有捕捉到碰撞的位置您是什么意思,先生?您需要记录正在设置动画的元素的位置,并找出您的if没有捕捉到碰撞的位置您是什么意思,先生?你能帮我看一下我提供的代码吗?你提供的代码并不能测量入侵的深度,这是确定RECT可能在哪一侧碰撞所需要的。例如,您的“left”测试本质上是问“isrect1.right>rect2.left?”。当rect1从rect2的左侧入侵时,以及当rect1从rect2的右侧入侵时,这个问题都是正确的。所以你需要做深度的入侵测试,就像我的回答一样。即使深度测试也可能失败,如果您的rect移动得非常快(其中rect1可能会侵入rect2的远内侧)。然后你还必须跟踪他们以前的位置。如果可以的话,我会同意你的回答,你真的帮了我。你能帮我完成我提供的代码吗?你提供的代码不能测量入侵的深度,而这正是确定RECT可能在哪一侧碰撞所需要的。例如,您的“left”测试本质上是问“isrect1.right>rect2.left?”。当rect1从rect2的左侧入侵时,以及当rect1从rect2的右侧入侵时,这个问题都是正确的。所以你需要做深度的入侵测试,就像我的回答一样。即使深度测试也可能失败,如果您的rect移动得非常快(其中rect1可能会侵入rect2的远内侧)。然后你还必须跟踪他们以前的立场。如果可以,我会同意你的回答,你真的帮了我