Перенесите свой двигатель на каждую платформу. В этом нет ничего особенного. Если у вас есть код , который является для Windows-только, то либо добавить #ifdef логику в файле или добавить второй файл (так что вы бы FooWindows.cpp
и FooLinux.cpp
или любой другой ), реализующий функцию , что на других ОС (а) вы заботитесь о ,
Разрешается публикация одним щелчком мыши, которую имеет такой движок, как Unity, потому что сам Unity никогда не изменяется конечным пользователем. Вы просто пишете сценарии и данные, поэтому в движке есть встроенные двоичные файлы для всех платформ, а кнопка публикации просто связывает эти двоичные файлы вместе с данными.
Другие движки полагаются на системы сборки и кросс-компиляторы для создания скомпилированной игры, когда это необходимо, так же, как вы делаете это с любым неигровым кроссплатформенным приложением.
Для таких вещей, как HTML5, существуют такие инструменты, как emscripten, которые могут компилировать приложение C ++ для запуска в JavaScript. Вам просто нужно сделать другой порт вашего движка для emscripten (так как он не может использовать произвольную библиотеку / функцию C ++).
Вам не нужно переписывать всю свою игру, но вам определенно придется много работать над разработкой, написанием кода и переносом для каждой новой платформы, которую вы хотите поддерживать.
share/os/<linux>
(илиshare/cpu/x86
) и помещать туда весь специфичный для платформы код, а затем делать условные включения. Это, по крайней мере, то, что делают gcc, HotSpot и ядро Linux (конечно, это не жесткое правило). Да, вы можете начать только с одной функции, которая зависит от платформы, и подумать, что она излишня, но она никогда не останется такой, и в противном случае она быстро превратится в беспорядок.Здесь нет волшебной пули. Если вы хотите, чтобы ваша игра работала на нескольких платформах, вы должны написать код для нескольких платформ (или использовать сторонние библиотеки, которые уже делают это для вас).
То, о чем вы просите, не совпадает: вы говорите (выделение мое)
но и это (снова акцент мой)
Вам в значительной степени придется делать одно или другое: выбрать стороннюю библиотеку, движок и / или набор инструментов, который предоставляет вам кроссплатформенную поддержку, или создать свой собственный, написав кросс-платформенный код (проектируя собственная абстракция над доступными вам платформами и реализация этой абстракции для каждой платформы).
Игровые движки, такие как Unreal или Unity, которые поддерживают это, либо перекомпилируют ваш код для соответствующей абстракции платформы, либо требуют, чтобы вы построили библиотеку или DLL на основе их внутренних API-интерфейсов, которые они загружают из исполняемого файла драйвера для конкретной платформы, который они скомпилировали для соответствующего Платформа.
источник
В отличие от двух других ответов (которые по определению специфичны для C ++), существует другой способ. Некоторые архитектуры, которые приходят на ум:
Лично я считаю, что подход libGDX является самым простым: найти язык или платформу, которые отвечают вашим потребностям, и писать на вершине. Генерация кода и переносимые движки сложны и трудны для написания.
libGDX на самом деле отличный выбор, поскольку он распространяется как на основные мобильные телефоны, так и на настольные ПК и в Интернете (через апплеты или веб-компилятор Google).
источник
Я сейчас создаю кроссплатформенный игровой движок. Я использую SDL, которая является превосходной (и соответственно низкоуровневой) кроссплатформенной библиотекой для создания графических приложений, чтобы облегчить боль.
Помимо этого, есть много «пользовательского кода» для каждой платформы. Это вам просто нужно пройти. До сих пор я обнаружил, что это очень небольшая часть моего времени разработки, в основном потраченная на поиск документации для систем, с которыми я не так знаком, как мой родной Linux.
Я бы отговорил вас от использования
#ifdef
повсюду в вашем коде. Вместо этого создайте абстракции вокруг ключевых примитивов (примером такого примитива может быть сокет TCP).Когда вы сталкиваетесь с новой проблемой, которая требует разных решений для каждой среды, спросите себя: «Могу ли я решить эту проблему, используя только кроссплатформенные примитивы, которые я уже создал?» Если ответ да: вуаля, простой кроссплатформенный код. В противном случае выясните, какие примитивы вам не хватает, и реализуйте их.
источник
Если вы хотите сделать это «с нуля» в качестве учебного процесса, вам нужно будет использовать Win32 API, где вы можете найти информацию об открытии окна и контексте OpenGL на MSDN и на OpenGL wiki ( http: // www .opengl.org / wiki / creation_an_OpenGL_Context_ (WGL) ). Для Linux получите подержанную копию Руководства по программированию O'Reilly Xlib и Справочного руководства по Xlib, а также ознакомьтесь с GLX (Расширение OpenGL для системы X Window). Смотрите также http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)
Тогда вам просто нужно предоставить один и тот же API для вашего приложения с функциями, которые делают одно и то же (например, открывают окно), но имеют разные реализации для каждой платформы. Вы переписываете части вашего движка для разных платформ. Затем игру, которую вы пишете с использованием движка, нужно написать только один раз, но она будет работать на разных платформах.
источник