nbrignol.fr Ceci est ma contribution au World Wide Web.

Actor Stdio : étape 1 L'image du héros est centrée sur l'écran.

Catégories : jeu vidéo, développement, game design, SDL, C++.
Publié en 2015.

En piste !

Pour commencer, je veux configurer correctement le projet. Je vais commencer par travailler avec la bibliothèque SDL 2 pour ses qualités multi-plateforme, mais je compte faire en sorte de rendre mon code le moins dépendant possible pour pouvoir changer le moteur de rendu ultérieurement, au besoin.

Installation

Mon poste principal de développement est sous OSX Maverick. J'ai donc simplement téléchargé les binaires de SDL pour ma plateforme. Comme indiqué dans le README, j'ai copié le "SDL2.framework" dans "/Library/Frameworks/".

Je ferais aussi BIENTOT l'installation sur un poste Linux en parallèle (Ubuntu). Visiblement, les packet de la lib SDL2 sont disponibles depuis Ubuntu 13.10 (apt-get install libsdl2-dev).

Premier test

Je commence donc tranquilement en créant un simple "Hello World" pour voir si tout est bien installé. Je me sers du site de Lazyfoo.net qui contient des tutos SDL2 très complets.

Par rapport aux tutos, j'ai du préciser le dossier SDL/ lors de l'inclusion du header SDL2.h. Pour compiler tout ça il a fallu lier avec le framework SDL2. J'ai créé un petit script buildAndRunOsx.sh en attendant un vrai makefile.

Décryptons

SDL_CreateWindow sert donc à créer notre fenêtre. Il faut lui passer une taille, mais on peut laisser le systeme choisir sa position. Il y a pas mal d'options aussi (le dernier paramètre), notament une qui permet de faire du plein écran.

Le programme ne reste vivant que 2000 milli-secondes ( SDL_Delay( 2000 );).

Bouton "fermer"

Pour éviter de laisser la fenêtre ouverte seulement 2 secondes, j'ajoute une gestion basique des évenements avec la fonction SDL_PollEvent.

Elle permet de connaitre la liste des évenèments qui ont été déclenchés : click, mouvement de souris, clavier, ... et bouton fermer sur la barre de titre de la fenêtre.

En testant la constante correspondant à notre bouton, on peut quitter correctement le programme (sortir de la boucle sans fin et désactiver ce qu'il faut pour SDL).

Visiblement, il faut placer habituellement la fonction dans une boucle (voir documentation), mais pour notre test c'est suffisant. Visiblement aussi chaque SDL_Event comporte plein d'infos spécifique (position souris, touche pressée, etc) selon le type de l'évennement, mais aussi des propriétés communes, comme type qui nous permet de savoir quel évenement on recoit.

Enfin... affichage de l'image du héros

Première surprise, SDL ne gère nativement que le format BMP. Il existe des extensions que j'utiliserai plus tard pour utiliser des formats plus modernes. En attendant, voila l'image que j'utilise :

Le héros en BMP (!) mesure 100px par 156px
(sur un fond blanc, du coup).

La fonction Blit_surface permet donc de coller une surface sur une autre (la fenêtre en est une et notre héros aussi). Le parametre permet définir la position et le recadrage de notre hero sur la fenêtre. Je procéde à un savant calcul pour que l'image soit centrée horizontalement et verticalement.

Pas mal !

Png et transparence

Il existe une lib qui permet d'utiliser des formats d'image un peu plus moderne : SDL_image. Sur OSX c'est aussi un framework, je le copie donc au même endroit que l'autre. Sans oublier de l'ajouter dans le script de compilation.

Comme c'est une lib complémentaire à SDL, il suffit d'ajouter une phase d'initiation, de remplacer l'appel à SDL_LoadBMP(monfichier) par IMG_Load(monfichier) et c'est gagné !

Le héros en PNG mesure 100px par 156px
(sur un fond transparent, du coup).

Refactoring

Voila ! Ca marche. Sauf que ce genre de code spaghetti va nous empecher d'avancer rapidement. Il faut donc refactorer !

L'objectif principal est d'essayer d'être le moins dépendant possible de la lib SDL. On va donc cacher tout ce qui est spécifique dans une classe Sdl2Renderer. On va aussi encapsuler notre héros dans une classe, totalement indépendante du Renderer : la classe Actor.

Pour le moment, on garde le fichier main qui nous servira de controller.

Evidement, ces classes risquent de beaucoup évoluer pour les étapes suivantes. C'est le jeu !

Je fais le choix de créer un fichier par classe, à la Java. Attention aussi aux chaines de caractères, pour lesquelles j'utilise la classe "std::string" (C++), alors que les fonctions SDL utilisent les "char *" (C), d'ou l'utilisation de maChaine.c_str().

Les entités du moment :
Actor
Sdl2Renderer

Et voila !

Cette fois c'est bon !

Mission accomplie !

Notes pour plus tard
Installer SDL2 et SDL_Image sur Ubuntu.
Tester la compilation du programme de test sur Ubuntu.
Créer un makefile pour chaque plateforme plutôt qu'un script maison.
Tester avec une fenêtre en plein écran (comment récupérer la taille de l'écran?).