如何将游戏物理与对象分离

How to decouple game physics from objects

我的游戏对象通常看起来像这样 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 中复制很多功能。很难找到合适的 class 来放入它,因为并非我所有的 gameObjects 都需要它。

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

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

我的目标是将物理学应用于 gameworld 中的任意对象就像设置

一样简单
player.physics = true;

理想情况下,对象不应该知道或关心物理代码,只是它们可以根据它采取行动。

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

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

我不知道你在用什么语言开发,但这听起来也是使用对象继承的最佳时机。这将使您的类更少冗余,并且更有条理。您可能还会发现,使用继承还可以使项目更容易让您理解并有效地使用它。

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

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

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