Actionscript 3 基于时间的运动和碰撞检测问题

Actionscript 3 基于时间的运动和碰撞检测问题,actionscript-3,collision-detection,2d-games,Actionscript 3,Collision Detection,2d Games,我正在实现一个简单的基于瓷砖的游戏,其中包含基于时间的运动 我负责移动和碰撞检测的代码是 private function onEnterFrame(event:Event):void { if (waiting && game.movingBreakers <= 0) endLevel(); var interval:int = getTimer() - oldTime; oldTime += interval; var

我正在实现一个简单的基于瓷砖的游戏,其中包含基于时间的运动

我负责移动和碰撞检测的代码是

private function onEnterFrame(event:Event):void
{
    if (waiting && game.movingBreakers <= 0)
        endLevel();

    var interval:int = getTimer() - oldTime;
    oldTime += interval;
    var totalBreakers:uint = breakers.length;

    if (totalBreakers)
    {
        for each (var breaker:Breaker in breakers)
        {
            if (!breaker.moving)
                continue;

            switch (breaker.direction)
            {
                case TOP:
                    breaker.y -= SPEED * interval;
                break;

                case BOTTOM:
                    breaker.y += SPEED * interval;
                break;

                case LEFT:
                    breaker.x -= SPEED * interval;
                break;

                case RIGHT:
                    breaker.x += SPEED * interval;
                break;
            }

            checkCollisions(breaker);
        }
    }
}
私有函数onEnterFrame(事件:事件):void
{

如果(waiting&&game.movingBreakers在增量时间进行移动时,有几种很好的方法可以解决这种情况

1)最常用的方法之一是执行“固定时间步长”。这本质上是一种强制受影响对象上的
更新()
(或在本例中为
移动()
)只运行一次“时间步长”的实现已过。假设您有一个变量常量用于
固定步骤:int=10
,此值10表示10ms。如果您的增量时间(
间隔
)已过10ms或更长时间,则您将发出
更新()
,但次数是(已过时间/
固定步骤
)任何剩余时间都会添加到下一个已用时间值中

例如,您的增量时间为45毫秒,因此您将运行
update()
4次,并在下一个增量时间中添加5次

这将允许你的碰撞仍然被检测到。下面是一个C#解释,我认为它也很好地解释了这一点:

2)另一种方法是计算在帧之间移动对象的距离,然后细分距离以创建移动步骤。即-点a处的对象(40x40矩形)将移动到点B,X轴上的距离为200px,将对象移动200/object.width(即40)=5,因此您将调用
movement()
5次,并以40px的对象宽度移动。这将覆盖移动区域,并且可以在任何一次移动更新中检测到您的碰撞

还有其他方法可以做到这一点,但出于性能方面的原因,可能没有那么好。光线投射和在对象的给定路径上查找交点非常精确,但性能非常高,需要进行一些挖掘才能学习和实现

我还读到一些人从
update()
之前的原点创建一个新对象到之后的位置,并使用该位置进行检测。例如,-点(0,0)处的对象a移动到(200,0),在下一帧之后,您创建一个从(0,0)到(200+对象宽度,0+对象高度)的区域并对该对象运行碰撞测试


无论如何,我希望这有帮助,祝你好运!

你应该使用AS3的CollisionTestKit库