Les bibliothèques graphiques en 2D

Pourquoi j'ai l'impression qu'on a des années de retard ?

a marqué ce sujet comme résolu.

Bonjour, je me rends compte plein de désespoir que des bibliothèques graphiques comme XNA sont considérées comme des outils pratiques pour développer des jeux vidéos en 2D. Pour avoir pas mal utilisé cette bibliothèque, je trouve qu'il lui manque une pelletée de features comme par exemple :

  • Une gestion native de différents états de jeux : pouvoir avoir une boucle de jeu pour le menu, une autre pour le jeu principal, une autre pour le menu de pause, etc…
  • Des animations natives : pourquoi est-ce qu'on peut pas juste dire qu'on veut afficher un gif et le voir s'animer ?
  • Une caméra pour faire du scrolling qui soit native ?
  • Des events mieux gérés : Pouvoir savoir nativement si une touche vient d'être appuyée/relâchée, ce genre de trucs.
  • Une gestion des lumières ? Un truc avec un système de source lumineuse comme on retrouve dans n'importe quelle lib 3D
  • Gestion native du multilingue ? Dans toutes les libs 2D pour jeux vidéos que j'ai vu, il n'y a jamais rien de prévu pour ça.
  • Une base de données intégrée ?
  • Une gestion des collisions mieux foutue que "est-ce que les deux rectangles qui contiennent mes textures se touchent ?" un truc qui fasse ça en fonction de si les pixels sont transparents.
  • plein de détails : Le volume de la musique en pourcents plutôt qu'en décibels ? Un chargement auto de toutes les ressources ? etc…

Une autre feature qui pourtant est dans la SDL mais qu'on a pas ici c'est le fait de pouvoir coller une surface sur une autre facilement. Là on peut juste afficher des images à une position sur l'écran, pas coller une texture sur une autre. Au lieu de tout ça on a plein de trucs à coder nous mêmes, c'est chiant, c'est pourtant des choses qu'on retrouve dans tous les jeux vidéos, je ne comprends pas pourquoi ce genre de choses ne sont pas natives.

C'est pour ça que j'ai décidé de créer ma propre bibliothèque, basée sur XNA (enfin plus exactement sur MonoGame, c'est le même code pour moi, mais ça tourne sous plus de plateformes et au moins c'est officiellement supporté) Cette lib a pour objectif de rendre le développement de jeux vidéos en 2D simple et intuitif. Une lib haut niveau quoi…

Du coup, j'ai cherché à savoir ce qui se fait dans le milieu des libs graphiques 2D haut niveau, pour ne pas avoir dix ans de retard sur les autres quoi… Je cherche désespérément une liste de libs graphiques 2D, de préférence de haut niveau, pour faire du jeu vidéo. La SFML représente en gros ce qu'il doit y avoir de plus bas niveau dans cette liste.

Pour ce qui est du milieu du jeu vidéo 2D professionnel, quelles sont les libs utilisées en général ? N'avez vous jamais trouvé que les libs 2D sont toutes assez bas niveau ? Connaissez vous une liste exhaustive ou presque des différentes libs 2D pou jeux vidéos existantes ?

+0 -0

Merci pour les réponses Gwenn. En faisant le topic j'avais comme espoir secret que tu viennes y répondre ^^

Professionnellement c'est très varié. Transistor tourne sur un fork de MonoGame, Journey sur un moteur de Sony, ChildEngine sur UbiArt, y'a pas mal de Unity3D dans les indés… On en parlait justement par ici avec l'éternel débat entre du logiciel dédié avec une lib bas niveau et un moteur existant (UE4, Unity3D, etc).

J'ai pas mal entendu parler d'Unity en effet. J'essaye de m'y pencher tout doucement. Vu les purs chefs d’œuvres qu'on trouve faits avec, ça donne envie.

  • Je connais mal MonoGame mais habituellement dans les moteurs de jeu, chaque objet a un "tick" ou "update" à chaque frame et la logique se fait là-dedans, pas dans une "boucle de jeu"

En fait avec XNA (donc avec MonoGame aussi j'imagine) le dessin et l'update sont dans deux threads séparés. Là où je trouve qu'il y a "boucle de jeu" c'est qu'il n'y a qu'une fonction Update. C'est au dev de faire en sorte que les bons trucs soient update en fonction de l'état du jeu. Je crois que ce dont je parle ça s'appelle des Game States dans les autres libs. Ça n'existe pas de manière native dans XNA. Pour ma part j'ai recodé ce système d'update pour chaque entité dans la lib que je crée, mais c'est très très loin d'être natif à XNA.

  • Les animations permettent l'interpolation, c'est donc très nettement supérieur à un gif animé, en plus d'être plus flexible

Pardonne mon ignorance mais c'est quoi l'interpolation ? :) Au passage, XNA ne gère les animations d'aucune manière. Que ce soit du GIF ou une suite de sprites en PNG, il faut tout coder soit même à coup de timers.

  • Pour les events, j'aime bien le modèle d'UE4 où tu associe par exemple un event ("released") d'une touche (Z) pour appeler une fonction (Pawn::Move) sur une instance (this)

C'est le comportement que j'essaye de reproduire dans la lib que je crée justement ;) Dans XNA la seule possibilité c'est de "flasher" les périphériques pour connaître leur état à un instant t. Là encore, c'est au dev de faire des trucs pour faire la différence entre une touche poussée ou enfoncée.

  • Le lighting en 2D c'est un sujet intéressant, surtout que tu vas de toute façon devoir utiliser massivement les shaders si tu veux quelque chose de performant

J'essaye aussi de faire du lightning dans ma lib. De mémoire je n'ai vu un truc semblable qu'avec Unity. J'ai pas trouvé autre chose qui fasse ça en 2D.

  • Multilingue : oui, clairement

Ca peut à la rigueur s'expliquer par le fait que la gestion de certaines langues comme l'arabe (donc où l'alignement du texte est différent) peut être fastidieuse. Mais du coup là on peut même pas faire une pauvre traduction Anglais/Français à coup de fichiers de langues de manière native.

  • DB : ok

C'est peut-être un peu lourd de mettre une DB partout mais d'une part elle pourrait être intégrée seulement dans les programmes qui en utilisent une (et faire la détection de cette utilisation à la compilation quoi) et d'autre part je ne crois pas qu'on soit sur des contraintes de poids sur disque dur dans la plupart des jeux actuels.

  • Collisions : utilise Box2D et éventuellement génère des volumes de collision en fonction des textures, parce que ça c'est vraiment pas trivial

C'est la partie sur laquelle je galère le plus en ce moment sachant que j'essaye de prendre en compte les rotations et les zooms de textures aussi. Il y a de la trigo dans tous les sens à cause des rotations et des calculs assez chiants à écrire alors que franchement, tout ceci devrait être intégré nativement…

Je trouve que les libs ont fait plein d'efforts sur la simplicité de la gestion des polices, des musiques et du réseau mais il n'y a pas que ça dans un jeu vidéo :)

+0 -0

Pardonne mon ignorance mais c'est quoi l'interpolation ? :) Au passage, XNA ne gère les animations d'aucune manière. Que ce soit du GIF ou une suite de sprites en PNG, il faut tout coder soit même à coup de timers.

tsunami33

En deux mots, l'interpolation c'est le calcul de valeurs intermédiaires entre deux références. Dans une animation tu as des keyframes relativement espacées, par exemple la position (1, 0, 0) à 1s et la position (2, 0, 1) à 3s : entre les deux, à chaque frame, tu vas déterminer une valeur intermédiaire de façon fluide et réaliste. L'animation est de fait un domaine très technique à forte composante mathématique : tu vas manipuler des courbes et des dérivées de courbes… :)

(C'est intéressant en vrai)

Gwenn

Je n'en doute pas :D Ça m'a tout de même l'air vraiment très complexe. Moi qui voulait avoir un truc avec plein de features dans 6 mois, je crois que je vais avoir du mal ^^ Je pense que les anims et les lumières vont devoir attendre un chouilla. Je me rend compte petit à petit que créer une lib de JV haut niveau en fait c'est hyper complexe… Je pense que je vais recruter d'ici quelques mois :)

  • Collisions : utilise Box2D et éventuellement génère des volumes de collision en fonction des textures, parce que ça c'est vraiment pas trivial

C'est la partie sur laquelle je galère le plus en ce moment sachant que j'essaye de prendre en compte les rotations et les zooms de textures aussi. Il y a de la trigo dans tous les sens à cause des rotations et des calculs assez chiants à écrire alors que franchement, tout ceci devrait être intégré nativement…

tsunami33

Ben le truc c'est que ce n'est pas le rôle des libs. C'est le rôle d'un moteur de jeu.

Gwenn

Les collisions d'accord, mais quid du simple fait de savoir si la souris survole une entité ou pas ? Ça c'est de l'ordre de la lib graphique non ? Hmm peut-être pas en fait. Je crois que je galère pas mal parce que j'essaye de réunir dans la même lib un moteur de jeu et une lib graphique.

Ça a déjà été fait ? Tu as des exemples de libs qui combinent parfaitement les deux ?

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte