【发布时间】:2011-09-21 18:12:58
【问题描述】:
我正在开发一个基于状态的游戏引擎,并且有一些我很满意的东西作为开始。
有一个抽象类 GameState.hpp,其中包含我使用的虚拟方法(初始化、运行、暂停等)。
GameEngine.cpp/hpp 是一个包含一堆 GameState 对象并通过运行当前状态的相关方法来设置游戏循环的类。
我的测试游戏 TestGame.cpp 创建了一个 GameEngine 对象并推送一个 TestState 实例并运行,等等……一切都按我的预期工作。
我想构建我的源代码树而不是从同一个目录编译所有内容,并且正在考虑以下问题,因为每个游戏会有多个状态:
src/
+Engine/
+GameEngine.cpp
+GameEngine.hpp
+GameState.hpp
+TestGame/
+States/
+TestState.cpp
+TestState.hpp
+TestGame.cpp
在构建时,我不确定我是否了解需要编译什么,以及编译后的对象应该去哪里。
到目前为止,我最初的想法是:
用 GameState.hpp 编译 GameEngine.cpp/hpp,得到 GameEngine.o
编译每个游戏状态,例如。 TestState.cpp/hpp 和 GameState.hpp,给出 TestState.o
用 GameEngine.o/hpp、GameState.hpp、TestState.o/hpp(和任何其他状态)编译 TestGame.cpp/hpp,得到 TestGame.bin
我在正确的轨道上吗? GameEngine 应该构建一个库,还是一个常规的 .o 可以?对于是否需要在每个编译中包含标题,我仍然有点模糊。此外,每个编译的输出文件是否与源文件位于同一目录中,还是应该位于结构化 bin/ 目录中?
我会试一试并发布一些 Makefile 尝试和输出。让我知道我是否应该发布代码,总共可能有 200 行。没有实际的图形实现等...目前只是一个框架。
谢谢大家,非常感谢任何帮助!
编辑:感谢大家的快速回复。我已经阅读了下面的 cmets,并希望提供更新并澄清一些事情。
首先,我正在研究自动工具,但这主要是一个学习项目,其中一部分是探索 makefile。我也有 Java 背景,所以我真的很想了解我正在构建什么以及我的项目如何组合在一起。如上所述,我什至不知道应该是库还是只是在编译时指向。
我的目标概述:我几乎将引擎视为一个子项目。即使它很简单(handle events、update、display] 方法。我有一个算法,旨在每秒更新恒定数量,同时根据需要改变帧速率。
例如,states display 方法将利用引擎的 SDL 支持的显示功能(可能是磁贴引擎,状态可以说“加载这些资源,显示这些磁贴”或小部件库,无论如何...)来渲染游戏世界模型的表示。 handle events 方法可以使用抽象的键盘接口。我希望能够在引擎中添加这样的功能。 Update 将管理一个代表游戏世界的模型。它将跟踪世界中的对象(场景、玩家和 np),根据物理和碰撞检测等应用运动......
我想我希望能够构建它并在我正在开发的游戏中包含对象(和标题?)。 '将引擎源目录复制到游戏项目的根目录,并将其添加到主 Makefile,一起构建',或 '只要引擎发生变化,就在引擎上运行 make,使用最新引擎对象(共享对象,其他东西?)和标题的副本构建游戏项目', 使用一个引擎处理多个小型游戏项目对我来说最容易的是什么?我有点想做好自己的准备,这样我就可以随心所欲地用随机的游戏创意开始工作,比如 2 周的编码组合等......
状态代表任何不同的视图和交互集。引擎有一个 LIFO 状态堆栈,所以一个简单的游戏可能在堆栈上有以下状态: 驾驶模式 - 暂停菜单 - 设置 实际游戏有一个 GameEngine 实例,并且会添加 DrivingMode 来启动游戏。用户暂停,这会暂停 DrivingMode 状态并推送 PauseMenu 状态(在推送时运行其初始化、运行等)。在这里,用户选择暂停 PauseMenu 状态并加载设置的设置...当它们退出时,会弹出状态(清理等...首先运行),然后恢复顶部状态。
哇,现在好多了。随着我的进步,我会添加更多或提出新问题。再次非常感谢您的帮助。
【问题讨论】:
-
+1 提出了一个很好的问题!你绝对是在正确的轨道上,你所要求的实际上是一个品味问题:做任何你喜欢的事情。提示:链接库比链接多个目标文件更简单。
-
谢谢,我试图弄清楚我能做什么,并问到底是什么阻碍了我。这是一个比任何东西都重要的学习项目,因此是手工制作的 makefile。我正在尝试从 Java 世界中转移出来,所以我正在花时间准确了解我在做什么。
-
如果目标是学习,那么 autotools 绝对是您应该花一些时间在上面的东西。正如 vines 和 Eelke 所说,引擎的架构基本上归结为个人喜好。如果您可以证明设计选择的合理性,那么它很可能是一种可行的做事方式。
标签: c++ oop architecture makefile