Suivez l'évolution du framework !
Suivez moi sur Github pour vous tenir informé des dernières nouveautés du framework : https://github.com/Asthegor/Dina_SDL
2021-12-28
Première version stable du framework
J'ai enfin réussi à avoir une première version stable, sans erreurs ni warnings (le plus dur).
La boucle de jeu fonctionne, on peut charger une image et l'afficher et, en bonus, on peut même changer de scène !
Et j'oubliais... Le deltatime
est présent et fonctionnel ! Trop heureux de voir tout ça fonctionner sans erreurs !
Pour le moment, il n'y a aucune gestion des événements.
Enfin, ce n'est pas tout à fait vrai. Il y a bien une gestion d'événement : la fermeture de l'application avec la croix.
Bon, c'est pas vraiment grand-chose et puis, ça risque de changer énormément pour être extrait de la fonction Run
de Game
.
Modèle de projet Visual Studio 2022
Après avoir finalisé cette première étape, j'ai voulu faire un modèle de projet Visual Studio.
C'est pas vraiment compliqué mais il faut être minutieux, tant sur les répertoires que sur certains paramètres.
Il m'a fallu plusieurs essais avant d'obtenir une version fonctionnelle.
Bon, c'est vrai qu'il reste encore beaucoup de manipulations à faire par l'utilisateur avant de pouvoir utiliser le projet.
J'ai 2 options :
- Soit je conserve l'architecture comme elle est (avec un grand nombre de manipulations par l'utilisateur)
- Soit j'utilise les packages NuGet de SDL2 (pas ou peu de manipulations par l'utilisateur)
Y'a pas photo : je choisirais la 2ème option si je devais utiliser mon framework.
Enfin, il reste une 3ème option, plus radicale : intégrer les librairies SDL2, SDL2_image, SDL2_ttf et SDL2_mixer à mon projet....
Faisable mais lourd en terme de contenu.... Pas vraiment un problème d'espace disque mais bon...
Pour le moment, ce n'est pas ma priorité.
Je verrais ça dans une autre version.
Vous pouvez télécharger les nouveaux outils ici : Outils
2021-12-24
Joyeux Noël !
Je vous souhaite à tous un joyeux Noël !
Pour bien débuter, j'ai décidé de revoir l'architecture du moteur.
Oui, un énorme boulot car mon moteur et le jeu était tellement imbriqués que je devais fournir les sources complètes du moteur afin de faire un jeu 😱😱😱
Donc, direction...
Formation
Une série de vidéos de TheCherno (explique très bien même s'il parle un peu vite, avec les sous-titres ça aide un peu des fois) va me permettre de construire toute l'architecture.
Je vais vraiment écrire un moteur de jeu digne de ce nom (même s'il sera beaucoup plus simpliste que Unreal ou Unity). Trop hâte !
Bien que certaines notions soient assez avancées, j'arrive plutôt bien à suivre.
Il nous a fait ajouter un système de log très performant (spdlog) et un gestionnaire d'événements.
Pour le gestionnaire d'événement, j'ai fait une recopie du code qu'il avait écrit car certains define
et classes sont assez (même très) complexes.
N'ayant jamais utilisé de define
dans mon code, c'est tout à fait compréhensible de ne pas bien comprendre. Toutefois, je perçois bien leur utilité.
Idem pour le gestionnaire de fenêtre (même s'il ne devrait y en avoir qu'une seule pour un jeu).
Comme il utilise GLFW comme moteur graphique, c'est là où je vais devoir "improviser" les changements pour utiliser SDL2.
Intégration de SDL
Dans son projet, il utilise Premake qui permet de générer les fichiers pour Visual Studio, XCode, etc.
Cependant, je vais devoir m'en passer : un problème technique que je n'ai pas compris ne me permet pas de l'utiliser pour charger les librairies de la SDL.
Pour l'instant, je vais me concentrer à faire le moteur exclusivement sous Windows.
Au bout de 5 ou 6 tentatives non fructueuses d'intégration de la SDL dans le projet (j'avais toujours des erreurs lors de l'édition de liens), j'ai enfin réussi à compiler et lancer le projet.
J'ai également rajouté les éléments qui semblaient bien fonctionner comme la machine à états et la partie affichage graphique.
Voici ce que j'obtiens pour le moment :
2021-12-21
Petits pas
Mon projet permet actuellement d'afficher le logo et, au bout de 2 secondes, de passer au menu principal avec un fond et 2 vaisseaux.
Avant d'ajouter des musiques et des animations, je vais d'abord inscrire le titre du jeu.
Mais rajouter le titre, c'est implémenter la librairie SDL_ttf.
La documentation est bien décrite et permet d'aller plus vite dans la compréhension et le prototypage.
Je vais pour cela devoir créer une nouvelle classe Font pour gérer la création et la destruction d'une TTF_Font (l'objet derrière la font).
Cela semble rajouter une couche mais permettra de simplifier certains traitements par la suite.
Comme ça fait partie de l'affichage, je vais rajouter une nouvelle fonction statique dans la classe Graphic.
On verra avec le temps si je vais devoir découper cette classe en 2.
Maintenant, au travail !
Il existe 3 façons d'afficher le texte à l'écran :
- une façon un peu pixélisée
La façon la plus standard
- la même façon que la précédente mais avec un fond coloré
Pourrait servir pour des panneaux publicitaires ou d'autoroute dans un jeu ?
- une façon "Haute Définition" (les bords sont toujours pixélisés mais avec un effet sur la transparence)
Cette façon est celle qui consomme le plus de ressources
Au début, je voulais charger la police de caractère dans la classe Graphic
. Puis je me suis aperçu que cela n'allait pas.
J'ai donc regrouper l'ensemble des fonctions dans la classe Font
.
Contrairement à ce que j'ai fait pour le logo, je n'ai pas utilisé la classe Texture
. Je la réserve uniquement pour les images.
Donc dans le Draw
du menu principal, je fais des SDL_RenderCopy
.
Je viens de penser à un petit effet (rendu possible et simplement par la classe Texture
) : faire apparaître le vaisseau assez gros puis réduire sa taille jusqu'à la taille finale (il me faudra soit une image de très haute définition soit une grande image que je réduirais). Cela fera comme si le vaisseau changeait de profondeur. je verrais à l'implémenter quand j'aurais trouvé l'image (ou les images) de mon vaisseau.
En attendant, j'ai déjà le titre dans le menu principal (j'ai retiré les 2 vaisseaux que j'avais mis pour des tests).
Prochaine étape : rajouter les items du menu (jouer / options / crédits / quitter) et un indicateur (image, symbole ou couleur) pour l'item sélectionné.
Ensuite, il faudra que je gère les événements du clavier (on fera la souris et le gamepad plus tard).
À très vite !
2021-12-18
Belles avancées
Mon framework se construit petit à petit.
Je suis parti sur la conception d'un jeu de type Shoot'em Up pour avoir une base avec laquelle travailler.
Structure principale
En premier lieu, j'ai mis en place la structure principale : la boucle de jeu.
Pas trop compliqué avec l'aide d'un exemple qui fonctionne (^_^)
Ensuite, j'ai rajouté les fonctions Load
, Update
et Draw
pour créer le modèle.
J'ai voulu afficher le logo. Cela semblait facile...au début...quand tout était dans le fichier principal (celui qui contient uniquement les fonctions Load
, Update
et Draw
).
Mais là où les choses ont commencé à se corser, c'était quand j'ai voulu rendre l'affichage de mon logo dans un fichier à part...
Il a fallu que je me crée une classe Component
qui permettrait d'avoir les fonctions obligatoires (Load
, Update
et Draw
) dans les classes qui en héritent.
Mais je me suis vite aperçu qu'il me fallait un renderer
(zone où afficher les images).
Pour avoir ce renderer, il a fallu que je crée 2 nouvelles fonctions : PreInitialization
et PostInitialization
.
La fonction PreInitialization
permet d'indiquer le titre et la tille de la fenêtre de jeu et PostInitialization
permet d'avoir le renderer convenablement créé.
Par avance, je me suis créé une structure Graphic
qui contiendra toutes les fonctions pour charger les éléments graphiques.
Pour l'instant, il n'y a qu'une seule fonction LoadTexture
mais je la ferais évoluer si besoin.
Machine à états
Ensuite, j'ai voulu créer une machine à états...... Ô Malheureux !
J'ai passé plusieurs heures pour essayer de trouver un système qui puisse fonctionner convenablement.
Au départ, j'ai créé mon singleton
(design pattern). Quelques révisions m'ont été nécessaires pour parvenir à un premier résultat.
Bon, faut dire que ça marchait pas vraiment mon histoire... J'arrivais à rajouter un nouvel état avec un pointeur vers l'objet concerné (ici, mon objet Logo
).
Mais là où cela posait problème, c'était de lancer la commande Load
dessus... Le programme n'arrivait jamais à retrouver l'état que j'avais initialisé (pourtant bien présent dans les données).
Je suis donc retourné sur la table à dessin pour trouver une meilleure architecture.
J'ai imaginé une classe State
qui contient le nom de l'état et un pointeur vers l'objet Component
(le nom est optionnel et je verrais peut-être à le retirer dans une prochaine version).
Mise en place du deltatime
Pour changer l'état de mon jeu (pour passer du logo au menu principal), j'ai voulu avoir un timer
.
Toutefois, je n'avais pas encore implémenté le deltatime
.
J'ai créé un autre singleton pour interroger l'heure courante et la comparer avec l'heure prise avant l'appel précédent.
Mes premers résultats était de l'ordre de 1.0e-07 à 2.0e-06. Plus que performant je dirais mais cela ne correspondait pas vraiment à une valeur correcte pour un deltatime...
Plusieurs recherches plus tard (et de nombreux échecs aussi), j'ai fini par obtenir une valeur correcte.
Même si j'ai implémenté mon propre deltatime, je vais utiliser celui fourni par la SDL (il doit être probablement plus robuste que le mien).
GO vers une nouvelle mise à jour (^_^)
Améliorations prévues
Dans un premier temps, je vais améliorer les différents éléments que j'ai déjà.
Ensuite, je vais rajouter la gestion du clavier pour que chaque classe héritant de Component
puisse y accéder.
Une fois cette étape franchie (et validée), je vais rajouter la souris puis le gamepad.
En parallèle, je complèterais mes autres classes pour rajouter les attributs nécessaires.
Mon objectif principal est double. Je souhaite :
- créer mon jeu de type Shoot'em Up
- concevoir un modèle de projet pour pouvoir créer d'autres jeux plus rapidement.
Une fois le jeu fini, je pourrais créer un modèle de projet Visual Studio que je partagerais (ici et sur le marketplace de Microsoft si je peux).
2021-12-15
Modèle de projet Visual Studio
Afin de vous simplifier la vie pour la création de vos futurs jeux avec SDL2, j'ai fait un petit modèle de projet pour Visual Studio 2022.
Ce modèle vous permet d'avoir déjà une certaine structure (en cours de développement) pour que vous puissiez plus rapidement commencer des projets de jeux.
C'est une petite aide pour des GameJam par exemple (^_^)
Vous pouvez télécharger les nouveaux outils ici : Outils