1

所以我一直在尝试在 Box2D 中重新创建 Pong 来学习如何使用引擎,我认为在其中创建 pong 比我想象的要复杂。我自己有碰撞,我将球恢复设置为 1.0,我唯一的问题是我不知道如何让球击中桨,以正确的角度反弹并有足够的速度到达另一侧。我只是想让它看起来像一个自然的乒乓球游戏。我看过 c++,actionscript 但似乎没有人真正完全实现过乒乓球游戏。

我只需要实现我自己的物理吗?

4

2 回答 2

6

基本上,要获得真实的 Pong 感觉,您需要实现自己的物理。

经典游戏通常将物理实现为简单的 2D 速度和位置(可能还有加速度),然后伪造其他所有内容。

(值得注意的是,即使是现代游戏也尽可能地伪造。如果你能以简单的方式做到这一点,并且仍然获得相同的游戏体验,那么不值得以艰难的方式实现某些东西。)

Pong 的“伪造”物理应该相当简单。这是一个非常基本但不一定完整的简单物理学:

Vector2 position;
Vector2 velocity;
protected override void Update(GameTime gameTime)
{
    position += velocity * (float)gameTime.ElapsedGameTime.TotalSeconds;

    if((IsInsideLeftBat(position) && velocity.X <= 0)
            || IsInsideRightBat(position) && velocity.X >= 0)
    {
        velocity.X = -velocity.X; // Bounce the other way
        // To change things up, maybe you can change velocity.Y too.
    }

    // And of course handle the ball going out of the play field, scoring, etc...
}

现在,假设您在游戏中确实需要真实的物理。具有真实物理特性的乒乓球游戏可能会很有趣(事实上已经有人这样做了,甚至更真实)。

我所说的“伪造它”仍然适用。游戏中的物理通常更多是关于调整事物以获得感觉正确的东西,而不是实际的现实主义。也许你需要将你的反弹系数增加到 1.1,或者给球添加一些线性阻力,这样它就不会失控?

(或者,如果您无法将球传到另一侧,请尝试减少线性阻力。)

实际上,对于游戏中的“主角”来说,什么更有可能——你想把它保留在物理模拟中,这样它就可以与事物互动(也许你的游戏场上到处都是障碍物——这可能很有趣)——但你想完全控制其运动。

为了简单地做到这一点,在您的物理引擎更新运行后,进入并更改您不喜欢的任何值!在 Pong 的情况下,这可能很简单,例如重置球的速度,使其每帧以恒定的速度移动。我想你已经在为桨做这样的事情了——在每一帧设置它们的位置。

(我在物理引擎上制作平台游戏时使用了这种方法。)

另一种伪造事物的方法可能是在桨上添加一个碰撞处理程序,以根据您的喜好设置球的速度。

于 2010-06-23T01:57:13.967 回答
0

我的另一个答案在使用物理引擎制作游戏时仍然适用。但我也意识到你说:

我将球恢复设置为 1.0

您是否也将桨恢复设置为 1.0?我还没有检查过 Box2D,但在 Farseer(我手头有的与 Box2D 相关的)中,碰撞响应中使用的恢复力计算为平均值(来自 Arbiter.cs):

_restitution = (GeometryA.RestitutionCoefficient
               + GeometryB.RestitutionCoefficient) * .5f;

如果 Box2D 以相同的方式工作,它可能不会感谢评论中的马克),你的桨也需要恢复设置为 1.0 以获得你想要的效果。

(另外:这演示了手头拥有物理引擎的源代码是如何帮助的。)

于 2010-06-23T02:16:16.483 回答