所以我一直在尝试在Box2D中重新创建Pong以学习如何使用引擎,我认为在其中创建pong比我想象的更复杂。 我自己碰撞了,我将球恢复设置为1.0,我唯一的问题是我不知道如何让球击中桨,以正确的角度反弹并且有足够的速度到达另一侧。我只是希望它看起来像一个自然的Pong游戏。 我看过c ++,actionscript但似乎没有人真正完全实现过乒乓球游戏。
我是否必须实施自己的物理学?
答案 0 :(得分: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...
}
现在,说你真的需要在你的游戏中使用真正的物理。一个真实物理的乒乓球比赛很有趣(in fact somebody has already done it, even real-er)。
我所说的关于“假装”的事情仍然适用。游戏中的物理学通常更多的是调整事物以获得感觉正确而不是真实的现实。也许你需要将弹跳系数提高到1.1,并且可能会给球增加一些线性阻力,这样它就不会失控?
(或者如果你在将球送到另一侧时遇到困难,请尝试减少线性阻力。)
实际上游戏中的“主角”更有可能 - 你想把它保留在物理模拟中,这样它就可以与事物互动(也许你的游戏场上充满了障碍 - 这可能很有趣) - 但是你希望完成对其动作的控制。
要做到这一点,在物理引擎更新运行后,进入并更改您不喜欢的任何值!在Pong的情况下,这可能是一个简单的事情,比如重置球的速度,使其每帧以恒定的速度移动。我想你已经为这个桨做了类似的事情 - 每帧都设置它们的位置。
(当我制作platformer on a physics engine时,我使用了这种方法。)
伪造物品的另一种替代方法可能是在桨叶上添加一个碰撞处理器,根据您的喜好设置球的速度。
答案 1 :(得分:0)
使用物理引擎制作游戏时,我的other answer仍然适用。但我也意识到你说:
我将球恢复原状设定为1.0
您是否也将桨片恢复设置为1.0?我没有选中Box2D,但是在Farseer中(我手边有什么,与Box2D有关),碰撞响应中使用的恢复力计算为平均值(来自Arbiter.cs):
_restitution = (GeometryA.RestitutionCoefficient
+ GeometryB.RestitutionCoefficient) * .5f;
如果Box2D以相同的方式工作,可能不(感谢Mark来自评论),你的paddles也需要将恢复原状设置为1.0才能获得你想要的效果。
(另外:这演示了如何将源代码提供给物理引擎。)