Actionscript 3 碰撞检测。两个矩形相交:将源矩形放置在区域外

Actionscript 3 碰撞检测。两个矩形相交:将源矩形放置在区域外,actionscript-3,collision-detection,Actionscript 3,Collision Detection,我正在用as3编写一个碰撞检测系统。这是为了简单:我有一些移动的矩形和一些静态的。当一个移动的矩形与另一个矩形碰撞时,我希望将源(碰撞)矩形移动到碰撞区域之外,但仍然尽可能靠近(基于源的轨迹) 在每一帧上,我更新移动矩形的位置,并检查所有矩形之间的接触 下图表示以下内容: 答:长方体#1以45度角向静态矩形(#2)移动 b:经过几次“滴答”之后,我们看到矩形#1移动到矩形#2(静态的)的空间中。这是第一次检测到碰撞的点 c:现在,我真正想做的是将源矩形#1移动到矩形#2碰撞区域的外围 。。。给定

我正在用as3编写一个碰撞检测系统。这是为了简单:我有一些移动的矩形和一些静态的。当一个移动的矩形与另一个矩形碰撞时,我希望将源(碰撞)矩形移动到碰撞区域之外,但仍然尽可能靠近(基于源的轨迹)

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

下图表示以下内容:

答:长方体#1以45度角向静态矩形(#2)移动

b:经过几次“滴答”之后,我们看到矩形#1移动到矩形#2(静态的)的空间中。这是第一次检测到碰撞的点

c:现在,我真正想做的是将源矩形#1移动到矩形#2碰撞区域的外围

。。。给定矩形#1的移动角度,并且知道矩形#1和#2的总面积和位置,是否有一个公式可以提供矩形#1移动到的最接近的x和y坐标(这样我们就不再处于完全碰撞状态,正如我们在阶段“b”中看到的那样)

显然,我想要一个解决方案,将工作在任何角度的运动和各种矩形形状


提前感谢您在这方面花费的时间:)

假设您的矩形从未旋转过,您可以使用内置方法检查实际碰撞:

至于将矩形移回与其碰撞的矩形的外侧,您可以在其轨迹上添加180度,然后后退,直到矩形不再相交


如果您想要更真实的碰撞和旋转的矩形,请使用Box2D之类的物理引擎。

假设您的绿色正方形与红色正方形碰撞,速度小于其宽度

这个速度限制的重要性在于,这样你只需要检查碰撞点a,b,d,只要你在“右上”移动。此速度限制可避免碰撞点“越过”其目标,并避免丢失碰撞。假设“a”将移动到点“p”

即:

//检查p是否在红色框内
如果(p.x>f.x&&p.xi.y&&p.y
是否保证速度低于任何矩形的宽度?我这么问是因为这大大增加了难度还有,盒子是否旋转了?如果其中任何一个是真的,那么你就是在冒险进入游戏引擎领域,这个领域对于一个问题来说太宽了。不,没有轮换。速度可能大于矩形的宽度或高度。非常感谢。谢谢我正在寻找一个解决方案,不涉及增量备份和重新检查碰撞。速度。这些过程中的许多都可能发生在每一帧上。我想要一个很好的干净的公式-我相信有一个几何的解决方案,我只是找不到:)谢谢你的回复Marton。我不确定我是否完全明白——我担心我不清楚:我知道拦截已经发生了。我已经能够到达“b”步了。我遇到的困难是在rect#2的周长上找到正确的xy来放置rect#1(步骤“c”)。| if |和| ap |的交点是碰撞“发生”的地方。啊,是的!这是向前迈出的一大步。我的模型需要考虑更多的角度,以及绿色矩形的1-4个点位于红色矩形内部的可能性。如果有一个完整的穿越,我可以忍受碰撞被“错过”。谢谢你,马顿!只需遍历这些点,并检查它们的每一个……要决定它击中哪一侧,请检查“a”将恰好击中“f”的角度。上面的任何内容都会命中| if |,下面的任何内容都会命中| fg|
var rectangleA:Rectangle = objectA.getRect(objectA.parent);
var rectangleB:Rectangle = objectB.getRect(objectB.parent);

if(rectangleA.insersects(rectangleB))
{
    // Collision.
}
//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);
}