0

好吧,我对nape比较陌生,我在做游戏的过程中,我做了一个KINEMATIC类型的叫做平台的Body,我只是想在舞台上的某个范围内前后移动它。有人可以看看我哪里出错了,谢谢。

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

2 回答 2

2

首先,在其中一个 if 块中,您将递增position.x10,而在另一个块中,您将递减velocity.x10。我猜您的意思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;
}
于 2013-03-26T20:25:44.380 回答
1

一般来说:

运动学物体应该仅以速度移动,如果您直接改变它们的位置,那么它们实际上并没有像“瞬移”那样移动,并且就物理学而言,它们的速度仍然恰好为 0,因此诸如碰撞和摩擦不会像您预期的那样起作用。

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

body.setVelocityFromTarget(targetPosition, targetRotation, deltaTime);

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

所有这一切实际上是根据当前位置/旋转、目标位置/旋转以及到达那里应该花费的时间来设置适当的速度和 angularVel。

于 2013-03-26T20:57:15.460 回答