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"intmain(intargc,char**argv){return0;}
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 :
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.
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:
intinit_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>#endifintinit_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:
intinit_sdl_fmod(){SDL_Surface*ecran;//Pointeur sur la surface de la fenetre//On initialise la SDL en mode vidéoif(SDL_Init(SDL_INIT_VIDEO)==-1){fprintf(stderr,"Erreur d'initialisation de la SDL : %s\n",SDL_GetError());//On écrit l'erreur dans stderrexit(EXIT_FAILURE);}//On initialise une fenetre en résolution 800*600 et 32 bits/pixel avec le mode mémoire vidéo et double bufferingecran=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ôneSDL_WM_SetCaption("Tuto Création RPG",NULL);//on initialise FMOD avec un son de qualité CD(44100 Hz) et 64 canauxif(!FSOUND_Init(44100,64,0)){fprintf(stderr,"Erreur à l'initialisation de FMOD: %s\n",FMOD_ErrorString(FSOUND_GetError()));exit(EXIT_FAILURE);}return0;}
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:
voidfree_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:
voidfree_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"intmain(intargc,char**argv){return0;}intinit_sdl_fmod(){SDL_Surface*ecran;//Pointeur sur la surface de la fenetre//On initialise la SDL en mode vidéoif(SDL_Init(SDL_INIT_VIDEO)==-1){fprintf(stderr,"Erreur d'initialisation de la SDL : %s\n",SDL_GetError());//On écrit l'erreur dans stderrexit(EXIT_FAILURE);}//On initialise une fenetre en résolution 800*600 et 32 bits/pixel avec le mode mémoire vidéo et double bufferingecran=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ôneSDL_WM_SetCaption("Tuto Création RPG",NULL);//on initialise FMOD avec un son de qualité CD(44100 Hz) et 64 canauxif(!FSOUND_Init(44100,64,0)){fprintf(stderr,"Erreur à l'initialisation de FMOD: %s\n",FMOD_ErrorString(FSOUND_GetError()));exit(EXIT_FAILURE);}return0;}voidfree_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>#endifintinit_sdl_fmod();voidfree_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.