【问题标题】:AS3 - Collision detection using tween, frame gapAS3 - 使用补间、帧间隙的碰撞检测
【发布时间】:2012-10-08 16:42:50
【问题描述】:

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

但是,我的解决方案是在ENTER_FRAME 循环中测试碰撞,因此当球速很高时,在 x 帧处,球在平台上方,在 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 的解决方案,但我想知道是否有更简单的解决方案来解决这个问题。

【问题讨论】:

  • 您基本上必须编写大量数学运算,否则这些数学运算已经在 box2d 等库中进行了说明,它已经内置了方便的参数以方便使用...我知道您已经但是使用greensock,它确实内置了一些方便的技巧来模拟碰撞效果,根据碰撞的性质,这可能足够也可能不够。但要获得真正强大的物理引擎,box2d 才是正确的选择!
  • 我最近读过一些关于补间和 hitTestObject 一起不起作用的东西,也许你的情况也是如此。
  • 虽然 3rd 方库解决了这些问题,但您正在处理的问题可以通过使用 Verlet 集成来跟踪对象的运动来解决。这允许您在渲染完成之前检测到碰撞,因此您可以在渲染任何内容之前对其进行处理。关于这个主题有很多可用的资源(搜索“Euler 与 Verlet 集成”)。我最近在一本名为AdvancED Game Design w/Flash 的书中读到了它。
  • 如果你在补间中使用 onUpdate 属性来检查碰撞而不是进入帧呢?

标签: actionscript-3 tween


【解决方案1】:

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

我们可以测试两个静态形状之间的交集,而不是测试 而是通过沿着它们的原始形状扫掠来创建新形状 轨迹,并测试这些扫描形状之间的重叠。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多