Nape移动平台

时间:2013-03-26 19:44:45

标签: actionscript-3 physics-engine

好吧我对nape相对较新,我正在制作游戏的过程中,我制作了一个名为KINEMATIC类型的平台,我只想在舞台上将它移回到一定范围内。有人可以看看我哪里出错了,谢谢。

private function enterFrameHandler(ev:Event):void
{
if (movingPlatform.position.x <= 150 )
            {
                movingPlatform.position.x +=  10;
            }
            if (movingPlatform.position.x >= 260)
            {
                movingPlatform.velocity.x -=  10;
            }
}

2 个答案:

答案 0 :(得分:2)

在其中一个if块中,第一个将position.x递增10,而另一个将velocity.x递减10.我猜你的意思是position.x

其次,假设movingPlatform.position.x为150,而您的enterFrameHandler只运行一次。 movingPlatform.position.x将变为160,并且在下次enterFrameHandler被调用时,if块将不会执行,因为160不小于或等于150或大于或等于260.

您可以使用速度来指示其移动的一侧,并在超出边缘时将其反转,例如:

// assuming velocity is (1,0)
private function enterFrameHandler(ev:Event):void {
    if (movingPlatform.position.x <= 150 || movingPlatform.position.x >= 260) {
        movingPlatform.velocity.x = -movingPlatform.velocity.x;
    }

    movingPlatform.position.x += movingPlatform.velocity.x;
}

显然,如果物体已经处于x = 100状态,这可能会导致问题,它只会保持反转它的速度,所以要么确保将它放在150-260之间,要么添加额外的检查以防止它反转它的方向不止一次。

这可能是一种更好的方法:

// assuming velocity is (1,0)
private function enterFrameHandler(ev:Event):void {
    if (movingPlatform.position.x <= 150) {
        movingPlatform.velocity.x = 1;
    } else if (movingPlatform.position.x >= 260) {
        movingPlatform.velocity.x = -1;
    }

    movingPlatform.position.x += movingPlatform.velocity.x;
}

答案 1 :(得分:1)

一般来说:

运动物体应该只用速度移动,如果你直接改变它们的位置那么它们实际上并没有像“传送”一样移动,就物理而言,它们的速度仍然是0,所以事物喜欢碰撞和摩擦不会像你期望的那样起作用。

如果您仍想使用位置而不是速度,那么Body类上的方法setVelocityFromTarget是为运动学设计的:

body.setVelocityFromTarget(targetPosition, targetRotation, deltaTime);

其中deltaTime是您在以下对space.step()的调用中将要使用的时间步;

所有这一切的确是基于当前位置/旋转,目标位置/旋转以及到达目的地所需的时间来设置合适的速度和angularVel。