Portieren Sie Ihren Motor zu jeder Plattform. Daran ist nichts Besonderes. Wenn Sie einen Code haben , die nur für Windows ist, dann ist entweder etwas #ifdef Logik in der Datei hinzufügen oder eine zweite Datei hinzufügen (so müßten Sie FooWindows.cpp
und FooLinux.cpp
oder was auch immer) , dass Geräte , die Funktion auf dem anderen O (n) die Sie interessieren .
Das Ein-Klick-Publizieren von Inhalten, über die eine Engine wie Unity verfügt, ist zulässig, da Unity selbst vom Endbenutzer niemals geändert wird. Sie schreiben nur Skripte und Daten, daher verfügt die Engine über vorgefertigte Binärdateien für alle Plattformen, und die Schaltfläche zum Veröffentlichen bündelt diese Binärdateien nur mit den Daten.
Andere Engines verwenden Build-Systeme und Cross-Compiler, um das kompilierte Spiel bei Bedarf zu erstellen, genau wie Sie es mit jeder plattformübergreifenden Nicht-Spiel-Anwendung tun würden.
Für Dinge wie HTML5 gibt es Tools wie emscripten, die eine C ++ - Anwendung für die Ausführung in JavaScript kompilieren können. Sie müssen für emscripten im Grunde nur einen anderen Port Ihrer Engine erstellen (da keine beliebige C ++ - Bibliothek / -Funktion verwendet werden kann).
Sie müssen nicht Ihr gesamtes Spiel neu schreiben, aber Sie müssen auf jeden Fall viel Entwicklungs-, Programmier- und Portierungsarbeit für jede neue Plattform leisten, die Sie unterstützen möchten.
share/os/<linux>
(odershare/cpu/x86
) zu haben und den gesamten plattformspezifischen Code dort einzutragen und dann bedingte Includes auszuführen. Das ist zumindest das, was gcc, HotSpot und der Linux-Kernel tun (sicherlich keine harte Regel). Ja, Sie können mit nur einer einzigen Funktion beginnen, die plattformabhängig ist und denkt, es ist übertrieben, aber das bleibt nie so und es wird sonst schnell zu einem Chaos.Hier gibt es keine magische Kugel. Wenn Sie möchten, dass Ihr Spiel auf mehreren Plattformen läuft, müssen Sie Code für mehrere Plattformen schreiben (oder Bibliotheken von Drittanbietern nutzen, die dies bereits für Sie tun).
Die Dinge, nach denen Sie fragen, stimmen nicht überein: Sie sagen (Betonung meiner)
aber auch das (Schwerpunkt wieder meins)
Sie müssen so ziemlich das eine oder andere tun: Wählen Sie, ob Sie eine Bibliothek, Engine und / oder Toolchain eines Drittanbieters verwenden möchten, die plattformübergreifende Unterstützung für Sie bietet, oder erstellen Sie Ihren eigenen Code, indem Sie plattformübergreifenden Code schreiben (Ihren Code entwerfen) eigene Abstraktion über die Plattformen, die Ihnen zur Verfügung stehen, und Implementierung dieser Abstraktion für jede Plattform).
Game - Engines wie Unreal oder Unity , die diese entweder Ihren Code gegen die entsprechende Plattform Abstraktion neu kompilieren zu unterstützen, oder Sie benötigen eine Bibliothek oder DLL gegen ihre internen APIs zu bauen, die sie von einem plattformspezifischen Treiber ausführbaren laden , die sie für die entsprechenden zusammengestellt Plattform.
quelle
Im Gegensatz zu den beiden anderen Antworten (die zu Recht C ++ - spezifisch sind) gibt es einen anderen Weg. Einige Architekturen, die mir in den Sinn kommen:
Persönlich finde ich den Ansatz von libGDX am einfachsten: Finden Sie eine Sprache oder Plattform, die Ihren Anforderungen entspricht, und schreiben Sie darüber. Code-Generierung und tragbare Engines sind komplex und schwer zu schreiben.
libGDX ist eine großartige Wahl, da es sowohl für große Mobiltelefone als auch für Desktops und das Internet (über Applets oder den Web-Compiler von Google) geeignet ist.
quelle
Momentan baue ich eine plattformübergreifende Game-Engine. Ich verwende SDL, eine hervorragende (und entsprechend niedrige) plattformübergreifende Bibliothek zum Erstellen von Grafikanwendungen, um die Schmerzen zu lindern.
Darüber hinaus gibt es jedoch jede Menge "benutzerdefinierten Code" für jede Plattform. Das musst du nur durchstehen. Ich fand, dass es ein sehr kleiner Teil meiner bisherigen Entwicklungszeit ist, und habe hauptsächlich Dokumente für Systeme nachgeschlagen, mit denen ich nicht so vertraut bin wie mit meinem nativen Linux.
Ich würde Sie davon abhalten,
#ifdef
überall in Ihrem Code zu verwenden. Erstellen Sie stattdessen Abstraktionen um Schlüsselprimitive (ein Beispiel für ein solches Primitiv könnte ein TCP-Socket sein).Wenn Sie auf ein neues Problem stoßen, das je nach Umgebung unterschiedliche Lösungen erfordert, fragen Sie sich: "Kann ich dieses Problem nur mit den plattformübergreifenden Grundelementen lösen, die ich bereits erstellt habe?" Wenn die Antwort ja lautet: voila, einfacher plattformübergreifender Code. Stellen Sie ansonsten fest, welche Grundelemente Ihnen fehlen, und implementieren Sie sie.
quelle
Wenn Sie dies als Lernerfahrung "von Grund auf" tun möchten, müssen Sie die Win32-API verwenden. Dort finden Sie Informationen zum Öffnen eines Fensters und eines OpenGL-Kontexts auf MSDN und im OpenGL-Wiki ( http: // www .opengl.org / wiki / Creating_an_OpenGL_Context_ (WGL) ). Für Linux erhalten Sie eine gebrauchte Kopie des O'Reilly Xlib-Programmierhandbuchs und des Xlib-Referenzhandbuchs sowie Informationen zu GLX (OpenGL-Erweiterung für das X Window-System). Siehe auch http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)
Dann müssen Sie Ihrer Anwendung nur die gleiche API mit Funktionen bereitstellen, die dasselbe tun (z. B. ein Fenster öffnen), aber für jede Plattform unterschiedliche Implementierungen haben. Sie schreiben Teile Ihres Motors für verschiedene Plattformen neu. Dann ein Spiel, das Sie mit der Engine schreiben, müssen Sie nur einmal schreiben, aber es wird auf verschiedenen Plattformen funktionieren.
quelle