Answers:
将您的引擎移植到每个平台。没什么特别的。如果您有一些仅适用于Windows的代码,则可以在文件中添加一些#ifdef逻辑,或者添加第二个文件(这样您便拥有FooWindows.cpp
和/ FooLinux.cpp
或任何其他功能)即可在您关心的其他操作系统上实现该功能。
一键发布可以允许像Unity这样的引擎发布的内容,因为最终用户永远不会修改Unity本身。您只是在编写脚本和数据,因此引擎为所有平台预先构建了二进制文件,而“发布”按钮只是将这些二进制文件与数据捆绑在一起。
其他引擎依赖于构建系统和交叉编译器在需要时创建已编译的游戏,就像您对任何非游戏跨平台应用程序所做的一样。
对于HTML5之类的东西,有诸如emscripten之类的工具可以编译C ++应用程序以在JavaScript中运行。基本上,您只需要为引擎添加另一个端口即可进行脚本描述(因为它不能使用任何任意的C ++库/功能)。
您不必重写整个游戏,但是绝对必须为您要支持的每个新平台进行大量开发,编码和移植工作。
这里没有魔术子弹。如果您想让游戏在多个平台上运行,则必须为多个平台编写代码(或利用已经为您完成此任务的第三方库)。
您要求的内容不一致:您说的(强调我的意思)
我正在寻找的是整合一些资源的资源,这些资源将使我可以在不同平台上运行而无需重写
但也(再次强调我的意思)
我知道我可以使用其他引擎代替编写自己的引擎,但是 我对学习经验很感兴趣。
您几乎要做一件事:选择使用为您提供跨平台支持的第三方库,引擎和/或工具链,或者通过编写跨平台代码(设计您的在您可以使用的平台上拥有自己的抽象,并为每个平台实现该抽象)。
游戏引擎如虚幻或Unity支持这种要么重新编译代码到适当的平台抽象,或要求你建立对他们的内部API库或DLL,这是他们从一个特定平台的驱动程序可执行文件加载,他们已经编制了相应的平台。
与其他两个答案(正确地是C ++特定)相反,还有另一种方法。我想到的一些架构:
就我个人而言,我发现libGDX的方法是最简单的:找到满足您需求的语言或平台,然后再写。代码生成和可移植引擎很复杂,很难编写。
libGDX实际上是一个不错的选择,因为它同时可以在主要的手机,台式机和Web上运行(通过applet或Google的Web编译器)。
目前,我正在构建一个跨平台的游戏引擎。我正在使用SDL,它是用于构建图形应用程序的出色的(也是适当的低级别)跨平台库,可以减轻痛苦。
但是,除此之外,每个平台还有很多“自定义代码”。这只是您必须解决的问题。到目前为止,我发现这只是我开发时间的一小部分,大部分时间用于查找不如我的本机Linux熟悉的系统的文档。
我不鼓励您#ifdef
在整个代码中使用任何地方。相反,围绕关键原语构建抽象(此类原语的示例可能是TCP套接字)。
当您遇到一个新问题,每个环境需要不同的解决方案时,请问自己“我是否可以仅使用已经构建的跨平台原语来解决此问题?” 如果答案为是:瞧,简单的跨平台代码。否则,找出缺少的原语并实现它们。
如果您想“从头开始”学习,那么您将需要使用Win32 API,您可以在MSDN和OpenGL Wiki(http:// www上找到有关打开窗口和OpenGL上下文的信息。.opengl.org / wiki / Creating_an_OpenGL_Context_(WGL))。对于Linux,请获取《 O'Reilly Xlib编程手册》和《Xlib参考手册》的二手副本,还可以阅读GLX(X窗口系统的OpenGL扩展)。另请参见http://www.opengl.org/wiki/教程:_OpenGL_3.0_Context_Creation_(GLX)
然后,您只需要为您的应用程序提供相同的API,即可使用具有相同功能(例如,打开窗口)但每个平台具有不同实现的函数。您为不同的平台重写了部分引擎。然后,您使用引擎编写的游戏只需要编写一次,但它将在不同的平台上运行。
share/os/<linux>
(或share/cpu/x86
)之类的东西,并将所有特定于平台的代码放入其中,然后进行条件包含。至少这是gcc,HotSpot和Linux内核的功能(当然不是硬性规定)。是的,您可能只从依赖于平台的单个功能入手,并认为它是过大的,但它永远不会这样,否则很快就会变得一团糟。