c# - Box2D XNA 中的 Pong

标签 c# xna box2d

所以我一直在尝试在 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/

相关文章:

c# - WorkDay 人力资源 API 集成

c# - 位置之间的 XNA 滑行/缓动

c# - asp.net pdf 渲染器

c# - 为什么会在不同时间调用 LostFocus 事件?

xna - 我应该如何优化绘制大量动态数量的顶点集合?

c++ - 在 xcode ".mm"文件中设置一个 c++ 类 nil。

c++ - 在 C++ 的 Box2D 中添加关节后, body 改变了它的位置

javascript - 如何使用 HTML5 Canvas 而不是 Debug Draw 来绘制我的 Box2D 世界?

c# - 为什么 .Net Core 控制台中的 ProducerBuilder 类的消息没有被 Kafka 消费者 shell 使用?

c# - 基于组件的游戏设计中的共享字段