【问题标题】:"Precision-moving" a body using Phaser and p2.js physics使用 Phaser 和 p2.js 物理“精确移动”身体
【发布时间】:2016-03-20 22:10:08
【问题描述】:

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

  • 使用 Phaser 补间来更改我希望它继续前进的整个路线的身体坐标。这很好用,除了身体可以跳过静态身体。

示例代码:

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

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

谢谢。

【问题讨论】:

  • 您可以添加您尝试过的代码,以便我们有一个起点来提供帮助吗?
  • @JamesSkemp 我添加了一些代码。我真的很想使用第二种方法。目前,当精灵接近目的地时,我正在减小 X 轴和 Y 轴上的力,直到最终它们都为零。这可行,但如果 CPU 非常忙,精灵就会开始抖动(这是意料之中的)并最终超出目标点。

标签: javascript phaser-framework


【解决方案1】:

我没有广泛使用物理,但据我所见,移动启用物理的身体通常是通过body.velocity 完成的。

请看我整理的一个简单示例:http://phaser.io/sandbox/wUGlsnRx

【讨论】:

  • 我刚刚尝试使用velocity,但我得到的结果与使用force 属性相同,即在CPU 非常繁忙的情况下,精灵最终会超出目标点。让精灵准确且始终如一地停在目标点似乎是不可能的。我正在考虑也许开始考虑使用距离约束,但我希望找到一个更简单的解决方案。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多