我正在as3中编写碰撞检测系统。它很简单:我有一些移动的矩形和一些静态的矩形。当移动的矩形与另一个矩形碰撞时,我想在碰撞区域外移动源(碰撞)矩形,但仍尽可能接近(基于源的轨迹)。
在每一帧上,我更新移动矩形的位置,并检查所有矩形之间的接触。
以下图片代表以下内容:
a:方框#1以45度的角度朝向静态矩形(#2)移动。
b:经过几次“滴答”之后,我们看到Rectangle#1进入了Rectangle#2(静态)的空间。这是第一次检测到撞击的点。
c:现在 - 我真的想做什么! - 将源矩形#1移动到Rectangle#2的碰撞区域的郊区。...因此,给定矩形#1的移动角度,并且知道矩形#1和#2的整体区域和位置,是否有一个公式为Rectangle提供最接近的x和y坐标# 1被移动到(因此我们不再完全碰撞,正如我们在阶段'b'中看到的那样)。
显然,我想要一个适用于任何移动角度和各种矩形形状的解决方案。
提前感谢您的时间:)
答案 0 :(得分:2)
假设您的绿色方块与红色方块相撞,其速度小于宽度。
这个速度限制的重要性在于,这样你只需要检查碰撞点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这样的物理引擎。