碰撞检测。 2个矩形相交:将源矩形放在区域外

时间:2014-07-08 22:33:36

标签: actionscript-3 collision-detection

我正在as3中编写碰撞检测系统。它很简单:我有一些移动的矩形和一些静态的矩形。当移动的矩形与另一个矩形碰撞时,我想在碰撞区域外移动源(碰撞)矩形,但仍尽可能接近(基于源的轨迹)。

在每一帧上,我更新移动矩形的位置,并检查所有矩形之间的接触。

以下图片代表以下内容:

a:方框#1以45度的角度朝向静态矩形(#2)移动。

b:经过几次“滴答”之后,我们看到Rectangle#1进入了Rectangle#2(静态)的空间。这是第一次检测到撞击的点。

c:现在 - 我真的想做什么! - 将源矩形#1移动到Rectangle#2的碰撞区域的郊区。

...因此,给定矩形#1的移动角度,并且知道矩形#1和#2的整体区域和位置,是否有一个公式为Rectangle提供最接近的x和y坐标# 1被移动到(因此我们不再完全碰撞,正如我们在阶段'b'中看到的那样)。

显然,我想要一个适用于任何移动角度和各种矩形形状的解决方案。

3 steps

提前感谢您的时间:)

2 个答案:

答案 0 :(得分:2)

假设您的绿色方块与红色方块相撞,其速度小于宽度。enter image description here

这个速度限制的重要性在于,这样你只需要检查碰撞点a,b,d,只要你正在移动"右上角"。这个速度限制避免了碰撞点"移动过去"他们的目标和失踪的碰撞。让我们说" a"将转向点" p"。

即:

//check if p is inside the red box
if (p.x > f.x && p.x < g.x && p.y > i.y && p.y < f.y)
{
    //calculate the intersection of |if| with |aP|
    var x:Number = f.x;
    var y:Number = a.y + ((f.x - a.x) / (p.x - a.x)) * (p.y - a.y);
}

答案 1 :(得分:0)

假设您的矩形永远不会旋转,您可以使用内置方法Rectangle.intersects()检查实际碰撞:

var rectangleA:Rectangle = objectA.getRect(objectA.parent);
var rectangleB:Rectangle = objectB.getRect(objectB.parent);

if(rectangleA.insersects(rectangleB))
{
    // Collision.
}

对于将矩形移回到与其碰撞的矩形的外部,您可以向其轨迹添加180度并向上返回,直到矩形不再相交。

如果您想要更逼真的碰撞和旋转的矩形,请使用像Box2D这样的物理引擎。