Javascript &引用;“精确移动”;使用Phaser和p2.js物理的物体

Javascript &引用;“精确移动”;使用Phaser和p2.js物理的物体,javascript,phaser-framework,Javascript,Phaser Framework,我正在尝试使用Phaser 2.4.6及其附带的p2.js版本将动态实体从点a移动到点B。车身准确地停在终点,而不是停在终点后或通过终点后(可接受非常低的公差),这一点非常重要。到目前为止,我尝试了两种方法,但都失败了: 使用相位器tween在我希望它继续移动的路线上改变物体的坐标。除了主体可以跳过静态主体之外,这工作起来非常漂亮 示例代码: game.add.tween(sprite.body).to( { x: destinationX, y: destinationY },

我正在尝试使用Phaser 2.4.6及其附带的p2.js版本将动态实体从点a移动到点B。车身准确地停在终点,而不是停在终点后或通过终点后(可接受非常低的公差),这一点非常重要。到目前为止,我尝试了两种方法,但都失败了:

  • 使用相位器tween在我希望它继续移动的路线上改变物体的坐标。除了主体可以跳过静态主体之外,这工作起来非常漂亮

示例代码:

game.add.tween(sprite.body).to(
    { x: destinationX, y: destinationY },
    timeInterval,
    Phaser.Easing.Quadratic.InOut,
    true
);
  • 使用p2
    force
    属性在所需路径上移动实体。这次与其他物体的碰撞效果很好,但要让物体停在我想要的坐标上几乎是不可能的。我试图减少身体接近目的地时施加的力,这在90%的情况下都很有效。但是,在低性能场景中,动画会“抖动”(这是意料之中的),但也无法达到目标点,并且会越过目标点,有时会超过很多。我甚至会接受在身体到达目的地时强制停止身体的选项,这会稍微损害场景的真实感,但我无法做到这一点(尝试将“力”和“速度”设置为0,将“阻尼”设置为1,等等-没有任何效果)
下面是一些示例代码(在相量引擎中,sprite.body.data指向p2.js物理体):

有人能提供一些建议吗?我在这一点上迷路了,所以我甚至可以用一个熟悉其他物理引擎的人的有根据的猜测


谢谢。

我还没有广泛地玩过物理,但据我所见,移动一个启用物理功能的物体通常是通过
body.velocity
完成的


请看我举的一个简单例子:

@Kamen Minkov是对的。如果你想使用物理学,那么你就不能在身体中间穿插或者手动改变姿势。您提到它在高负载下有问题,这可能是P2性能的问题吗。街机物理是2D游戏的一个选项吗

这种方法的性能非常差,因为碰撞器由大量顶点组成,它需要不断更新每一帧,并且要查看是否有东西因为其奇怪的形状而与它发生碰撞,计算成本要高得多。对人类角色使用“胶囊”对撞机要快得多,它只是一个圆顶的圆柱体,大致相当于你角色的大小。它在内存上更容易,在这样一个简单的形状上计算碰撞也更快

你不觉得这也有问题吗。在中查看您的图像


查看P2以确保您的设置正确。

您可以为您尝试的内容添加代码,以便我们有一个起点来提供帮助吗?@JamesSkemp我添加了一些代码。我真的很想用第二种方法来工作。目前,当精灵接近目标时,我正在减小X轴和Y轴上的力,直到它们最终都为零。这是可行的,但是如果CPU非常忙,精灵就会开始抖动(这是意料之中的),并最终超出目标点。我刚刚尝试使用
velocity
,但得到的结果与使用
force
属性相同,在CPU非常繁忙的情况下,精灵最终会超出目标点。似乎不可能让精灵准确且一致地停在目的地。我想也许开始考虑使用距离约束,但我希望找到一个更简单的解决方案。
// OUTSIDE OF THE GAME LOOP:
var magnitude = game.physics.p2.pxmi(-speed);
var angle = entity.body.data.angle + Math.PI / 2;
var forceX = (magnitude * Math.cos(angle)) / 10;
var forceY = (magnitude * Math.sin(angle)) / 10;

// IN THE GAME LOOP:
sprite.body.data.force[0] = forceX;
sprite.body.data.force[1] = forceY;
// Decrease forceX and forceY as the body approaches the destination