16 connectés | 78 discussions | 440 messages | 1380 membres | Jeudi 9 septembre 2010 à 22h20
Rechercher :

Apprendre l'informatique -> Nos tutoriels sur la programmation -> Apprendre à créer vos logiciels-> Créer un RPG en 2D avec la SDL et FMOD en C -> Initialisation des outils nécessaires

Chapitre 3: Initialisation des outils nécessaires




Chapitre 3: Initialisation des outils nécessaires



Dans ce chapitre, on va organisé notre projet, car vous allez voir des fichiers va y en avoir beaucoup, puis on va créer le main et initialiser la SDL et FMOD

Un certain niveau est requis pour comprendre à partir de maintenant le tuto. Voici un cours sur le C fait par un membre du site pour ceux qui ne sont pas encore tout à fait au point : Cours sur le C


Organisation du projet



Rendez-vous dans le dossier de votre projet.
Vous devez y trouver : un dossier bin, un dossier obj, cb.bmp, main.c ( ne vous en faite pas s'il est marqué C++), rpg.cbp, rpg en fichier LAYOUT, et vos deux DLL : sdl.dll et fmod.dll.

Dans un premier temps, vous allez supprimer le fichier cb.bmp. Il ne nous servira à rien.

Deux cas s'offre à vous :
Soit vous savez déjà quels médias vous allez utilisez et dans ce cas : dans le dossier de votre projet, vous allez créer 9 dossiers :

- ai, le dossier contenant toutes les images concernant les boss et toutes les autres choses concernant ce qui est contrôlé par une intelligence artificielle.
- img, le dossier contenant toutes sortes d'images.
- map, le dossier contenant nos cartes.
- musique, le dossier contenant les musiques.
- save, le dossier contenant les sauvegardes de l'utilisateur.
- son, le dossier contenant les effets sonores du jeu.
- sprites, le dossier contenant les animations des coups, les personnages...
- tiles, le dossier contenant les tuiles de notre jeu.
- video, le dossier contenant les vidéos.

C'est quoi les tuiles?

c'est les images qui compose la carte.

Soit si vous n'avez aucune idée des médias que vous allez utiliser, vous pouvez prendre ce pack :Pack de ressource du tuto

Mais à la fin, il faut que votre dossier de votre projet ressemble à çà :


Les dossiers map et save doivent être vide.

Voilà fini, la partie dossier et installation, on peut attaquer la programmation et on commence par le main.

Le main


Maintenant, on passe au chose sérieuse, rendez-vous dans Code::Blocks.
Ouvrez votre projet et allez dans le dossier source puis main.cpp.
Supprimez moi tout çà !

Et mettez simplement ce bout de code :

Code c:
 
/* Fichier main.c : fonction main et initialisation des différentes librairies. */
#include "main.h"
 
int main(int argc, char **argv)
{
  return 0;
}


Comme vous pouvez le constater, j'ai inclus un fichier main.h.

Créer ce nouveau fichier. Veillez à le mettre dans le répertoire du projet.
Ce fichier comprend l'inclusion des libs SDL et FMOD et des libs standard en C.
Vous remarquez que code::blocks affiche le code suivant :

Code c:
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED



#endif


Ce code permet d'éviter les inclusions multiples lors de la compilation du projet.
Entre ces lignes vous allez donc inclure les fichiers : sdl.h, fmod.h et fmod_errors.h, les deux fichiers concernant FMOD sont situé dans le répertoire FMOD.
fmod_errors.h sert à la gestion des erreurs.

Ainsi le fichier main.h devient :
Code c:
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED


#include "sdl.h"
#include "FMOD/fmod.h"
#include "FMOD/fmod_errors.h"

#endif


Il faut maintenant inclure les deux librairies standard : stdio.h et stdlib.h

Finalement, le fichier main.h ressemble à çà :

Code c:
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED


#include "sdl.h"
#include "FMOD/fmod.h"
#include "FMOD/fmod_errors.h"

# include <stdio.h>
# include <stdlib.h>

#endif


Nous avons fini de poser la structure de notre fichier main. Passons à l'initialisation de la SDL et FMOD.

Initialisation de la SDL et de FMOD


Nous allons faire une fonction pour l'initialisation de la SDL et FMOD.
Elle ne prendra aucun argument et sera de type int.

je vais l'appelé init_sdl_fmod. Son prototype a placé dans le fichier main.h est alors :

Code c:
int init_sdl_fmod();


Vous devez placer ce prototype de fonction après le #endif pour finalement avoir ce fichier :
Code c:
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED


#include "sdl.h"
#include "FMOD/fmod.h"
#include "FMOD/fmod_errors.h"

# include <stdio.h>
# include <stdlib.h>

#endif

int init_sdl_fmod();


La fonction est du type int car on va retourner la valeur 0 pour dire que tout c'est bien passé lors de l'initialisation.

Retournons dans notre fichier main.c pour coder la fonction.

Pour initialiser SDL et FMOD, nous devons créer un pointeur sur la surface de la fenêtre, dire quel module de la SDL nous utilisons et donner un titre et des dimensions à la fenetre de notre jeu.
J'ai choisi les dimension 800*600 en mode 32 bits par pixel.
Pour FMOD, j'ai choisi d'initialiser en mettant du son qualité CD donc une valeur de 44100Hz, je prend 64 canaux. La fonction d'initialisation de FMOD : FSOUND_init prend aussi en argument flags : vous mettez 0.

Voici ceux à quoi ressemble la fonction init_sdl_fmod :
Code c:
int init_sdl_fmod()
{
    SDL_Surface *ecran; //Pointeur sur la surface de la fenetre

    //On initialise la SDL en mode vidéo
    if(SDL_Init(SDL_INIT_VIDEO)==-1)
    {
        fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); //On écrit l'erreur dans stderr
        exit(EXIT_FAILURE);
    }

    //On initialise une fenetre en résolution 800*600 et 32 bits/pixel avec le mode mémoire vidéo et double buffering
    ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
    if (ecran == NULL) // Si l'ouverture de la fenetre a échoué, on écrit l'erreur et on arrête le programme
    {
        fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    //On donne un titre et on a pas d'icone donc on met NULL pour l'argument concernant l'icône
    SDL_WM_SetCaption("Tuto Création RPG", NULL);

    //on initialise FMOD avec un son de qualité CD(44100 Hz) et 64 canaux
    if (!FSOUND_Init(44100, 64, 0))
    {
        fprintf(stderr,"Erreur à l'initialisation de FMOD: %s\n", FMOD_ErrorString(FSOUND_GetError()));
        exit(EXIT_FAILURE);
    }


    return 0;

}


Il n'y a rien de particulier à signaler, si ce n'est que j'ai pris en charge la gestion des erreurs.
fprintf est une fonction permettant d'écrire dans un fichier. Elle prend en argument le nom du fichier, et ce que l'on doit y écrire.

Sinon retenir les fonction suivante dans l'initialisation de SDL et FMOD :
SDL_Init qui prend en argument les modules initialisés, ici la vidéo, car pour l'audio on a FMOD.
SDL_SetVideoMode qui prend en argument la résolution le nombre de bits par pixel et les mode.
SDL_WM_SetCaption qui prend en argument le titre de la fenêtre et l'icône.
FSOUND_Init qui prend en argument la qualité du son, le nombre de canaux et le flags.

Il ne nous reste plus qu'a libérer SDL et FMOD à la fin du programme.

La libération de SDL et FMOD



Comme pour l'initialisation, nous allons créer une fonction qui va libérer la mémoire à la fois pour la SDL et pour FMOD.

Je l'appelle free_sdl_fmod().

Son prototype est alors :
Code c:
void free_sdl_fmod();


Pour libérer SDL, la fonction est on ne peut plus simple : SDL_Quit().
Pour libérer FMOD, la fonction est très parlante : FSOUND_Close().

Pour FMOD, il faudra libérer le son à quand on aura fini de s'en servir.


La fonction est alors vite codée :

Code c:
void free_sdl_fmod()
{
     SDL_Quit();
     FMOD_Close();
}


Finalement, votre main.c ressemble à çà :
Code c:
/* Fichier main.c : fonction main et initialisation des différentes librairies. */
#include "main.h"

int main(int argc, char **argv)
{
  return 0;
}

int init_sdl_fmod()
{
    SDL_Surface *ecran; //Pointeur sur la surface de la fenetre

    //On initialise la SDL en mode vidéo
    if(SDL_Init(SDL_INIT_VIDEO)==-1)
    {
        fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); //On écrit l'erreur dans stderr
        exit(EXIT_FAILURE);
    }

    //On initialise une fenetre en résolution 800*600 et 32 bits/pixel avec le mode mémoire vidéo et double buffering
    ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
    if (ecran == NULL) // Si l'ouverture de la fenetre a échoué, on écrit l'erreur et on arrête le programme
    {
        fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
    }

    //On donne un titre et on a pas d'icone donc on met NULL pour l'argument concernant l'icône
    SDL_WM_SetCaption("Tuto Création RPG", NULL);

    //on initialise FMOD avec un son de qualité CD(44100 Hz) et 64 canaux
    if (!FSOUND_Init(44100, 64, 0))
    {
        fprintf(stderr,"Erreur à l'initialisation de FMOD: %s\n", FMOD_ErrorString(FSOUND_GetError()));
        exit(EXIT_FAILURE);
    }


    return 0;

}

void free_sdl_fmod()
{
    SDL_Quit();
    FSOUND_Close();
}


Et votre main.h à ceci :
Code c:
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED


#include "sdl.h"
#include "FMOD/fmod.h"
#include "FMOD/fmod_errors.h"

# include <stdio.h>
# include <stdlib.h>

#endif

int init_sdl_fmod();
void free_sdl_fmod();


Vous pouvez compiler le code, le programme ne fait rien pour l'instant.

Voilà nous avons fini d'initialiser la SDL et FMOD, la partie la plus intéressante commence au prochain chapitre avec la création de map.

précédent sommaire



Commentaire(s) pike71 dit

28/08/2009 à 13h03


Genial, vivement la suite.