Portez votre moteur sur chaque plateforme. Il n'y a rien de spécial là-dedans. Si vous avez du code uniquement pour Windows, alors ajoutez une logique #ifdef dans le fichier ou ajoutez un deuxième fichier (que vous auriez FooWindows.cpp
et FooLinux.cpp
ou autre) qui implémente cette fonctionnalité sur les autres systèmes d'exploitation dont vous vous souciez. .
La publication en un clic de trucs qu'un moteur comme Unity a est autorisée car Unity lui-même n'est jamais modifié par l'utilisateur final. Vous n'écrivez que des scripts et des données, donc le moteur a des binaires pré-construits pour toutes les plates-formes et le bouton de publication regroupe simplement ces binaires avec les données.
D'autres moteurs s'appuient sur des systèmes de construction et des compilateurs croisés pour créer le jeu compilé en cas de besoin, tout comme vous le feriez avec n'importe quelle application multiplateforme non liée au jeu.
Pour des choses comme HTML5, il existe des outils comme emscripten qui peuvent compiler une application C ++ à exécuter en JavaScript. Vous avez simplement besoin de créer un autre port de votre moteur pour emscripten (car il ne peut utiliser aucune bibliothèque / fonctionnalité C ++ arbitraire).
Vous n'avez pas à réécrire tout votre jeu, mais vous devrez certainement faire beaucoup de travail de développement, de codage et de portage pour chaque nouvelle plate-forme que vous souhaitez prendre en charge.
Sean Middleditch
la source
share/os/<linux>
(oushare/cpu/x86
) et d'y mettre tout le code spécifique à la plate-forme, puis de faire des inclusions conditionnelles. C'est du moins ce que font gcc, HotSpot et le noyau Linux (ce n'est certainement pas une règle stricte). Oui, vous pouvez commencer avec une seule fonction qui dépend de la plate-forme et penser que c'est exagéré, mais cela ne reste jamais comme ça et cela devient rapidement un gâchis sinon.Il n'y a pas de solution miracle ici. Si vous souhaitez que votre jeu s'exécute sur plusieurs plates-formes, vous devez écrire du code pour plusieurs plates-formes (ou exploiter des bibliothèques tierces qui le font déjà pour vous).
Les choses que vous demandez ne s'alignent pas: vous dites (c'est moi qui souligne)
mais aussi que (accentuez le mien encore)
Vous allez à peu près devoir faire l'un ou l'autre: choisissez d'utiliser une bibliothèque, un moteur et / ou une chaîne d'outils tiers qui vous fournit un support multiplateforme, ou créez le vôtre en écrivant du code multiplateforme (conception de votre propre abstraction sur les plateformes dont vous disposez, et implémentation de cette abstraction pour chaque plateforme).
Les moteurs de jeux tels qu'Unreal ou Unity qui prennent en charge cela recompilent votre code par rapport à l'abstraction de plate-forme appropriée, ou vous demandent de créer une bibliothèque ou une DLL par rapport à leurs API internes, qu'ils chargent à partir d'un exécutable de pilote spécifique à la plate-forme qu'ils ont compilé pour le bon. Plate-forme.
la source
Contrairement aux deux autres réponses (qui sont à juste titre spécifiques au C ++), il existe un autre moyen. Quelques architectures qui me viennent à l'esprit:
Personnellement, je trouve que l'approche de libGDX est la plus simple: trouver un langage ou une plateforme qui répond à vos besoins, et écrire dessus. La génération de code et les moteurs portables sont complexes et difficiles à bien écrire.
libGDX est en fait un excellent choix, car il frappe à la fois les principaux téléphones mobiles, les ordinateurs de bureau et le Web (via les applets ou le compilateur Web de Google).
la source
Je construis actuellement un moteur de jeu multiplateforme. J'utilise SDL, qui est une excellente bibliothèque multiplateforme (et de bas niveau) pour créer des applications graphiques, pour soulager la douleur.
Au-delà de cela, cependant, il y a beaucoup de "code personnalisé" pour chaque plate-forme. Vous n'avez qu'à passer au travers. Jusqu'à présent, j'ai trouvé que c'était une très petite fraction de mon temps de développement, principalement consacrée à la recherche de documents pour des systèmes que je ne connais pas aussi bien que mon Linux natif.
Je vous découragerais d'utiliser
#ifdef
partout dans votre code. Au lieu de cela, créez des abstractions autour des primitives clés (un exemple d'une telle primitive pourrait être un socket TCP).Lorsque vous rencontrez un nouveau problème qui nécessite des solutions différentes par environnement, demandez-vous "puis-je résoudre ce problème en utilisant uniquement les primitives multiplateformes que j'ai déjà construites?" Si la réponse est oui: voila, code multiplateforme simple. Sinon, déterminez quelles primitives vous manquez et implémentez-les.
la source
Si vous voulez faire cela "à partir de zéro" comme une expérience d'apprentissage, vous devrez utiliser l'API Win32 où vous pouvez trouver des informations sur l'ouverture d'une fenêtre et un contexte OpenGL sur MSDN et sur le wiki OpenGL ( http: // www .opengl.org / wiki / Creating_an_OpenGL_Context_ (WGL) ). Pour Linux, obtenez une copie d'occasion du manuel de programmation O'Reilly Xlib et du manuel de référence Xlib et lisez également sur GLX (extension OpenGL au système X Window). Voir aussi http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)
Ensuite, il vous suffit de fournir la même API à votre application avec des fonctions qui font la même chose (par exemple ouvrir une fenêtre) mais ont des implémentations différentes pour chaque plate-forme. Vous réécrivez des parties de votre moteur pour différentes plates-formes. Ensuite, un jeu que vous écrivez en utilisant le moteur que vous n'avez qu'à écrire une fois, mais il fonctionnera sur différentes plates-formes.
la source