Créons un jeu de plateformes de A à Z !



Tutoriel présenté par : Jérémie F. Bellanger
Dernière mise à jour : 11 août 2011
Difficulté : 





8. Ajoutons enfin notre héros !


    Dans ce chapitre, nous allons retourner au code source de notre jeu (dans le projet nommé Aron, rappelez-vous ), et enfin ajouter notre héros. Bien entendu, gérer le héros, ses déplacements, ses animations et ses collisions demande pas mal de code. Mais pas de panique, nous allons procéder par étape !
 


Résultat à la fin de ce chapitre : notre héros arrive enfin  !



A. Créons une structure de base pour notre héros ! 

    Nous allons commencer par créer une structure de base qui va contenir toutes les informations utiles sur notre héros !

    Dans un premier temps, pour simplifier les choses, nous allons nous contenter de créer notre héros et de l'afficher au début du niveau
. On verra ensuite comment le déplacer puis l'animer.

    Ouvrons donc sous Code::Blocks le fichier structs.h et ajoutons tout en bas la structure suivante :

Nom du fichier : structs.h


   /* Structure pour gérer notre héros */

   typedef struct Hero
   {
       //Sprite du héros (pas d'animation pour l'instant)
       SDL_Surface *sprite;

       /* Coordonnées du héros */
       int x, y;

   } Hero;

   

    Comme nous gèrerons l'animation plus tard, nous allons juste créer une variable contenant le sprite immobile de notre héros.
    Nous avons aussi besoin de ses coordonnées x et y pour savoir où le blitter.

    Voilà, maintenant que nous avons créé notre structure, nous allons en initialiser une pour notre player, dans le fichier main.h, en rajoutant la ligne :

Nom du fichier : main.h


   Hero player;
 


B. Initialisons notre héros

    Nous allons maintenant créer deux nouveaux fichiers qui contiendront tout ce qui concernera la gestion de notre héros : player.c et player.h. Pour cela, faites comme d'habitude : File/New/Empty File et entrez le nom du fichier à créer.

    Commençons par player.h. Nous allons y ajouter la déclaration externe de nos structures globales pour que le compilateur sache bien où aller les chercher. Nous aurons besoin de notre structure player, bien sûr   mais aussi des structures Input pour gérer les déplacements et jeu pour gérer les vies, niveaux, etc...

Nom du fichier : player.h


    #include "structs.h"

    extern Gestion jeu;
    extern Hero player;
    extern Input input;


   /* Prototype des fonctions externes que nous allons utiliser ensuite */
    extern SDL_Surface *loadImage(char *name);

 

    Passons maintenant au fichier player.c et créons notre première fonction qui va initialiser notre héros :


Nom du fichier : player.c

 
   #include "player.h"


  void initializePlayer(void)
   {

       /* Charge le sprite de notre héros */
       player.sprite = loadImage("graphics/walkright.png");

      /* Coordonnées de démarrage de notre héros */
       player.x = 20;
       player.y = 304;

   }

   

    Mais que fait cette fonction ? Eh bien, c'est très simple, elle charge le fichier : walkright.png, qui contient le sprite de notre héros et attribue au héros ses coordonnées de départ (pour l'instant arbitraires, et vous pourrez vous amuer à les changer pour voir ).

    Minute ! Mais je n'ai pas ce fichier là, moi !

    Pas de panique, le voici ! Accompagné de son jumeau miroir (parce que ça ira plus vite en SDL que de créer une fonction flip).
    Il vous suffit donc d'enregistrer ces deux images sous leur nom respectif dans le dossier graphics de votre projet Aron !


   

walkleft.png


walkright.png

    Quoi ?! Mais c'est un lapin tout zarbi ! Où est Aron le Torgon ?
    Eh oui ! Ou non... Ce projet n'a en fait aucun rapport avec le jeu du même nom développé par Meruvia. Enfin, si un peu, parce que ce lapin tout zarbi était en fait l'une des premières ébauches d'Aron... Il n'a pas été retenu, mais il va nous servir ici de héros !


    P.S. : C'est un lapin ninja en fait !

C. Affichons notre héros

    Voilà, notre lapin-chose est maintenant prêt à s'afficher devant nos yeux ébahis. Pour cela, nous allons créer une fonction drawPlayer(). La voici :

Nom du fichier : player.c


    void drawplayer()
{
    /* Rectangle de destination à blitter */
    SDL_Rect dest;

    dest.x = player.x;
    dest.y = player.y;
    dest.w = PLAYER_WIDTH;
    dest.h = PLAYER_HEIGTH;

    /* Rectangle source à blitter */
    SDL_Rect src;

    src.x = 0;
    src.y = 0;
    src.w = PLAYER_WIDTH;
    src.h = PLAYER_HEIGTH;

    /* Blitte notre héros sur l'écran aux coordonnées x et y */

    SDL_BlitSurface(player.sprite, &src, jeu.screen, &dest);

}


    Cette fonction vous dit quelque chose ? Normal, c'est une adaptation de fonctions que nous avons déjà utilisées pour blitter la map.
    Mais à quoi servent 
PLAYER_WIDTH et PLAYER_HEIGTH ?

    Eh bien, en fait, ce sont des defs, que nous allons ajouter tout de suite, et qui servent à définir la hauteur et la largeur de notre héros.
    Pourquoi ? Eh bien, tout simplement, parce que notre variable player.sprite est en fait une feuille de sprite (spritesheet en anglais). Comme vous l'aurez remarqué, il n'y a pas un lapin, mais plusieurs. Chaque version du lapin correspond à une frame (image) de l'animation. Or nous ne voulon afficher à chaque fois qu'une seule frame et pas tout le spritesheet, donc nous le découpons comme nous avions fait pour les tiles.

    Pour l'instant, nous n'allons afficher que la première frame, mais nous verrons ensuite, comment animer ces frames avec un timer.


Nom du fichier : defs.h


   /* Taille du sprite de notre héros (largeur = width et hauteur = heigth) */
   #define PLAYER_WIDTH 40
   #define PLAYER_HEIGTH 80


    Il ne nous reste plus maintenant qu'à mettre à jour notre main en rajoutant la fonction initializeplayer() (les rajouts sont marqués en bleu).

   Nom du fichier : main.c


  #include "main.h"


   int main(int argc, char *argv[])
  {
    unsigned int frameLimit = SDL_GetTicks() + 16;
    int go;

     /* Initialisation de la SDL */
    init("Aron");
   
     /* On initialise le joueur */
     initializePlayer();

    /* Chargement des ressources (graphismes, sons) */
    loadGame();

    /* Appelle la fonction cleanup à la fin du programme */

    atexit(cleanup);

    go = 1;


    /* Boucle infinie, principale, du jeu */

    while (go == 1)
    {

        /* On prend on compte les input (clavier, joystick... */
        getInput();

        /* On met à jour le jeu */
        update();

        /* On affiche tout */
        draw();

        /* Gestion des 60 fps (1000ms/60 = 16.6 -> 16 */
        delay(frameLimit);
        frameLimit = SDL_GetTicks() + 16;

    }

    /* Exit */

    exit(0);
  }
       


    Puis, on met aussi à jour main.h comme suit !
 
Nom du fichier : main.h


 #include "structs.h"

  /* Prototypes des fonctions utilisées */

  extern void init(char *);
  
extern void cleanup(void);
  
extern void getInput(void);
  
extern void draw(void);
 
extern void loadGame(void);
  
extern void delay(unsigned int frameLimit);
 
extern void update(void);
  extern void initializePlayer(void);


  /* Déclaration des structures globales utilisées par le jeu */

  Input input;
  Gestion jeu;
  Map map;

  Hero player;
 

     Et pour ce qui est de l'affichage, il nous faut maintenant mettre à jour la fonction draw() dans le fichier du même nom :

Nom du fichier : draw.c


 void draw(void)
{

    /* Affiche le fond (background) aux coordonnées (0,0) */
    drawImage(map.background, 0, 0);

    /* Affiche la map de tiles */
    drawMap();

    /* Affiche le joueur */
    drawplayer();

    /* Affiche l'écran */
    SDL_Flip(jeu.screen);

    /* Delai */

    SDL_Delay(1);

}

 

    Sans oublier le prototype de la fonction dans draw.h :

Nom du fichier : draw.h


  #include "structs.h"

 /* Prototypes des fonctions utilisées */
  extern void drawMap(void);
  extern void drawplayer(void);

/* Structures globales */
  extern Gestion jeu;
  extern Map map;

 

 
    Eh voilà, si vous compilez puis lancez le programme, vous verrez notre super lapin ninja s'afficher !

      Mais ? Si on scrolle, il reste toujours au même endroit !! Est-ce normal docteur ?!

     Euh, oui, on n'a pas encore fini de gérer notre héros : prochaine étape, l'animation de la marche et la gestion du héros par rapport au scrolling (pour qu'il reste au même endroit si on ne le déplace pas ! Pas bouger, hein ! )
.

   


   




 

 

 

Connexion

CoalaWeb Traffic

Today131
Yesterday282
This week925
This month3218
Total1742425

19/04/24