好吧我对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;
}
}
答案 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。