Bonjour,
Voila j'aimerais savoir si quelqu'un sait comment je peux coder un programme pour différentes plate-formes sachant que les langages utilisés sont différents ?
Par exemple, j'aimerais faire un programme qui doit etre ecrit en Java sur certaines plate-formes et en C++ sur d'autres.
La seule possibilité que je vois c'est d'abstraire grandement le code pour toute les structures de données propre à chaque langage (car les noms/methodes peuvent changer voir ne pas exister sur toutes les plates-formes) et évidement abstraire tout ce qui est unique à chaque plate-forme (comme ce qui est de l'affichage ou des périphériques d'entrée) mais c'est la gestion de plusieurs langages différents qui me gène :s.
Peut-être que je dois coder mon jeu en, par exemple, C++ puis utiliser un compilateur C++ -> Java, C++ -> Objective-C et ainsi de suite puis en amont aller coder les trucs spécifique mais je ne sais pas si c'est la meilleure façon de faire ? Qu'en pense les spécialistes du forum ? :p
La solution, c'est d'inventer un méta-langage et un méta-compilateur.
Tu écris dans ce méta-langage, et hop ! Une méta-compilation, option --output-language=java, et voilà, le tour est joué !
Bref, ce que tu proposais en première partie, puisque finalement, C++ et Java on quelques similitudes.
Pareil, c'est la gestion de plusieurs langages différents qui me gène.
Pourquoi pas deux fois le même ? C'est pour Windows, GNU/Linux, Mac, iPhone, Android, PS3, Dreamcast et GBA ?
Et bien j'ai un projet très ambitieux auquel je pense depuis pas mal de temps. J'ai toujours rêvé de faire un jeu vidéo et maintenant que j'ai presque fini mes études d'informatiques, je commence à tout mettre à plat pour mon projet.
Le probleme c'est que je doute de finir mon jeu "rapidement" et donc au moment ou je vais vouloir le sortir sur telle ou telle plate-forme, ça m'embeterait grandement de me dire "j'ai une version PC qui tourne mais pour faire tourner le jeu sur tel Smartphone ou telle console, je dois tout réécrire car c'est pas le meme langage".
Je n'avais pas pensé au passage par un meta-langage mais est-ce que ça sera aussi efficace/plus efficace que des compilateurs existants qui traduirait du code du C++ vers le Java par exemple ? (il me semble qu'il existe des outils qui permettent de le faire rapidement entre n'importe quels langages).
En fait, j'étais ironique quand j'ai énoncé la liste de plate-formes.
Disons qu'il s'agit réellement de quelque chose d'ambitieux si tu espères qu'une compilation croisée suffise pour changer de machine.
Puisqu'il s'agit d'autants de supports avec des caractéristiques différentes !
Le PC/Mac/Linux a son gigantesque clavier, la PS3 sa manette, la DS son écran tactile et sa poignée de touches, ...
En fait, il s'agirait plus d'une "erreur de débutant", celle de vouloir faire une application capable de se propager indépendamment du support. Puisqu'il s'agit de quelque chose de pas forcément utile (un MMO sur GBA ou sur DS ?) et qui complexifie la tâche (c'est bien plus simple de tester sur un ordinateur).
Au risque de passer pour un rabat-joie : l'application nécessite-t-elle une indépendance du support ?
Un premier élément de réponse serait une pincée de détails sur le jeu.
Je l'avais déjà fait pendant les vacances sur un meme langage pour PC et DS; En gros j'avais créé une librairie totalement abstraite qui permette de coder n'importe quoi (on un "écran", une "controlleur", un "gestionnaire de son", un "gestionnaire d'évènement", ...). On code tout le programme en fonction de ces objets abstraits.
Ensuite, on implémente de manière concrète chaque classe en fonction de la plate-forme cible (par exemple avec une directive de pré-processeur pour savoir quoi instancier et compiler).
Et on a notre jolie application. Alors biensur les ressources disponibles ne sont pas les meme sur chaque plate-forme mais on peut s'adapter pour peu qu'on y pense à l'avance. Par exemple, j'ai pensé utilisé des sprites décrites en SVG. L'idée c'est de créer les sprites en fonction de la résolution souhaitées (donc en fonction de la plate-forme). Je suis certain qu'avec suffisament d'abstraction, on peut arriver à faire quelque chose de bien sur plusieurs plate-formes en paralèlles.
Maintenant mon obstacle courant c'est le changement de langage. De C++ à Java, je pense que ça doit être largement faisable pour peu que je fasse attention à mettre des couches d'abstractions aux bon endroit (par exemple utiliser des vector abstraits qui seront de simples appels à ceux de C++ et réimplémentés en Java).
Le jeu ici n'est pas mon unique but en fait. J'aimerais pouvoir a terme créer une batterie de librairies destinées à coder un meme jeu pour plusieurs plate-formes.
Dans le principe pour le jeu, disons que j'aimerais axé le jeu sur un certain "réalisme" qui serait grandement renforçé par le côté "multi-plateforme"
Je me doutais que l'architecture serait une grosse abstraction de tout ce dont tu as besoin. Mais bref.
En fait, plutôt qu'un jeu, ce que tu cherches à faire, c'est une bibliothèque omni-plateforme C/C++/Java/Python ?
Parce que le "réalisme" est difficilement rattrapé par le côté omni-plateforme (un jeu qui tourne sur NES et sur XBox360 modulo une compilation ne peut être réaliste). Et puis, vouloir faire un jeu omni-plateforme, c'est vouloir cumuler tous leurs inconvénients sans profiter de leurs avantages. Deux exemples concrets :
- Doit fonctionner sur GBA => Jouable avec quatre boutons (A,B, L, R) et une croix directionnelle, éventuellement deux actions supplémentaires exceptionnelles avec start et select; pas de fonctionnalités online;
- Doit fonctionner sur iPhone => Jouable avec un écran tactile, et c'est tout, d'où la nécessité de revoir la façon de jouer ou d'émuler les boutons via une interface graphique au sein du jeu.
Nota Bene: android se programme en C++ facilement depuis gingerbread (2.3).
Une option qui marche vraiment bien mais qui va te couter assez cher:
http://xamarin.com/monotouch
Bonne nouvelle ça
. Si je peux déjà garder le C++ pour pouvoir faire une version Android c'est cool, je pensais que c'était limité qu'au Java (mais vu que j'ai pas encore de device Android, j'ai pas fait beaucoup de recherches non plus ^^).
Pour le "réalisme", c'est pas en terme de rendu que je parlais. Disons qu'au niveau du concept, ça collerait mieux si on pouvait accéder au jeu de "n'importe où". Donc évidemment je cible d'abord les smartphones, mais je ne voudrais pas me fermer des portes dès le départ, sachant que mon jeu me demandera sans doute plusieurs années de développement. Après si c'est trop compliqué à mettre en place (ou si je peux le mettre en place par après), je peux toujours voir par après si ça vaudra la peine.
Je viens de me rappeler qu'il existe des outils pour créer des compilateurs: http://fr.wikipedia.org/wiki/Lex_et_yacc mais est-ce raisonnablement efficace comme méthode ? J'ai déjà utiliser Lex pour créer un compilateur dans un projet au cours de mes études mais je ne sais pas si la combinaison de ces 2 outils fonctionne bien.
Enfin bref, je vais surement faire ça en C++. Si j'ai besoin de changer de langage par après, j'aviserais je pense.
lex et yacc servent en effet a faire des langages grammaticaux. Cependant, j'ai peur que faire un compilateur pour passer d'un langage en fonction de la plateforme est un projet bien plus complique que faire et porter un jeu manuellement. De plus, certains langages ne sont pas grammaticaux et ca risque d'etre le bordel (C++ n'est pas grammatical)
Sinon comme solution bien simple si tu ne fais que l'objet, il te reste les outils de modélisation UML (type Modelio) qui génèrent automatiquement le code dans différents langages pourvu que tu ais pondu un modèle correct et complet (et oui, même si ça n'a pas été cité le "concevoir une application indépendamment du langage" ressemble foutrement à de l'UML pour moi... m'enfin). De plus faut savoir que même indépendamment des langages, l'implémentation de certains éléments peut différer entre les plateformes selon le compilateur (en ADA pour ne citer que ça, et ses variables implémentées différemment par chaque compilo si je me souviens bien). Ce que tu cherches à faire c'est unifier tous les langages de programmation, bonnes nouvelles : t'es pas le premier, mauvaise nouvelle : t'es pas le premier ! C'est pas pour rien que maintenant les jeux sont développés par plateforme et pas "pour toute plateforme" ;) (et encore, ça date pas d'aujourd'hui)
Pourquoi ce compliquer à programmer un jeu en 2 langages alors que Java est multi plateforme ? ![]()
Arf désolé j'avais pas vu que tu voulais développer sur DS , GB et co...
Personnelement je te conseillerai de faire tout en C tout d'abord voir en python histoire d'avoir du code claire et propre que tu pourra ensuite transposé ailleurs .... ![]()
Je ne souhaite pas "unifier tous les langages". Je sais tres bien que c'est une entreprise impossible. Cependant, je doute que les developpeurs professionels developpent X fois leur jeu pour chaque plateforme. S'ils font du developpement 360-Ps3-PC par exemple, il y a bien un niveau d'abstraction qui est mis en place pour avoir un maximum du jeu commun aux differentes plateformes et je me demandais juste si quelqu'un avait eu vent de la marche a suivre.
Apres je cherche pas non plus a faire un jeu de malade qui tournera que sur un PC et que j'aurais toutes les peines du monde a adapter sur des devices plus limités, je compte bien en tenir compte durant tout le developpement.
Je me demande si ce n'est plus simple de creer une sorte de moteur (propre a chaque plateforme) et de transposer les "niveaux" dans une forme generique que les moteurs seraient capables d'interpreter. Ca seraiit deja un gros travail mais une fois que ca serait fait, on pourrait concevoir le jeu a proprement parler sans se soucier du reste d'une certaine maniere mais je me demande s'il n'y a pas de meilleure technique ?
Salut!
Alors je pense que ca sert pas a grand chose de vouloir ne pas réécrire en java ce que tu as écris en C++, et vice versa. "Creer" un systeme qui te permetrai une tel pirouette serait beaucoup plus lourd a écrire, mainetenir, et limité que de tout réécrire (je ne parle meme pas des optimisations).
De même pour le chargement des ressources, ca ne doit JAMAIS etre fait dans le jeu lui meme (les ressources d'un jeu, les fichiers, pour les modèle 3D, textures, etc, sont souvent un dump de ce que tu as en mémoire, pour accelerer le chargement). Pour transformer les resources soit tu pars d'une source comme tu le dis en SVG, et tu fait une moulinette qui va transformer ca en sprite pour tel et tel plateforme.
A titre indicatif il y a 2ans j'ai porté un jeu DS sur iPhone, le code C++ qui était commun au 2 a été gardé tel quel (a quelque modif près), puis tout ce qui était input et affichage avait été recodé pour iPhone. Les ressources, ben entre un iphone et une DS ca n'a absolument rien a voir. J'avais refait une moulinette qui partait des fichier image source pour créer des texture Opengl (alors que sur DS ca utilisait le système de sprite de la machine).
Comment font les pro? ben comme ca... et si ils font une version android et une version 360, ben ils gèrent le code C++ 360 et le code java android, y'a pas d'autre facon de faire (sinon tu as trop de limitations/probleme). Après tout ce qui peut etre commun au 2 peut etre écrit dans un langage du genre Lua, qui sera interpétré dans les différentes version.
Et pour info, sur mac on est pas obligé de travailler en Objective C
Le developpement PC/Ps3 et 360 c'est pareil, tu va avoir une partie de code commun d'un coté, et puis les spécifité de chaque plateforme de l'autre. En 2006 j'étais dans un studio ou on travaillait sur LA Noire, et on avait qu'un build PC (a l'époque le jeu était encore une exclu PS3, et il n'y avait pas de dev kit PS3). De meme quand j'ai travailler sur PSP, une version PC et une version PSP. tout ce qui concerne l'affichage était recodé 2 fois, pour chaque plateforme, et c'est la meilleur facon de faire, car c'est la seule qui te permet d'optimiser à fond pour chaque plateforme (et ca c'est beaucoup plus important que de ne pas avoir a réécrire du code).
"il y a bien un niveau d'abstraction qui est mis en place pour avoir un maximum du jeu commun aux differentes plateformes"
Oui, ça s'appelle la modélisation UML. On développe un modèle de l'application, on choisit la technologie qui l'implémentera, on implémente. Si on veut changer de technologie, on reprend le modèle, on implémente. L'UML a justement été développé dans l'optique de monter en abstraction par rapport au langage utilisé afin de pouvoir réutiliser les modèles sur différentes plateformes, je ne l'invente pas hein... C'est un peu incontournable comme langage de modélisation dès que tu fais des applications objets de plus de quatre ou cinq classes (et encore même là j'aime bien avoir mon petit diagramme de classe récapitulatif histoire de rien oublier).
@Pilo1488
Donc si j'ai bien suivi, quand tu dois faire un programme qui doit être écrit dans 2 langages différents, tu réécris le code 2x systématiquement ? La seule chose qui fera que les 2 programmes seront "identiques" (ou équivalents si tu préfères) ce sont les ressources qui vont définir ton jeu ?
Parce qu'évidemment quand c'est le même langage, on peut "facilement" isoler tout ce qui est propre à chaque plate-forme et c'est justement quand on change de langage que je ne voyais pas précisément comment procéder "au mieux".
@bibibi60
L'UML permet de garder les idées claires lorsque le programme devient complexe c'est vrai, mais je me demandais s'il n'y avait pas une "astuce" ou "subtilité" pour éviter de devoir tout réécrire en fonction de chaque langage. Car pour un même langage, on peut effectivement le faire (si on doit faire une version OpenGL et DirectX pour notre jeu, on peut le coder en C++ et ne recoder que le module d'affichage). Je compte evidemment faire de l'UML pour mon projet une fois que j'aurais suffisament avancé sur le contenu.
Enfin voila merci beaucoup pour vos réponses. En clair, je dois bien réécrire le tout pour chaque langage que je serai amené à utiliser ;).