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库