
Framework de jeu Python
2024- Dev de jeux vidéos
- Python
- Pygame
- Projet perso
Suite à mon projet NSI Impostor, pendant mon année de terminale, j'ai eu l'envie de transformer ma surcouche à Pygame en réel pseudo-framework, avec notamment un meilleur système d'entités, un éditeur de maps, un système d'interface utilisateur, etc.
Avant tout, un aperçu de l'éditeur de map et du jeu qui en résulte
Architecture
Etant donné que ce projet est une suite à mon projet NSI Impostor, la structure et les systèmes implémentés restent similaires, tout en possédant de nombreuses améliorations. Ce projet étant principalement la mise en place d'un sorte de framework et non d'un jeu concret, j'aborderais plus en détails la façon dont j'ai créé les systèmes de celui-ci.
Système d'entités et de composants
J'ai donc mis en place un système d'entités et de composants type ECS (Entity Components System). Les entités sont rendues très flexibles grâce aux composants qu'elles peuvent posséder. Les composants que j'ai implémenté sont les suivants :
- AnimationComponent, pour posséder des sprites / animations et les jouer
- CollisionComponent, pour détecter les collisions avec les autres entités en possédant
Bien que je ne sois pas aller plus loin dans ce projet, j'avais comme intention d'implémenter d'autres composants comme l'InteractionComponent et le PhysicsComponent qui aurait rendu d'autant plus flexible les interactions et collisions entre entités.
Système de maps
Contrairement au projet NSI Impostor qui faisait appel à Tiled pour gérer les maps, l'idée ici est de créer les maps directement dans un éditeur avec une interface graphique, qui stocke les maps dans un format propre que j'ai défini. Une fois en jeu, les maps peuvent être chargées et permettent de reconstituer les éléments souhaités. Même si je ne suis pas aller plus loin dans ce projet, je souhaitais mettre en place un système de "Chunk" afin d'optimiser la gestion de grandes maps qui seraient devenues gourmandes en ressources.
Système d'interface utilisateur
Ce système est sans doute celui dont je suis le plus fier, un système d'UI customisable qui s'inspire de la façon dont on peut gérer les éléments du web avec le CSS. Celui-ci fonctionne grâce à 3 éléments principaux :
- Un UIContainer, qui est un élément de base d'interface. Il peut posséder des enfants. Il peut posséder de très nombreuses propriétés. (voir la première capture d'écran ci-contre)
- Un UIId, qui est une façon d'identifier un UIContainer et de lui appliquer un style.
- Un UIManager, qui est l'objet qui va gérer une hiérarchie d'UIContainer et déclencher la mise à jour, et l'affichage.
Dans ce système d'UI, il est possible de charger un fichier de configuration JSON, qui permet d'appliquer un style aux éléments demandés (via l'UIId), de la même façon qu'on applique du CSS au Html ! (voir la deuxième capture ci-contre, qui est une partie du fichier de config de l'éditeur de maps, lui-même créer à partir de ces élements d'UI).
Propriétés d'un UIContainer
Un UIContainer peut posséder de nombreuses propriétés mais les principales sont les suivantes :
- Un layout, qui définit comment ils positionnent ses enfants : "normal" (position absolue), "flex" (comme les flexbox CSS) ou encore "grid". Chacun de ces layouts vient avec son lot de propriétés complètement customisables. Pour en citer quelques unes, pour le normal son ancre et sa taille, pour le flex sa direction, son flex_justify (comme justify-content en CSS) ou encore pour la grid son nombre de lignes, colonnes.
- Des propriétés d'apparence comme la couleur de fond, la bordure
- Des propriétés comme la possibilité de scroller, ou encore concernant sa visibilité.
Différents dérivés d'UIContainer
J'ai pu créer de nombreux dérivés de l'UIContainer, tous apportant quelques choses d'utiles à la création d'une interface utilisateur d'un jeu :
- Un UIText, qui permet d'afficher du texte, en contrôlant notamment la couleur du texte, son alignement, sa taille, etc.
- Un UIImage
- Un UIButton, qui permet de déclencher des évènements, en fonction du type de clic notamment (clic maintenu, double clic, etc.)
- Un UISlider
- Un UIOptions
- Un UIEntry qui sert d'input de texte
- Un UICheckbox
Un système de particules
J'ai pu mettre en place un système de particules relativement avancé qui fonctionne grâce à des emitters (créateur de particules) que l'on peut définir dans l'éditeur de maps. Les particules ainsi que les emitters peuvent posséder de nombreuses propriétés comme une durée de vie, une taille, une vélocité, une rotation, etc. (voir la capture d'écran ci-contre).

Autres
Bien que je n'ai pas poursuivi ce projet, j'avais comme idées l'ajout d'autres systèmes et fonctionnalités comme la mise en place de cinématiques avec gestion de celles-ci depuis l'éditeur de maps, ou encore la mise en place de PNJs avec des dialogues.

