所以我一直在尝试在 Box2D 中重新创建 Pong 来学习如何使用引擎,我认为在其中创建 pong 比我想象的要复杂。我自己有碰撞,我将球恢复设置为 1.0,我唯一的问题是我不知道如何让球击中桨,以正确的角度反弹并有足够的速度到达另一侧。我只是想让它看起来像一个自然的乒乓球游戏。我看过 c++,actionscript 但似乎没有人真正完全实现过乒乓球游戏。
我只需要实现我自己的物理吗?
基本上,要获得真实的 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 的情况下,这可能很简单,例如重置球的速度,使其每帧以恒定的速度移动。我想你已经在为桨做这样的事情了——在每一帧设置它们的位置。
(我在物理引擎上制作平台游戏时使用了这种方法。)
另一种伪造事物的方法可能是在桨上添加一个碰撞处理程序,以根据您的喜好设置球的速度。
我的另一个答案在使用物理引擎制作游戏时仍然适用。但我也意识到你说:
我将球恢复设置为 1.0
您是否也将桨恢复设置为 1.0?我还没有检查过 Box2D,但在 Farseer(我手头有的与 Box2D 相关的)中,碰撞响应中使用的恢复力计算为平均值(来自 Arbiter.cs):
_restitution = (GeometryA.RestitutionCoefficient
+ GeometryB.RestitutionCoefficient) * .5f;
如果 Box2D 以相同的方式工作,它可能不会(感谢评论中的马克),你的桨也需要恢复设置为 1.0 以获得你想要的效果。
(另外:这演示了手头拥有物理引擎的源代码是如何帮助的。)