这就是事情:我有一个球使用Tweens弹跳,我想检测球和平台之间的碰撞(只有当球落下时)。
但是,我的解决方案是测试ENTER_FRAME
循环中的碰撞,所以当球速度很高时,在轴框架处,球位于平台上方,在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开发解决方案,但我想知道是否有更简单的解决方案来解决这个问题。
答案 0 :(得分:0)
这是碰撞检测中的常见问题 - 小而快的物体穿过薄的障碍物。你要找的是扫描测试
我们可以代替测试两个静态形状之间的交集 而是通过沿着它们扫描原始形状来创建新形状 轨迹,并测试这些扫描形状之间的重叠。
来自N Tutorial A - Fast Moving Objects,(如果您对碰撞算法有更多细节感兴趣,我建议您阅读所有内容。)
例如,如果您有1px乘1px的正方形并且它沿x轴以每帧5px的速度行进,那么您将需要扭曲您的正方形,以便成为一个6px乘1px的矩形进行碰撞测试。抓住它会触及下一帧的任何东西,但不能再有了。
圆圈有点困难,因为当你拉伸它们时它们会变成椭圆形(这很难检查碰撞)。如果你想进入椭圆路线,请参见this answer。