所以我一直在尝试在 Box2D 中重新创建 Pong 以学习如何使用引擎,我认为在其中创建 pong 比我想象的要复杂。 我自己有碰撞,我将球恢复设置为 1.0,我唯一的问题是我不知道如何让球击中 Racket ,以正确的角度反弹并以足够的速度到达另一侧。我只是想让它看起来像一个自然的乒乓球游戏。 我看过 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...
}
现在,假设您确实需要在您的游戏中使用真实物理。具有真实物理原理的乒乓球游戏可能会很有趣 (in fact somebody has already done it, even real-er)。
我所说的“伪装”这句话仍然适用。游戏中的物理通常更多地是关于调整事物以获得感觉正确的东西,而不是实际的现实主义。也许您需要将弹跳系数增加到 1.1,并可能向球添加一些线性阻力以使其不会飞出控制?
(或者,如果您无法将球传到另一侧,请尝试减少线性阻力。)
实际上,游戏中的“主要角色”更有可能是什么 - 您希望将其保留在物理模拟中,以便它可以与事物互动(也许您的游戏场到处都是障碍物 - 这可能很有趣)- 但是您想要完全控制它的运动。
为了简单地做到这一点,在您的物理引擎更新运行后,进入并更改您不喜欢的任何值!在 Pong 的例子中,这可能是一些简单的事情,比如重置球的速度,使其每帧都以恒定速度移动。我想您已经在为桨做类似的事情 - 设置它们在每一帧的位置。
(我在制作 platformer on a physics engine 时使用了这种方法。)
另一种伪造事物的替代方法可能是向 Racket 添加碰撞处理程序,以按照您喜欢的方式设置球的速度。
关于c# - Box2D XNA 中的 Pong,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3095679/