【问题标题】:How to decouple game physics from objects如何将游戏物理与对象分离
【发布时间】:2015-08-12 16:13:46
【问题描述】:

我的游戏对象通常看起来像这样pseudo-javascript 时尚:

function Player(){
    this.update = function() {
        //logic that should be run per update frame
        //physics code I really don't want here
    }
}
Player.prototype = new gameObject;

Player.update 被一个实例化它的gameObjectManager 调用,它基本上是一个数组,通过在其中的所有对象上调用update() 循环。很好,这对于特定于对象本身的更新功能来说已经足够好了。

我不希望该功能是物理逻辑。它在我的代码中造成了不必要的膨胀,我发现我必须在我创建的每个唯一 gameObject 中复制很多功能。找到合适的类来放置它是很困难的,因为不是我所有的gameObjects 都需要它。

我尝试过的一个解决方案是另一个类,例如 gameObjectManger,巧妙地命名为 physicsManger,它将维护需要物理更新的对象数组,并直接对它们进行操作,而不是为每个对象调用 update()

或者,也许该代码应该进入gameObjectManager 本身,我不知道。

我的目标是让gameworld 中的任意对象应用物理就像设置一样简单

player.physics = true;

理想情况下,对象不应该知道或关心物理代码,只是可以对其进行操作。

【问题讨论】:

  • 所以只需创建一个名为 DoPhysics() 的函数,然后调用该函数来执行所有物理逻辑。
  • 您可能还想要一个结构体之类的 PhysicsSettings 包括质量、浮力、摩擦力、升力等任何适合您正在做的事情。

标签: game-physics


【解决方案1】:

我的建议是将它分成两个功能。有一个updateLogic() 函数和一个updatePhysics() 函数。然后对于无物理对象,将 updatePhysics() 函数留空。如果您愿意,可以添加 physicsObjectManager,但我会让您的 gameObjectManager 为每个对象调用每个函数。

我假设“膨胀我的代码”是指阅读和维护它,而不是性能。如果您发现自己经常编写相似或相同的代码,我强烈建议您更频繁地使用辅助函数(将函数细分为更小的、可重用的组件函数)。

我不知道您正在使用哪种语言进行开发,但这听起来也是使用 对象继承 的最佳时机。这将使您的课程冗余更少,并且更有条理。您可能还会发现,使用继承还使项目更容易让您理解和有效地使用。

【讨论】:

  • 我确实让我的玩家继承自 visualGameObject(屏幕绘图函数),它继承自 gameObject(游戏世界空间中的通用容器对象)。我猜我可以在游戏对象之上再创建一个类,但是如果我有一个不应该是物理对象的视觉游戏对象,或者不应该在屏幕上绘制的物理对象(风、隐形墙、电梯、重力井) ,那我该怎么办?这就是继承对我来说很棘手的地方。
  • 我明白为什么这种方法会有问题。我的建议是翻转它。您的顶级课程是gameObject。这是由visualGameObject 扩展的。现在采取visualGameObject 并扩展它。例如,创建一个扩展visualGameObjectanimal 类。也许动物有重复的运动物理学。然后你可以创建一个wolf 和一个deer 例如扩展animal 但具有不同的逻辑功能。抱歉我在编游戏东西,我不知道你的游戏类是什么,或者重复在哪里。
  • 这个插图可能会有所帮助。例如,玩家可能与敌人有很多共同点(可能他们都走路或射击)。这些共性可以放在 Agent 类中。这并不意味着您必须在游戏中使用通用代理,只是您不必为玩家和敌人分别执行行走和射击的逻辑,如果他们以这些方式具有相同的行为。 bhattaca.github.io/cse2122/images/class-diagram-no-methods.png
【解决方案2】:

好的,我抛弃了我需要原型继承来实现我的物理代码的想法。我最终得到的是全局命名空间中的一个简单的Physics 函数,该函数期望对包含坐标和其他物理属性的任何GameObject 进行操作。

我可以在我的其他代码中的任何地方调用它来操作我喜欢使用Physics.call(object, deltaTime)的任何对象

这给了我一直在寻找的灵活性,所以我将使用这种方法而不是原型继承。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多