在程序C ++中更改包含/目标文件

时间:2019-03-03 09:36:53

标签: c++ include

我和一些伙伴正在尝试构建一个可以在c ++中运行多个游戏的游戏引擎。这些游戏非常相似,以至于它们都共享相似的机制和界面,因此我想制作一些适用于每个游戏的文件。许多源文件将与我们的GUI或Game Engine文件相同。但是,某些处理各个游戏机制的文件会因游戏而异。如果扩展到一个大型库,我不想简单地包含每个库中的每个文件来玩一个游戏。我也不想在库中的每个文件夹中都有GUI和游戏引擎文件的副本。

我目前正在考虑一个启动程序的想法,它将更改#include标签以匹配该启动程序所做的选择,尽管这可能需要重新编译。有没有办法使这个/是一种好技术,还是他们更好的方法? (请记住,我更愿意将int main保留在游戏引擎/共享文件中,而不是为每个游戏创建main)

1 个答案:

答案 0 :(得分:0)

总结您的要求:

  • 您拥有一些通用的游戏引擎代码,可以在多个不同的游戏之间共享;
  • 不过,引擎还取决于每个游戏特有的一些游戏特有代码;
  • 您当前正在解决此问题,在编译时对游戏特定行为进行了严格调整;
  • 您想要一个解决方案,在该解决方案中,可以更轻松地在不同游戏之间共享游戏引擎,例如将多个游戏捆绑在一起,让用户在启动时选择(通过启动器)。

如果正确,这里有一些想法可以进一步帮助您:

  • 无法在运行时优雅地更改编译时元素(包括)。
  • 构建一个启动器以访问所有源代码以在流上进行重新编译似乎不是一个有效的解决方案(因为用户需要预先安装一个编译环境,并已安装所有库,依赖项和工具链,以及,则启动游戏会花费太长时间)。
  • 然后,
  • 正确的方法将更多地利用多态性,并重构您的游戏引擎,使其依赖于封装的游戏特定对象(使用清晰的界面,并保持尽可能低的耦合度),使用SOLID设计的示例)。
  • 一旦达到了这种程度的多态性,您就可以在游戏启动时将特定于游戏的元素注入引擎中(例如an abstract game factory,这将使引擎能够启动相关游戏对象族,而无需了解游戏细节) 。由您决定是为每个游戏选择一个单独的主游戏(选择游戏的编译时间),还是在启动时让用户在多个游戏之间进行选择(运行时选择)。
  • 或者,您也可以围绕游戏引擎和动态库(例如Windows下的DLL)之间的清晰API构建系统,该库在运行时动态加载(然后可以加载打包的新交付的游戏)作为DLL +游戏资产,并在需要时添加到已安装的游戏中。(注释中的John recommended this nice link,还有this one,当然还有其他几个。但是请注意,这是需要很好地理解DLL的局限性的其他困难-因此,可以将其保留为以后的重构步骤)