"精密移动的"使用Phaser和p2.js物理的身体

时间:2016-03-20 22:10:09

标签: javascript phaser-framework

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

  • 使用Phaser补间更改我希望它在其上移动的路径中的主体坐标。除了身体可以跳过静止的身体外,它的效果非常好。

Using a  Phaser tween

示例代码:

game.add.tween(sprite.body).to(
    { x: destinationX, y: destinationY },
    timeInterval,
    Phaser.Easing.Quadratic.InOut,
    true
);
  • 使用p2 force属性在所需路径上移动正文。这次与其他身体的碰撞效果很好,但几乎不可能让身体完全停留在我想要的坐标上。当身体接近目的地时,我试图减少施加的力,这在90%的情况下都是完美的。然而,在低性能场景中,动画是“紧张不安”。 (这是预料之中的)但也未能达到目标点并且有时会超过它。我甚至会接受选择在它到达目的地时强行停止身体并稍微伤害场景的真实感但是我无法做到这一点(试图将力和速度都设置为0,阻尼为1,等等 - 没什么用的。)

下面是一些示例代码(在Phaser引擎sprite.body.data中指向p2.js物理主体):

// 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

有人可以提供一些建议吗?我迷失在这一点上,所以我甚至可以使用熟悉其他物理引擎的熟悉的猜测。

谢谢。

2 个答案:

答案 0 :(得分:1)

我没有广泛使用过物理学,但从我所看到的情况来看,移动一个支持物理的身体通常是通过body.velocity完成的。

请参阅我放在一起的快速示例:http://phaser.io/sandbox/wUGlsnRx

答案 1 :(得分:0)

@Kamen Minkov是对的。如果你想使用物理,那么你不能补间身体或手动改变位置。你提到它在高负载下有问题,这可能是P2性能的问题吗? Here's something similar for 3D games。 Arcade物理是2D游戏的选择吗?

  

这种方法在性能上非常差,因为你的对撞机由很多顶点组成,它经常需要更新每一帧,而且由于其奇怪的形状,看到某些东西与它相撞会更加计算成本。对于人类角色使用“胶囊”对撞机来说要快得多,快得多,这只是一个圆顶的圆柱体,大致与你的角色大小相当。它在内存上要容易得多,而且在这么简单的形状上计算碰撞要快得多。

你也不need a special outlining for P2 physics?也许这有问题。在Physics Editor中查看您的图片。

查看P2 example以确保正确设置。