【问题标题】:Changing include/object files mid program C++在程序 C++ 中更改包含/目标文件
【发布时间】:2019-03-03 09:36:52
【问题描述】:

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

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

【问题讨论】:

标签: c++ include


【解决方案1】:

总结您的要求:

  • 您有一些足够通用的游戏引擎代码,可以在几个不同的游戏之间共享;
  • 但是,引擎还依赖于某些特定于每个游戏的特定游戏代码;
  • 您目前已解决此问题,在编译时硬连线游戏特定行为;
  • 您想要一种解决方案,可以更轻松地在不同游戏之间共享游戏引擎,例如捆绑多个游戏,让用户在启动时选择(通过启动器)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2011-10-12
    相关资源
    最近更新 更多