你好,我已经将你的内容翻译成简体中文:
你好,我决定是时候深入研究一下低级游戏开发了,远远超过了游戏引擎。为此,我决定使用C++(我对其很熟悉,尤其是纯C),SDL3,新SDL GPU API和Flecs。我的主要问题一直是创建一个架构,理想情况下可以最小化 boilerplate(至少在长期内),易于阅读/修改和高效。换句话说,我在使代码库模块化并易于扩展/修改方面遇到了困难。我的目的不是创建一个完全成熟的半通用游戏引擎,目前我想尝试制作一个简单的项目,例如3D竞技场游戏,类似于Devil's Daggers/Hyperdemon by Sorath(令人惊叹的游戏,值得一看!)。但是我至少想让一些系统(控制,窗口创建,初始化等)和最重要的是代码结构可复用。目前我的想法是基本上有一个平坦的main.cpp文件,其中程序的生命周期将被完全定义:Init --> Game Loop --> Cleanup。在Game Loop中,我将简单地调用函数,定义在自己的文件中,其中全局状态变量存在于一个GameState命名空间中:
// 文件:main.cpp
int main() {
// Init
if(!init()) return 1;
// 定义在init.cpp中
// Game Loop
GameState::shouldRun = true;
// GameState将是一个命名空间,包含全局状态;所有游戏循环函数都将在这里声明
while(GameState::shouldRun) {
processEvents(); // 定义在processEvents.cpp中
handleInput(); // 定义在handleInput.cpp中
progressGame(); // 定义在progressGame.cpp中
processPhysics(); // 定义在processPhysics.cpp中
render(); // 定义在gsRenderState.cpp中
}
// Cleanup
... cleanup(); // 定义在cleanup.cpp中
}
// 文件:init.cpp
ErrCode init() {
// 初始化SDL
initSDL(); // 定义在init.cpp中
// 初始化flecs
initFlecs(); // 定义在init.cpp中
return ErrCode::None;
}
// 文件:GameState.h
namespace GameState {
// Flecs结构
flecs::world ecs; // 初始化 + 模块加载在initFlecs()中
// SDL结构
SdlWindow window; // 自定义窗口类,使用RAII;初始化在initSDL()中
}
此外,我可以将这些“模块”组织到自己的文件夹中。例如一个’sdl/’文件夹,包含‘initSdl.cpp’,‘cleanupSdl.cpp’等文件;同样是‘flecs’或其他模块。我的目的是避免很多OOP的“面条”,所以想法是简单地将整个GameState放在一个文件中,每个重要的游戏循环相关函数都有自己的文件。当我想添加新步骤(例如,处理物理和渲染之间)时,我只需在游戏循环中添加它并创建新的文件。所有的构造/销毁逻辑都被压缩到了一个相对平坦的结构中,init/cleanup/gameloop函数。
这种架构是否不可行,还是说它对单个游戏项目来说足够好了,同时将某些部分相对可复用到未来项目中(我可以只复制所需的文件并只复制所需的init()/cleanup()逻辑)?是否有更好的结构来设计游戏,保持相对平坦,单个步骤易于跟踪,而不是被困在OOP“地狱”中?个人来说,我喜欢通过例子/直接编码/讨论而不是阅读书籍来学习。如果你有好的例子,我很乐意分享我的见解。感谢!
评论 (0)