URL: https://linuxfr.org/users/rewind/journaux/gamedev-framework-0-2-0 Title: Gamedev Framework 0.2.0 Authors: rewind Date: 2016年10月14日T23:12:00+02:00 License: CC By-SA Tags: gamedev Score: 36 Gamedev Framework (gf) est un framework de développement de jeu vidéo 2D en C++11. Il est basé sur [SDL](https://www.libsdl.org/) et [OpenGL ES 2.0](https://www.khronos.org/opengles/2_X/) et s'inspire très largement de l'API du module graphique de [SFML](http://www.sfml-dev.org/) avec quelques différences mineures et surtout en ajoutant des fonctionnalités non-présentes dans SFML. J'avais présenté la [version 0.1.0 dans une dépêche](https://linuxfr.org/news/sdl-ou-sfml-ne-choisissez-plus-prenez-gamedev-framework-gf), et plus précisément l'histoire de gf. Aujourd'hui, à l'occasion de la sortie de la version 0.2.0, je vais présenter les fonctionnalités que vous pourrez trouver dans gf et pas dans SFML. # Dessine moi un mouton Pour dessiner, SFML propose deux façons de faire. Premièrement, la classe `RenderTarget` fournit une méthode générique qui utilise des [vertex](https://en.wikipedia.org/wiki/Vertex_%28computer_graphics%29). Dans ce cas, il faut construire la géométrie de ce qu'on veut dessiner et l'envoyer à SFML qui va se charger d'envoyer tout ça à OpenGL. Deuxièmement, parce qu'il y a quand même des cas qui reviennent souvent, SFML propose des `Drawable`, c'est-à-dire des géométries prédéfinis. On va retrouver des formes classiques : rectangle, disque, polygone régulier, forme convexe générique. Et surtout, la classe `Sprite` qui permet de dessiner un bout d'image et la classe `Text` qui permet d'afficher du texte. Bref, juste le minimum. Dans gf, tout ça existe aussi, mais il y a d'autres `Drawable`. Il y a des formes supplémentaires : le rectangle au bord arrondi, l'étoile. Il y a aussi des courbes ! Rien de bien original, juste des classiques : ligne droite, courbes de Bézier quadratique et cubique, et puis des courbes composées de plusieurs morceaux des courbes précédentes. gf offre aussi des sprites animés et deux cas particuliers bien pratiques : le Nine-Patch et la couche de tuile (_tilelayer_). Un [Nine-Patch](https://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch) est une image qu'on peut étirer en son milieu. C'est pratique pour créer des boutons, parce qu'on n'a besoin que d'une seule image pour toutes les tailles. gf permet d'afficher un Nine-Patch facilement. Quant à la couche de tuile, c'est un cas particulier qui revient souvent. Dès qu'on veut afficher un fond composé de tuiles (qu'on a construit avec Tiled par exemple), on peut se taper tout le boulot à la main et SFML fournit même un tutoriel pour ça. Ou alors, on crée une classe générique qui fait tout le boulot correctement. Dans les trucs un peu délicat, il y a le calcul de la portion à afficher en prenant en compte les rotations de vue par exemple. Je préfère nettement avoir un code générique dans une bibliothèque plutôt que devoir (mal) refaire à chaque fois. # Interface en mode immédiat Un ajout important de la version 0.2.0 est une API pour faire des interfaces en mode immédiat. C'est quoi le [mode immédiat](http://sol.gfxile.net/imgui/index.html) ? C'est une méthode alternative pour faire des interfaces graphiques. Plutôt que d'avoir des classes, un widget est représenté par une fonction (ou plutôt une méthode d'un contexte). Par exemple, on appelle une fonction `button` qui va afficher un bouton et renvoyer un booléen qui indique si le bouton a été pressé. En fait, souvent, la fonction n'affiche pas directement le bouton, elle va mettre des commandes de dessin dans une file. À la fin, la file de commandes peut être lue pour afficher effectivement les widgets. L'avantage des interfaces en mode immédiat, c'est qu'on peut insérer le code de l'interface n'importe où, et notamment on n'a pas à dupliquer l'état du modèle, la vue peut utiliser directement les données du modèle. Le mode immédiat est bien adapté pour faire des petits outils rapides. Souvent, les bibliothèques d'interface en mode immediat (imgui pour les intimes) ne proposent pas directement d'afficher les widgets, ce qui les rend assez agnostiques. D'un autre côté, il est nécessaire d'avoir un peu de glue avec son système d'affichage préféré pour que ça fonctionne. La plus connue des bibliothèque imgui est [Dear Imgui](https://github.com/ocornut/imgui) : 1400 lignes d'en-tête, 10000 lignes de source, le tout dans un seul fichier à chaque fois (pratique à intégrer dans un projet). Pour gf, j'ai décidé de partir d'une [bibliothèque plus simple](https://github.com/AdrienHerubel/imgui). J'ai tout encapsulé proprement dans une classe, et j'ai même amélioré le bouzin avec un système basique de style. Et j'ai ajouté un widget de [cycle](https://en.wikipedia.org/wiki/Cycle_button) parce que je trouvais que ça manquait. Évidemment, dans mon cas, comme j'ai un système d'affichage sous la main, j'ai caché la file de commande, mais elle est bien là. Voilà ce que ça donne. ![imgui](http://gamedevframework.github.io/v0.2.0/ui.png) # Faites du bruit ! Comme vous le savez, j'adore le [bruit](https://linuxfr.org/news/je-cree-mon-jeu-video-e10-generation-procedurale-de-carte-partie-1) ! Et comme la génération procédurale, c'est à la mode et que le bruit cohérent fait partie des outils de base pour la génération procédurale, j'ai ajouté les principaux bruits que j'avais implémenté dans MapMaker. Et j'en ai profité pour ajouter les versions 3D (à l'exception de celles qui sont [couvertes par un brevet](https://en.wikipedia.org/wiki/Simplex_noise#Legal_status)). Et puis, j'avais envie de créer une petite interface pour créer du bruit avec plein de paramètres. Et comme j'avais désormais à ma disposition une bibliothèque imgui, j'ai créé un outil. ![gf_noise](https://raw.githubusercontent.com/GamedevFramework/gf/master/tools/gf_noise/gf_noise.png) J'ai prévu d'ajouter d'autres bruits un peu plus tard. # Du pain et des jeux Finalement, j'ai ajouté des exemples de jeux. Parce que c'est encore la meilleure manière de voir comment on utilise la bibliothèque. J'ai mis un pong et un 2048 qui sont des exemples suffisamment simples pour être compréhensible facilement. ![gf_pong](https://raw.githubusercontent.com/GamedevFramework/gf/master/games/gf_pong/gf_pong.png) ![gf_2048](https://raw.githubusercontent.com/GamedevFramework/gf/master/games/gf_2048/gf_2048.png) Et j'ai également mis Huaca, un jeu que j'avais réalisé (avec une équipe) pour la Global Game Jam 2016. Ce jeu est un peu plus complexe et permet de voir l'utilisation de fonctionnalités avancées (comme les couches de tuiles). ![Huaca](https://raw.githubusercontent.com/GamedevFramework/gf/master/games/huaca/huaca.png) # Conclusion J'aimerais bien continuer à faire des sorties tous les 3 mois, donc rendez-vous sans doute le 14 janvier pour la version 0.3.0. J'espère pouvoir avancer sur Akagoria également. J'ai mis deux jours à porter Akagoria depuis SFML vers gf.

AltStyle によって変換されたページ (->オリジナル) /