2

事情是这样的:我有一个使用 Tweens 弹跳的球,我想检测球和平台之间的碰撞(仅当球落下时)。

但是,我的解决方案是在一个循环中测试碰撞ENTER_FRAME,所以当球的速度很高时,在 ax 帧,球在平台上方,在 x+1 帧,球在平台下方,所以我的循环永远不会检测到碰撞(因为球和平台从来没有真正碰撞过)。

这是我的球的跳跃方法:

public function jump():void
{
    TweenLite.killTweensOf(this);
    TweenLite.to(this, jumpSpeed, {y:250, ease:Cubic.easeOut});
    TweenLite.to(this, jumpSpeed, {delay:jumpSpeed, y:stage.stageHeight-this.height, ease:Cubic.easeIn, onComplete:jump});
}

这是我的ENTER_FRAME循环中执行的内容:

for each (var platform:Platform in platforms) 
{
    if (ball.hitTestObject(platform) &&  ballPreviousY < ball.y)
        ball.jump();
}
ballPreviousY = ball.y;

我已经开始研究使用物理引擎 Box2D 的解决方案,但我想知道是否有更简单的解决方案来解决这个问题。

4

1 回答 1

0

这是碰撞检测中的一个常见问题——小而快的物体穿过薄薄的障碍物。您正在寻找的是扫描测试

除了测试两个静态形状之间的交叉点之外,我们还可以通过沿其轨迹扫描原始形状并测试这些扫描形状之间的重叠来创建新形状。

来自N Tutorial A - Fast Moving Objects,(如果您对碰撞算法的更多细节感兴趣,我建议您阅读他们所有的东西)。

例如,如果您有一个 1px x 1px 的正方形,并且它沿 x 轴以每帧 5px 的速度移动,您需要扭曲您的正方形,使其变为 6px x 1px 的矩形以进行碰撞测试。捕捉下一帧会碰到的任何东西,但没有更多。

圆有点困难,因为当你拉伸它们时,它们会变成椭圆(更难检查碰撞)。如果您想走椭圆路线,请参阅此答案。

于 2012-10-13T06:42:15.703 回答