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



Tutoriel présenté par : Jérémie F. Bellanger

Dernière mise à jour : 15 novembre 2011

Difficulté :  




Chapitre 20

Ajoutons de la musique
!


    Eh oui, que serait un jeu vidéo sans musique ? Même des bilips bilips peuvent faire l'affaire ! Mais peut-on envisager notre jeu sans son ? Eh bien, non !
    C'est pour ça qu'on va rajouter la bibliothèque SDL_Mixer !

    Mais, si rappelez-vous ! Je vous l'avais faite télécharger tout au début de ce tuto ! Bon j'avoue que c'est loin maintenant, mais quand même !


Résultat à la fin de ce chapitre : notre lapin virevolte maintenant en musique !


    Voilà, alors comme pour les autres bibliothèques, vous allez mettre le contenu du dossier include dans le dossier include de la SDL (par commodité), et vous mettrez SDL_mixer.lib dans le dossier lib de la SDL !
    Ensuite, on va copier les dll : SDL_mixer.dll et smpeg.dll dans le dossier de notre jeu (Aron).

    Voilà, passons maintenant à la configuration de notre compilateur comme pour SDL_TTF !
Allez dans le menu Project / Build Options. Là, dans l'onglet Linker Settings, cliquez sur Add et sélectionnez le fichier SDL_mixer.lib (suivant là où vous l'avez mis ). Cliquez ensuite sur OK (sans oublier de répéter l'opération pour debug et release, suivant ce que vous souhaitez compiler, bien sûr).

    Et voilà, on va maintenant modifier notre fichier defs.h pour que le compilateur puisse trouver le fichier en-tête contenant les prototypes des fonctions de SDL_TTF :   


Nom du fichier : defs.h


   #include <stdio.h>
   #include <string.h>
   #include <stdlib.h>
   #include <math.h>
  #include <SDL/SDL.h>
  /* On inclut les libs supplémentaires */
  #include <SDL/SDL_image.h>
  #include <SDL/SDL_ttf.h>
  #include <SDL/SDL_mixer.h>

  /* Taille de la fenêtre / résolution en plein écran */
  #define SCREEN_WIDTH 640
  #define SCREEN_HEIGHT 480

  ....
       

   
    Voilà, maintenant que c'est fait, on va faire comme pour les autres libs : on va l'initialiser au début et la fermer à la fin !


Nom du fichier : init.c


   void init(char *title)
{
    /* Initialise SDL Video */

    if (SDL_Init(SDL_INIT_VIDEO ) < 0)
    {
        printf("Could not initialize SDL: %s\n", SDL_GetError());

        exit(1);
    }


    jeu.screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, SDL_HWPALETTE|SDL_DOUBLEBUF);

    if (jeu.screen == NULL)
        {
            printf("Couldn't set screen mode to %d x %d: %s\n", SCREEN_WIDTH, SCREEN_HEIGHT, SDL_GetError());
            exit(1);
        }

    /* Titre de la fenetre */

    SDL_WM_SetCaption(title, NULL);


    /* Cache le curseur de la souris */

    SDL_ShowCursor(SDL_DISABLE);


    /* Initialise SDL_TTF */

    if (TTF_Init() < 0)
    {
        printf("Couldn't initialize SDL TTF: %s\n", SDL_GetError());

        exit(1);
    }

    /* Chargement de la police */
    font = loadFont("font/GenBasB.ttf", 32);


    /* Initialise SDL_Mixer */

    int flags=MIX_INIT_MP3;
    int initted=Mix_Init(flags);
    if( (initted & flags) != flags)
    {
        printf("Mix_Init: Failed to init SDL_Mixer\n");
        printf("Mix_Init: %s\n", Mix_GetError());
        exit(1);
    }

    /* open 44.1KHz, signed 16bit, system byte order,
           stereo audio, using 1024 byte chunks */
    if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1) {
        printf("Mix_OpenAudio: %s\n", Mix_GetError());
        exit(1);
    }

    /* Définit le nombre de channels à mixer */
    Mix_AllocateChannels(32);


}


    Voilà, je vous renvoie vers la doc de SDL_mixer, si vous voulez savoir ce que fait réellement la lib. Mais pour l'instant, savoir s'en servir nous suffira bien !
    On passe donc à sa fermeture :


Nom du fichier init.c


  void cleanup()
{

    int i;

    /* Libère l'image du background */

    if (map.background != NULL)
    {
        SDL_FreeSurface(map.background);
    }


      /* Libère l'image des tilesets */
    if (map.tileSet != NULL)
    {
        SDL_FreeSurface(map.tileSet);
    }
    if (map.tileSetB != NULL)
    {
        SDL_FreeSurface(map.tileSetB);
    }


    /* Libère le sprite du héros */
    if (player.sprite != NULL)
    {
        SDL_FreeSurface(player.sprite);
    }

    /* Libère le sprite des monstres */
    for(i = 0 ; i < MONSTRES_MAX ; i++)
    {
        if (monster[i].sprite != NULL)
    {
        SDL_FreeSurface(monster[i].sprite);
    }
    }



    //Libère le HUD
    if (jeu.HUD_etoiles != NULL)
    {
        SDL_FreeSurface(jeu.HUD_etoiles);
    }
    if (jeu.HUD_vie != NULL)
    {
        SDL_FreeSurface(jeu.HUD_vie);
    }
   
    // Quitte SDL_Mixer et décharge la mémoire
    Mix_CloseAudio();
    Mix_Quit();

    /* Close the font */
    closeFont(font);

    /* Close SDL_TTF */
    TTF_Quit();

    /* Quitte la SDL */
    SDL_Quit();

}

         


    Et voilà, notre lib est maintenant opérationnelle !
    Commençons donc par rajouter une musique de fond à notre jeu !
    Pour cela, je vous ai donc concocté une petite musique de merde de ninja, rien que pour vous !

    Téléchargez-la et enregistrez-la dans un nouveau dossier music situé dans le dossier de notre jeu : Aron.




    Ouah, quelle douce mélopée ! 

    Bon, assez rigoler, nous allons maintenant créer une nouvelle variable : musique dans notre structure jeu pour contenir notre mp3 !


Nom du fichier : structs.h


 /* Structure pour gérer le niveau (à compléter plus tard) */

typedef struct Gestion
{

    SDL_Surface *screen;
    int nombreMonstres;

    //HUD
    SDL_Surface *HUD_vie, *HUD_etoiles;
    int vies, etoiles;
   
    //Sons
    Mix_Music  *musique;

} Gestion;

         


    Voilà, comment se déclare une variable musique avec SDL_mixer, pas bien sorcier, non ?!
    Reste maintenant plus qu'à l'initialiser ! Pour cela, on va créer une fonction loadSong() qui se chargera de ça automatiquement.
    On va la créer dans un nouveau fichier : sounds.c qui s'accompagnera de son en-tête sounds.h (vous devez savoir comment faire maintenant (File / New / Empty File) :


Nom du fichier : sounds.c


 #include "sounds.h"

 void loadSong( char filename[200] )
{

 /* On libère la chanson précédente s'il y en a une */
 if ( jeu.musique != NULL )
 {
    Mix_HaltMusic();
    Mix_FreeMusic(jeu.musique);
 }

 /* On charge la nouvelle chanson */
 jeu.musique = Mix_LoadMUS( filename );
 if (jeu.musique == NULL)
    {
        fprintf(stderr, "Can't read the music \n");
        exit(1);
    }

 /* On active la répétition de la musique à l'infini */
 
     if(Mix_PlayMusic(jeu.musique, -1)==-1)
     {
        printf("Mix_PlayMusic: %s\n", Mix_GetError());
     }


}

         

    Donc cette fonction est extrêmement simple : on lui passe le nom d'une musique. Elle libère le fichier précédent s'il y en a un, charge le nouveau puis active la répétition à l'infini de la musique.

    Reste plus qu'à compléter l'en-tête, comme d'habitude :

Nom du fichier : sounds.h


  #include "structs.h"

  extern Gestion jeu;

         

    Voilà, maintenant, reste plus qu'à appeler cette fonction ! Faisons-le dès l'initialisation de notre jeu !


Nom du fichier : init.c


  void loadGame(void)
{

    /* Charge l'image du fond et le tileset */
    map.background = loadImage("graphics/background.png");
    map.tileSet = loadImage("graphics/tileset.png");
    map.tileSetB = loadImage("graphics/tilesetB.png");

    //On initialise le timer
     map.mapTimer = TIME_BETWEEN_2_FRAMES*3;
     map.tileSetNumber = 0;

    loadMap("map/map1.txt");

    /* On initialise les variables du jeu */
    jeu.vies = 3;
    jeu.etoiles = 0;

    /* On charge le HUD */
    jeu.HUD_vie = loadImage("graphics/life.png");
    jeu.HUD_etoiles = loadImage("graphics/stars.png");

    //On charge la musique
    loadSong("music/RabidjaGo.mp3");

}

         

    Et on met à jour notre en-tête pour que le compilo ne soit pas perdu !


Nom du fichier : init.h


  #include "structs.h"

  /* Prototypes des fonctions utilisées */
  extern SDL_Surface *loadImage(char *name);
  extern void loadMap(char *name);
  extern void closeFont(TTF_Font *font);
  extern TTF_Font *loadFont(char *, int);
  extern void loadSong( char filename[200] );


  extern Gestion jeu;
  extern Map map;
  extern TTF_Font *font;
  extern GameObject player;
  extern GameObject monster[MONSTRES_MAX];

         

    Voilà, si vous compilez maintenant, vous aurez la joie, que dis-je le bonheur, l'extase d'entendre cette superbe mélodie accompagner notre lapin-ninja !
    Whaouh !!!


    Mais, on n'oublie pas quelque chose ?
    Cherchez bien !!
    Mais si, mais si !

    Bingo, on ne libère pas notre musique en quittant le jeu !
    Et ça, c'est MAL !


    Alors, allons-y :

Nom du fichier : init.c


  void cleanup()
{

    int i;

    /* Libère l'image du background */

    if (map.background != NULL)
    {
        SDL_FreeSurface(map.background);
    }


      /* Libère l'image des tilesets */
    if (map.tileSet != NULL)
    {
        SDL_FreeSurface(map.tileSet);
    }
    if (map.tileSetB != NULL)
    {
        SDL_FreeSurface(map.tileSetB);
    }


    /* Libère le sprite du héros */
    if (player.sprite != NULL)
    {
        SDL_FreeSurface(player.sprite);
    }

    /* Libère le sprite des monstres */
    for(i = 0 ; i < MONSTRES_MAX ; i++)
    {
        if (monster[i].sprite != NULL)
    {
        SDL_FreeSurface(monster[i].sprite);
    }
    }



    //Libère le HUD
    if (jeu.HUD_etoiles != NULL)
    {
        SDL_FreeSurface(jeu.HUD_etoiles);
    }
    if (jeu.HUD_vie != NULL)
    {
        SDL_FreeSurface(jeu.HUD_vie);
    }
   
   
    /* On libère la chanson */
    if ( jeu.musique != NULL )
        Mix_FreeMusic(jeu.musique);

    // Quitte SDL_Mixer et décharge la mémoire
    Mix_CloseAudio();
    Mix_Quit();

    /* Close the font */
    closeFont(font);

    /* Close SDL_TTF */
    TTF_Quit();

    /* Quitte la SDL */
    SDL_Quit();

}

         

 
    Bon, voilà qui fait déjà pas mal pour un chapitre !

    Je vais vous laisser vous amuser à composer quelques-unes des plus belles mélodies que la terre ait entendues et les rajouter à votre jeu !

    Et on se retrouve au chapitre suivant pour rajouter des effets sonores !

 
   


   




 

 

 

Connexion

CoalaWeb Traffic

Today58
Yesterday238
This week981
This month459
Total1745358

3/05/24