Ich habe bereits vernünftige Erfahrungen mit C ++ und OpenGL und habe mich kürzlich entschlossen, die Entwicklung mobiler Spiele auszuprobieren. Nachdem ich erfolgreich eine einfache OpenGL ES Android-App mit Java erstellt hatte, suchte ich nach Möglichkeiten, sowohl Android als auch iOS mit so wenig Umschreibcode wie möglich zu erreichen. Ich habe versucht, die stolz prahlerischen plattformübergreifenden App-Entwicklungstools von Visual Studio 2015 zu verwenden, fand sie jedoch zu neu und daher äußerst wenig dokumentiert. Ich konnte die Vorlagenprojekte erstellen, die mir das Programm gegeben hatte, aber ich konnte nicht herausfinden, wie ich angesichts dieser Vorlagen dem Spiel Assets hinzufügen oder Touchscreen-Eingaben verarbeiten konnte.
Ich habe einen leider spezifischen Wunsch, der zu spezifisch ist, um ihn bei Google zu finden. Ich möchte ein OpenGL ES-Spiel mit C ++ erstellen, mit dünnen plattformspezifischen Wrappern für Android und iOS. Die Leute haben mir ähnliche Fragen gestellt (wenn auch nicht genau die gleichen), und mehr als eine Person hat angegeben, dass das, was ich tun möchte, nicht nur möglich, sondern auch relativ einfach ist, da ich mich nicht um die Benutzeroberfläche kümmern muss.
Ich habe dieses Tutorial ausprobiert , aber es ist fast drei Jahre alt und daher wahrscheinlich für ältere Technologien konzipiert. Infolgedessen bin ich auf verschiedene nicht berücksichtigte Fehler gestoßen. Ab sofort ist dieses Tutorial jedoch das, was ich gefunden habe. Alles andere ist entweder nur für Android oder ich empfehle, Hunderte von Dollar pro Jahr für die Verwendung des Marmalade SDK zu zahlen. Manchmal möchte ich den Code nur zweimal schreiben, einmal in Java und einmal in Objective-C, aber ich bin motiviert von dem Wissen, dass diese Lösung möglich ist, aber aus irgendeinem Grund nirgendwo in modernen Details behandelt wird.
Zusammenfassend möchte ich ein OpenGL ES-Spiel für iOS und Android mit einer einzigen C ++ - Codebasis erstellen, die in kleine Mengen plattformspezifischen Codes eingeschlossen ist. Trotz der Tatsache, dass mehrere Leute diesen Ansatz empfohlen haben, kann mir niemand sagen, wie es geht. Kann mir jemand sagen, ob es tatsächlich möglich ist und wenn ja, was ich tun kann oder wohin ich gehen kann, um zu lernen, wie?
Antworten:
Meine Antwort auf eine ähnliche Frage kann hier hilfreich sein.
Es kann auch hilfreich sein, den Quellcode anderer Lösungen zu untersuchen. Die Godot Engine zum Beispiel ist eine plattformübergreifende Open Source-Spiel-Engine, sodass Sie nie etwas bezahlen müssen.
Wie ich in meiner anderen Antwort erwähne , müssen Sie sich nicht auf eine IDE verlassen (und können dies wahrscheinlich auch nicht), um die Arbeit für Sie zu erledigen. CMake , Scons und viele andere Build-Tools können beim plattformübergreifenden Kompilierungs- / Build-Prozess helfen.
Godot Engine verwendet beispielsweise Scons und das LLVM- Projekt (auch bekannt als das Compiler-Framework, das vom Clang des C / C ++ / Objective-C-Compilers verwendet wird) verwendet CMake .
Ein beliebter Ansatz für Spiele ist das Erstellen einer Engine in C / C ++ und, wie Sie bereits erwähnt haben, das Abstrahieren von Plattformspezifikationen. Wenn es um iOS und Android geht, ist dies die Lebenszyklusverwaltungslogik, die mit dem Betriebssystem verbunden ist. Wenn Sie die Extrameile gehen und Emscripten verwenden möchten, um auch zu asm.js zu kompilieren und nahezu native Geschwindigkeit im Browser zu realisieren, tun Sie etwas Ähnliches, indem Sie die Hauptschleife hinter den RequestAnimationFrame- Aufrufen abstrahieren .
Emscripten empfiehlt die Verwendung von SDL , um den Portierungsprozess zu vereinfachen, da dies dazu beitragen kann, die Plattformspezifikationen zu abstrahieren. Nichts hindert Sie jedoch daran, dies selbst zu tun (außer viel Recherche, Debugging usw.).
Wenn Sie wirklich, wirklich verrückt sind, können Sie das tun, was ich tue, und Ihre eigene Sprache schreiben, indem Sie die Leistung von LLVM nutzen , um auf unterstützten Plattformen zu nativem C ABI oder sogar JIT zu kompilieren .
Der Punkt ist, dass es zwar möglich ist, aber einige Straßen komplizierter / zeitaufwändiger sind als andere.
Hinweis: Sie müssen wahrscheinlich Mac OSX über einen Mac, eine VM oder einen Hackintosh mit XCode verwenden , um auf iOS zu kompilieren. Dies ist einer von vielen Gründen, warum ich ein Macbook Pro als einen großartigen Kandidaten für ein Entwicklungssystem empfinde.
Anmerkung 2: Es ist erwähnenswert, dass viele plattformübergreifende Engines heutzutage Skriptsprachen für die spielspezifische Logik verwenden. Unity lässt Sie beispielsweise nicht einmal in die Nähe ihres Quellcodes (obwohl Sie native Plugins schreiben können). Dies kann dazu beitragen, die Entwicklungszyklen zu beschleunigen und die Portierung auf ein Minimum zu beschränken, da die Skriptsprachen ziemlich plattformunabhängig sind (insbesondere interpretierte Sprachen, die in einer VM ausgeführt werden). Das Ziel meiner Sprache ist es, sowohl JIT (hauptsächlich zur Einsparung von Entwicklungszeit) als auch statische Kompilierung zu ermöglichen.
Hinweis 3: Wenn Sie dies noch nicht herausgefunden haben. Wenn Sie kein SDL oder eine andere Lösung verwenden, die plattformspezifische Details abstrahiert, müssen Sie die spezifischen C / C ++ - Schnittstellenfunktionen jeder Plattform verwenden. Unter iOS ist dies in XCode ziemlich einfach, da der Compiler (wie oben erwähnt klingeln) bereits C / C ++ unterstützt. Unter Android müssen Sie die NDK- und Marshall-Aufrufe zwischen Java und C / C ++ verwenden.
quelle