如何组织一个游戏引擎

3

我正在开发一个小型游戏引擎,遇到了一个问题。

目前,我有一个窗口类,它是Win32窗口的包装器。我还有一个窗口管理器类(它是一个单例类),用于管理窗口的创建和处理窗口消息。然后我有一个引擎类,这是迄今为止最重要的类,因为它是引擎的接口。这个引擎类包含主循环和Direct3D设备,以及创建和销毁设备的代码。这个引擎类还包含一个Window类对象,作为Direct3D设备的主/宿主窗口。

我的问题是,引擎需要对一些窗口消息做出反应(如WM_SIZE或WM_ACTIVATEAPP),但消息处理程序是Window类的一部分,它在Engine类的"水平"位置下面。我还认为,我应该创建另一个类来封装引擎的渲染/图形,并将该类添加到主引擎类中。

所以我不确定是否应该在Window类内部有一个Graphics类,或者在Graphics类内部有一个Window类,或者让它们并排放在主Engine类中。


建议您以可视化(伪代码)的方式更清晰地概述您的类结构,以便他人理解。 - gahooa
适合发布在gamedev.stackexchange.com上。 - Puppy
3个回答

4

你生活在一个事件驱动的世界中,因此要使用事件。让你的窗口包装器提供事件,游戏引擎可以钩子并做出反应。


是的,没错。这不仅仅适用于Windows,您可以将事件用于任何实体之间的通信,例如跟随主角或其他任何事情。此外,工厂模式(用于加载、存储和访问媒体)也会让您受益匪浅! - Blindy

1
不要将控制游戏引擎与底层操作系统交互的对象作为引擎对象的子级。操作系统层应该驱动引擎,而不是相反。
(顺便说一下,大多数引擎和程序员都会犯这个错误。)

那我应该有一个框架类来控制所有其他类吗? - Zayats
可能是一个包含用于图形、输入、计时、GUI等组件的类,并负责初始化所有这些组件,以及控制它们之间的通信。 - Zayats
当然可以这样做。但这有点大材小用,因为通常显式地设置一个复杂的对象图更容易些。 - MSN
@Zayats,将main()设置为显式创建游戏引擎和操作系统绑定层比隐藏在框架后面要容易得多。 - MSN

1

你会有多个窗口吗?越来越多的游戏正在使用多显示器。

你会在一个窗口上运行多个图形吗?可能性很小。这让我认为,图形应该在窗口中,而不是相反。


谢谢,当你考虑到这一点时,它实际上是有意义的,但是你可以使用一个设备来打开多个窗口吗? - Zayats
@Zayats:当然可以。一些游戏,如至尊指挥官,本身就支持两个窗口。 - Puppy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接