Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Concours] Après la console, place à la SDL

Éblouissez-nous !

Sujet résolu
    10 mai 2011 à 16:51:24

    tsunami33> J'ajouterais que le code que tu fournis n'est pas portable. (Utilisation de <windows.h>.)
    shamanas> Bienvenue ! :)
    • Partager sur Facebook
    • Partager sur Twitter
      10 mai 2011 à 17:07:26

      Citation : HomerEro

      Félicitation très imprésionnant j'aime bien ton jeu :)
      J'espère qu'il y aura de la musique
      En tous cas Bravo


      Merci de tes commentaires !
      Normalement, il y aura de la musique, la preuve, j'ai déjà chargé SDL_mixer dans la fonction init(). ^^
      Je viens de résoudre un bug que je n'avais pas décelé avant, et j'ai un peu optimisé le code... Mais il me reste encore deux bugs (dont un vraiment gainant) à résoudre...

      @tsunami33 : Franchement, bravo !
      @shamanas : Ton programme est le premier de ce genre là, merci... Mais tu pourrais un peu mettre en forme ton message (un peu comme les précédants) s'il te plait ? :)
      • Partager sur Facebook
      • Partager sur Twitter
        10 mai 2011 à 17:09:51

        @paraze: ok je vais editer mon post :)
        • Partager sur Facebook
        • Partager sur Twitter
          10 mai 2011 à 17:15:44

          Citation : paraze

          Citation : HomerEro

          Félicitation très imprésionnant j'aime bien ton jeu :)
          J'espère qu'il y aura de la musique
          En tous cas Bravo


          Merci de tes commentaires !
          Normalement, il y aura de la musique, la preuve, j'ai déjà chargé SDL_mixer dans la fonction init(). ^^
          Je viens de résoudre un bug que je n'avais pas décelé avant, et j'ai un peu optimisé le code... Mais il me reste encore deux bugs (dont un vraiment gainant) à résoudre...

          @tsunami33 : Franchement, bravo !
          @shamanas : Ton programme est le premier de ce genre là, merci... Mais tu pourrais un peu mettre en forme ton message (un peu comme les précédants) s'il te plait ? :)



          En effet quand on rajoute une ligne ça fait des trucs bizarre ...
          • Partager sur Facebook
          • Partager sur Twitter
            10 mai 2011 à 17:48:27

            Je sais... mais je suis entrain de corriger ça (tiens, en passant, j'ai réglé le problème du nombre de points qui augmentent moins quand on est entrain de bouger et qu'on touche un bonus de points) !

            shamanas, j'ai vraiment hâte de voir le résultat final.
            Je viens de vous ajouter en tant que participant.
            • Partager sur Facebook
            • Partager sur Twitter
              10 mai 2011 à 17:56:46

              @shamanas : Je peux te aire la version mac si tu veux (et si le code n'est pas illisible). :)
              • Partager sur Facebook
              • Partager sur Twitter
                10 mai 2011 à 17:58:11

                @Pouet_forever:
                Oui merci beaucoup :)
                • Partager sur Facebook
                • Partager sur Twitter
                  10 mai 2011 à 21:30:57

                  Je m'étais trompé, je voulais parler à tsunami33. ^^
                  Je le ferai quand même, ça ne coûte rien, fais moi simplement un code portable. ;)

                  @ tsunami33 : Je ne sais pas comment ton code compile, tu as vraiment n'importe quoi n'importe où, les appels de fonctions erronés, des fuites de mémoire, un appel récursif sur main. o_O
                  Il faudrait penser à rajouter des options de compilation... :-°
                  Ton code NE PEUT PAS compiler correctement...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 mai 2011 à 22:09:33

                    Citation : frank123

                    tsunami33> J'ajouterais que le code que tu fournis n'est pas portable. (Utilisation de <windows.h>.)
                    shamanas> Bienvenue ! :)


                    Oui mais c'est seulement la version console qui sera comme ça. La graphique sera entièrement portable.

                    Citation : Pouet_forever

                    Je m'étais trompé, je voulais parler à tsunami33. ^^
                    Je le ferai quand même, ça ne coûte rien, fais moi simplement un code portable. ;)

                    @ tsunami33 : Je ne sais pas comment ton code compile, tu as vraiment n'importe quoi n'importe où, les appels de fonctions erronés, des fuites de mémoire, un appel récursif sur main. o_O
                    Il faudrait penser à rajouter des options de compilation... :-°
                    Ton code NE PEUT PAS compiler correctement...


                    Oui c'est vrai que c'est un peu le foutoir mon code en console. Au fait ça fait maintenant un moment que je me pose la question, mais pourrais tu m'indiquer comment mettre des options de compilations stp ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    qry = 2b || !2b
                    Anonyme
                      10 mai 2011 à 22:21:44

                      Tu utilise quel IDE ?

                      Citation : paraze

                      Voici la démarche à suivre pour configurer Code::Blocks : Project => Build options => clique en haut à gauche sur le nom de ton projet => onglet "Compiler settings" => sous-onglet "Other options".
                      Ensuite, vous pouvez ajouter les options de compilation souhaitées.
                      Enfin, faites "Régénérer" (Ctrl + F11).

                      Voici la démarche à suivre pour configurer Microsoft Visual C++ : Propriétés du projet => C/C++ => général.
                      Ensuite, vous pouvez mettre le niveau (level) de warning à 4.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 mai 2011 à 23:33:18

                        J'ai travaille sur SDFx. Le code est maintenant beaucoup mieux structure, le programme possede un menu avec des boutons basiques. Il suffit maintenant de creer des classes heritant de Effect pour implementer de nouveaux effets. J'edite mon poste avec le nouveau code.

                        @Pouet_Forever:
                        Le code est totalement portable, ne t'inquietes pas :)

                        Edit: effet de blur termine :D
                        J'edite mon code puis je vais uploader une version windows et linux des binaires + je vais faires des images basiques pour le menu

                        Apparament le blur mene a un segfault sous win32, je vais regler ca puis j'upload l'archive windows
                        Corrige, apparament j'avais oublie deux conditions de bound checking, mais ca marchait encore sur linux :p J'edite les sources et j'uploade l'archive windows

                        Dans le tableau des participants le projet de tsunami est marque comme le mien et le mien comme le sien
                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 mai 2011 à 15:56:29

                          salut,
                          Comme je le disais plus haut, je ne vais pas pouvoir aller plus loin dans mon projet pour le concours, j'ai du laisser tomber le mode défi de mon tetris.
                          le projet est téléchargable ici à compiler en c++ (code::block) histoire d'avoir les fichiers et de le voir fonctionner, sinon voici le code dans son ensemble :

                          les headers :

                          constantes.h :

                          #ifndef CONSTANTES_H_INCLUDED
                          #define CONSTANTES_H_INCLUDED
                          
                          #define TAILLE_BLOCK 30
                          #define BOARDPOS 0
                          #define NB_BLOCK_LARG 10
                          #define NB_BLOCK_HAUT 20
                          #define NEXT_X 245
                          #define NEXT_Y 120
                          #define NB_SKIN 3
                          #define NB_TUNE 5
                          
                          enum {RIEN,BAS,DROITE,GAUCHE,ROT_D,ROT_G};//liste des mouvements
                          enum {TE,EL,LE,CARRE,BARRE,ESS,ZED};//liste des pièces
                          enum {ACT,PREV};
                          
                          struct S_piece
                          {//definition de la structure d'une piece.
                              int type;//forme de la piece
                              int orientation;//orientation de la piece 0,90,180 ou 270°
                              SDL_Surface *carre;//pointeur vers le set de skin qui compose la pièce
                              SDL_Rect decoup;//position de découpe dans le skin set.
                              SDL_Rect pos[4];//position des 4 éléments de la piece.
                          };
                          
                          struct S_input
                          {//définition de la structure d'acquisition des entrées.
                              bool key[SDLK_LAST];//ensemble des touches
                              bool padBt[2][2];//boutons [mémoire][bouton du pad]
                              bool padHat[2][8];//chapeaux [mémoire][index du chapeau]
                              bool mseBt[8];//boutons de souris
                              bool quit;//evenement "croix"
                              unsigned int padRepet;//valeur de répetition (pour le chapeau du pad)
                              unsigned int padRepetActTime;//valeur actuelle pour calcul du repeat chapeau
                              unsigned int btRepet;//valeur de répétition des boutons
                              unsigned int btRepetActTime;//valeur actuelle pour le calcul du repet bt
                          };
                          
                          struct S_infos
                          {//structure d'infos générale
                              bool fullscreen;//mode fullscreen on/off
                              int modeJoueur;//mode de jeu
                              int vitesse;//vitesse du jeu (difficultée)
                              int hauteur;//hauteur de départ
                              int skin;//type de skin
                              int tune;//music
                          };
                          
                          struct S_score
                          {//structure des scores
                              int actBest;//meilleur score du moment
                              char score[10][20];//tableau de char des scores
                          };
                          
                          struct S_control
                          {//structure des moyens de control
                          
                              SDL_Joystick* *joy;//tableau de pointeurs vers les pads branchés
                              int modeControl;//mode de control 0:clavier; 1:pad
                              int numPad;//index du pad utilisé
                              int padBtDroite;//bouton du pad pour rotation droite
                              int padBtGauche;//bouton du pad pour rotation gauche
                              int clavierDroite;//touche clavier pour rotation droite
                              int clavierGauche;//touche clavier pour rotation gauche
                          };
                          
                          struct S_global
                          {//structure globale contenant les pointeurs vers les autres structures
                              S_input *Sinput;
                              S_infos *Sinfos;
                              S_score *Sscore;
                              S_control *Scontrol;
                          };
                          
                          struct S_temp
                          {//structure temporaire
                              int padNum;
                              int skinNum;
                              int tuneNum;
                              int control;
                              int btDroit;
                              int btGauc;
                              int clavDroit;
                              int clavGauc;
                          };
                          
                          
                          #endif // CONSTANTES_H_INCLUDED
                          



                          jeu.h
                          #ifndef JEU_H_INCLUDED
                          #define JEU_H_INCLUDED
                          
                          //le jeu.
                          int jeu(SDL_Surface *ecran, S_global *Sglobal);
                          #endif // JEU_H_INCLUDED
                          


                          inputs.h :
                          #ifndef INPUTS_H_INCLUDED
                          #define INPUTS_H_INCLUDED
                          
                          //init e la structure des entrées.
                          void init_input(struct S_input* Sinput);
                          
                          //capture des entrées.
                          void get_input(struct S_global *Sglobal);
                          
                          //capture des controles.
                          int saisie_cfg(SDL_Surface *ecran,S_temp *Stemp);
                          
                          #endif // INPUTS_H_INCLUDED
                          


                          jeu_fnctns.h :
                          #ifndef JEU_FNCTNS_H_INCLUDED
                          #define JEU_FNCTNS_H_INCLUDED
                          
                          //initialisation des pieces.
                          void init_piece(S_piece *Spiece,SDL_Surface *bloc,const int forme);
                          
                          //test de faisabilité du mouvement.
                          int test_Mvt(S_piece *Spiece, const bool tableau[NB_BLOCK_LARG][NB_BLOCK_HAUT],const int direction);
                          
                          //déplacement de la piece.
                          void bouger(SDL_Surface *ecran, S_piece *Spiece, int direction);
                          
                          //fixer la piece dans la matrice.
                          int fixer(S_piece *Spiece, bool tableau[NB_BLOCK_LARG][NB_BLOCK_HAUT]);
                          
                          //test des lignes pleines.
                          int test_ligne (bool tableau[NB_BLOCK_LARG][NB_BLOCK_HAUT]);
                          
                          //suppression et décalage des lignes.
                          void decalage(SDL_Surface *ecran, bool tableau[NB_BLOCK_LARG][NB_BLOCK_HAUT], int ligne);
                          
                          //affichage de la piece suivante.
                          void disp_next(SDL_Surface *ecran, S_piece *Spiece);
                          
                          //affichage de texte
                          void disp_texte(SDL_Surface *ecran, char texte[], TTF_Font* police, SDL_Rect* position);
                          
                          //animation Game over
                          void game_over(SDL_Surface* ecran, TTF_Font *police);
                          
                          #endif // JEU_FNCTNS_H_INCLUDED
                          


                          menu.h :
                          #ifndef MENU_H_INCLUDED
                          #define MENU_H_INCLUDED
                          
                          int menu_principal (SDL_Surface *ecran, S_global *Sglobal);
                          
                          int menu_scores (SDL_Surface *ecran, S_global *Sglobal);
                          
                          int menu_options (SDL_Surface *ecran, S_global *Sglobal);
                          
                          int menu_best(SDL_Surface *ecran,S_global *Sglobal,int score);
                          
                          #endif // MENU_H_INCLUDED
                          


                          fichier.h:
                          #ifndef FICHIER_H_INCLUDED
                          #define FICHIER_H_INCLUDED
                          
                          //initialisation de la structure maitre
                          void init_global(S_global *Sglobal);
                          
                          //libération de la mémoire allouée
                          void libere_global_mem(S_global *Sglobal);
                          
                          //initialisation de la structure d'infos
                          void init_infos(S_infos *Sinfos);
                          
                          //initialisation de la structure de control
                          void init_control(S_control *Scontrol);
                          
                          //lecture du fichier des controls
                          int lire_control(struct S_global *Sglobal);
                          
                          //ecriture du fichier des controls
                          int ecrire_control(struct S_global *Sglobal);
                          
                          //lecture du fichier des scores
                          int lire_score(struct S_score *Sscore);
                          
                          //ecriture du fichier des scores
                          int ecrire_score(struct S_score *Sscore);
                          
                          //initialisation des scores
                          int init_score(struct S_score *Sscore);
                          
                          //attribution des pads branchés
                          void pad_set (S_control *control);
                          
                          //libération des pads branchés
                          void pad_reset (S_control *Scontrol);
                          
                          //aide au placement du curseur dans le fichier
                          int placerCurs(FILE *fichier, int ligne);
                          
                          //placement du score
                          int compare_score(int score, S_score *Sscore);
                          
                          //convertion char en int
                          int char_to_int(const char text[]);
                          
                          //placer le nouveau record
                          void save_record(S_score *Sscore,char nom[],int rank,int score);
                          
                          //passage plein encran
                          void switch_screen(SDL_Surface *ecran,S_global *Sglobal);
                          
                          //transformation des erreurs FSOUND en text
                          char *FSOUND_Err(int valeur);
                          
                          #endif // FICHIER_H_INCLUDED
                          


                          main.cpp :

                          #include <iostream>
                          #include <SDL/SDL.h>
                          #include <SDL/fmod.h>
                          #include <SDL/SDL_ttf.h>
                          #include "constantes.h"
                          #include "inputs.h"
                          #include "jeu.h"
                          #include "fichier.h"
                          #include "menu.h"
                          
                          
                          int main ( int argc, char** argv )
                          {//**** VALIDE ****
                              (void) argc;
                              (void) argv;
                          
                              /***** Déclaration variables et initialisation*****/
                          
                              bool fin=false;//maintien de boucle.
                          
                          
                              //initialisation de la SDL.
                              if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0 )
                              {//gestion d'erreur
                                  printf( "MAIN / Err init SDL: %s\n", SDL_GetError());
                                  exit(EXIT_FAILURE);
                              }
                          
                          
                              //création de l'icone de fenetre.
                              SDL_WM_SetIcon(SDL_LoadBMP("pics/icone.bmp"),NULL);
                          
                          
                              //initialisation de TTF.
                              if (TTF_Init()<0)
                              {//gestion de l'erreur.
                                  printf("JEU / Err init TTF:%s\n",TTF_GetError());
                                  exit(EXIT_FAILURE);
                              }
                          
                          
                              //intitialisation de FSOUND.
                              if (FSOUND_Init(44100,32,0)<0)
                              {//Gestion de l'erreur.
                                  printf("Err init FSOUND :%s\n",FSOUND_Err(FSOUND_GetError()));
                                  exit(EXIT_FAILURE);
                              }
                          
                          
                              //creation de la fenetre.
                              SDL_Surface* ecran = SDL_SetVideoMode(TAILLE_BLOCK*NB_BLOCK_LARG+240, TAILLE_BLOCK*NB_BLOCK_HAUT, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
                          
                              if (ecran==NULL)
                              {//defaut de creation de la fenetre.
                                  printf("MAIN / Err init fenetre %s\n", SDL_GetError());
                                  exit(EXIT_FAILURE);
                              }
                          
                          
                              // nom de la fenetre
                              SDL_WM_SetCaption("Tetris_TE",NULL);
                          
                          
                              //creation de la structure globale.
                              S_global Sglobal;
                          
                          
                              //initialisation de la structure globale.
                              init_global(&Sglobal);
                          
                              //initialisation des infos.
                              init_infos(Sglobal.Sinfos);
                          
                          
                              //lecture du fichier de control.
                              if (!lire_control(&Sglobal))
                              {//gestion d'erreur.
                                  printf("Err initialisation des controles, application des parametres par defaut\n");
                                  init_control(Sglobal.Scontrol);
                              }
                          
                          
                              if (SDL_NumJoysticks())
                              {//affectation des pads présents.
                          
                                  //activation du pad.
                                  SDL_JoystickEventState(SDL_ENABLE);
                          
                                  //attribution des pads branchés.
                                  pad_set(Sglobal.Scontrol);
                          
                                  //réattribution de l'index du pad si celui du fichier
                                  //a un index superieur au nombre de pad branchés.
                                  if (SDL_NumJoysticks()<Sglobal.Scontrol->numPad)
                                      Sglobal.Scontrol->numPad=0;
                              }
                              else
                              {//forçage clavier
                                  Sglobal.Scontrol->joy=NULL;
                                  Sglobal.Scontrol->modeControl=0;
                              }
                          
                          
                              //init du random.
                              srand(time(NULL));
                          
                          
                              /***** Boucle principale *****/
                          
                              while(! fin)
                              {//boucle principale
                          
                                  switch (menu_principal(ecran, &Sglobal))
                                  {//branches menu
                                      case 1://lancement du jeu
                                          if (! jeu(ecran,&Sglobal))
                                          {
                                              fin=true;
                                          }
                                      break;
                          
                                      case 2://lancement des options
                                          if (! menu_options(ecran,&Sglobal))
                                          {
                                              fin=true;
                                          }
                                      break;
                          
                                      case 3://lancement de la pages des scores
                          
                                          if (! menu_scores(ecran,&Sglobal))
                                          {
                                              fin=true;
                                          }
                                      break;
                          
                                      default://sortie
                                          fin=true;
                                      break;
                                  }
                              }
                          
                              /***** Sortie *****/
                          
                              //sauvegarde des controles
                              ecrire_control(&Sglobal);
                          
                              //fermeture des pads
                              if (Sglobal.Scontrol->joy!=NULL)
                                  pad_reset (Sglobal.Scontrol);
                          
                              //libérations mémoire
                              libere_global_mem(&Sglobal);
                              SDL_FreeSurface(ecran);
                              FSOUND_Close();
                              TTF_Quit();
                              SDL_Quit();
                          
                              exit(EXIT_SUCCESS);
                          }
                          



                          menu.cpp :

                          #include <iostream>
                          #include <SDL/SDL.h>
                          #include <SDL/fmod.h>
                          #include <SDL/SDL_ttf.h>
                          #include <SDL/SDL_image.h>
                          #include <SDL/SDL_rotozoom.h>
                          #include "constantes.h"
                          #include "inputs.h"
                          #include "fichier.h"
                          
                          
                          int menu_principal(SDL_Surface *ecran, S_global *Sglobal)
                          {//menu principal ***VALIDE***
                          
                              /***** Déclarations *****/
                          
                              //recupération des pointeurs vers les stuctures utiles à la fonction
                              //pour faciliter la lecture du code:
                              S_input *Sinput=Sglobal->Sinput;
                          
                              //init des entrées
                              init_input(Sinput);
                          
                          
                              bool fin=false;//bit de maintien de boucle
                              int retour=1;//valeur de retour de la fonction
                          
                          //SDL
                          
                              SDL_Surface *surf_Menu=NULL;
                              SDL_Surface *surf_Select=NULL;
                          
                              SDL_Rect MenuPos,//position du menu.
                                      SelectPos;//position de la fleche de selection.
                          
                              //image menu
                              if ((surf_Menu=SDL_LoadBMP("pics/menu.bmp"))==NULL)
                              {//gestion de l'erreur
                                  printf("Err chargement de menu.bmp :%s\n",SDL_GetError());
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//rect du menu.
                                  MenuPos.x=MenuPos.y=0;
                                  MenuPos.h=surf_Menu->h;
                                  MenuPos.w=surf_Menu->w;
                              }
                          
                          
                              //fleche de selection
                              if ((surf_Select=SDL_LoadBMP("pics/select.bmp"))==NULL)
                              {//gestion de l'erreur
                                  printf("Err chargement de select.bmp :%s\n",SDL_GetError());
                                  SDL_FreeSurface(surf_Menu);
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//rect de la fleche de selection.
                                  SelectPos.x=160;
                                  SelectPos.y=285;
                                  SelectPos.h=surf_Select->h;
                                  SelectPos.w=surf_Select->w;
                              }
                          
                          
                              SDL_SetColorKey(surf_Select, SDL_SRCCOLORKEY, SDL_MapRGB(surf_Select->format, 125, 125, 125));
                          
                              //application du menu à l'ecran
                              SDL_BlitSurface(surf_Menu,NULL,ecran,&MenuPos);
                          
                              //application de la fleche de selection
                              SDL_BlitSurface(surf_Select,NULL,ecran,&SelectPos);
                          
                              //rafraichissement ecran
                              SDL_Flip(ecran);
                          
                              /***** Boucle principale *****/
                          
                              while (! fin)
                              {//boucle principale
                          
                                  get_input(Sglobal);//actualisation des saisies
                          
                                  if(Sinput->key[SDLK_F1])
                                  {//fullscreen
                                      switch_screen(ecran,Sglobal);
                          
                                      //application du menu à l'ecran
                                      SDL_BlitSurface(surf_Menu,NULL,ecran,&MenuPos);
                          
                                      //application de la fleche de selection
                                      SDL_BlitSurface(surf_Select,NULL,ecran,&SelectPos);
                          
                                      //rafraichissement ecran
                                      SDL_Flip(ecran);
                          
                                      Sinput->key[SDLK_F1]=false;
                                  }
                          
                                  if (Sinput->key[SDLK_1])
                                  {//jeu
                                      retour=1;
                                      fin=true;
                                  }
                          
                                  if(Sinput->key[SDLK_2])
                                  {//options
                                      retour=2;
                                      fin=true;
                                  }
                          
                                  if(Sinput->key[SDLK_3])
                                  {//scores
                                      retour=3;
                                      fin=true;
                                  }
                          
                                  if(Sinput->key[SDLK_4] || Sinput->quit)
                                  {//sortie
                                      retour=0;
                                      fin=true;
                                  }
                          
                                  if (Sinput->key[SDLK_RETURN] || Sinput->padBt[ACT][0])
                                  {//envoie de la valeur du choix
                                      Sinput->key[SDLK_RETURN]=Sinput->padBt[ACT][0]=Sinput->padBt[PREV][0]=false;
                                      fin=true;
                                  }
                          
                                  if ((Sinput->key[SDLK_DOWN] || Sinput->padHat[ACT][SDL_HAT_DOWN])
                                      && retour<4)
                                  {//si haut, monter la fleche
                                      SDL_FillRect(ecran,&SelectPos,SDL_MapRGB(ecran->format,0,0,0));//suppression de la fleche
                                      SelectPos.y+=50;
                                      SDL_BlitSurface(surf_Select,NULL,ecran,&SelectPos);//application de la fleche
                          
                                      Sinput->key[SDLK_DOWN]=Sinput->padHat[ACT][SDL_HAT_DOWN]=false;
                                      retour++;
                          
                                      SDL_Flip(ecran);
                                  }
                          
                                  else if ((Sinput->key[SDLK_UP] || Sinput->padHat[ACT][SDL_HAT_UP])
                                      && retour>1)
                                  {//si bas, descendre la fleche
                                      SDL_FillRect(ecran,&SelectPos,SDL_MapRGB(ecran->format,0,0,0));//suppression de la fleche
                                      SelectPos.y-=50;
                                      SDL_BlitSurface(surf_Select,NULL,ecran,&SelectPos);//application de la fleche
                          
                                      Sinput->key[SDLK_UP]=Sinput->padHat[ACT][SDL_HAT_UP]=false;
                                      retour--;
                          
                                      SDL_Flip(ecran);
                                  }
                          
                                  else
                                  {//par défaut reseter les entrées inutiles
                                      Sinput->key[SDLK_DOWN]=Sinput->key[SDLK_UP]=false;
                                      Sinput->padHat[ACT][SDL_HAT_UP]=Sinput->padHat[ACT][SDL_HAT_DOWN]=false;
                                  }
                          
                          
                              }
                          
                              /***** Sortie *****/
                          
                              SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));//ecran noir
                          
                              SDL_Flip(ecran);
                          
                              //libération de la mémoire
                              SDL_FreeSurface(surf_Menu);
                              SDL_FreeSurface(surf_Select);
                          
                              return(retour);
                          }
                          
                          
                          int menu_scores (SDL_Surface *ecran,S_global *Sglobal)
                          {//liste les meilleurs scores ***VALIDE*** probleme fullscreen
                          
                              /***** Declarations *****/
                          
                              int i=0, j=0, //temporaires de boucles.
                                  retour=1;//valeur du retour.
                          
                              bool fin=false;//bit de maintien de boucle.
                          
                              char tampon[25];//texte filtré (notament la suppression du '\n').
                          
                              init_input(Sglobal->Sinput);//initialisation des entrées
                          
                              if (!lire_score(Sglobal->Sscore))//lecture du fichier des scores
                                      init_score(Sglobal->Sscore);
                          
                          
                          //SDL
                          
                              SDL_Surface *surf_text=NULL;//surface des textes.
                          
                              SDL_Color colorTxt={255,255,255,0};//couleur du text.
                          
                              //rect du text.
                              SDL_Rect textPos;
                          
                          
                          //TTF
                          
                              //chargement de la police.
                              TTF_Font *police=TTF_OpenFont("font/comic.ttf",30);
                          
                              if(police==NULL)
                              {//gestion de l'erreur.
                                  printf("Err chargement de la police de characteres : %s\n",TTF_GetError());
                                  return (0);
                              }
                              else
                              {
                                  TTF_SetFontStyle(police,TTF_STYLE_NORMAL);
                              }
                          
                          
                              /***** Preliminaires *****/
                          
                              textPos.x=150;
                              textPos.y=5;
                          
                              if((surf_text=TTF_RenderText_Solid(police,"Meilleurs scores :",colorTxt))==NULL)
                              {//gestion de l'erreur
                                  printf("Err création text du score : %s\n",SDL_GetError());
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//MAJ du positionnement du text.
                                  SDL_BlitSurface(surf_text,NULL,ecran,&textPos);
                                  SDL_FreeSurface(surf_text);
                              }
                          
                              textPos.x=180;
                              textPos.y=30;
                          
                              for (i=0;i<10;i++)
                              {//création des surfaces de text.
                          
                                  j=0;
                                  sprintf(tampon,"%d:  ",i+1);
                          
                                  while ((Sglobal->Sscore->score[i][j])!='\n' && j<20)
                                  {//nettoyage de la chaine.
                                      tampon[j+4]=Sglobal->Sscore->score[i][j];
                                      j++;
                                  }
                                  tampon[j+4]=Sglobal->Sscore->score[i][j]='\0';
                          
                          
                                  if((surf_text=TTF_RenderText_Solid(police,tampon,colorTxt))==NULL)
                                  {//gestion de l'erreur
                                      printf("Err création text du score : %s\n",SDL_GetError());
                                      fin=true;
                                      retour=0;
                                  }
                                  else
                                  {//MAJ du positionnement du text.
                                  textPos.w=surf_text->w;
                                  textPos.h=surf_text->h;
                                  textPos.y+=50;
                                  }
                          
                                  //application du text.
                                  SDL_BlitSurface(surf_text,NULL,ecran,&textPos);
                          
                          
                                  //suppression de la surface.
                                  SDL_FreeSurface(surf_text);
                              }
                          
                              SDL_Flip(ecran);
                          
                          
                              /***** Boucle D'attente *****/
                          
                              while(! fin)
                              {//attente d'une action utilisateur.
                                  get_input(Sglobal);
                          
                                  if (Sglobal->Sinput->padBt[ACT][1] || Sglobal->Sinput->key[SDLK_ESCAPE])
                                      fin=true;
                          
                                  if (Sglobal->Sinput->quit)
                                  {//sortie du prgm.
                                      retour=0;
                                      fin=true;
                                  }
                          
                              }
                          
                              /**** Sortie *****/
                          
                              TTF_CloseFont(police);
                              return(retour);
                          }
                          
                          
                          int menu_options (SDL_Surface *ecran, S_global *Sglobal)
                          {//options ***VALIDE***
                          
                              /****** recupération des variables *******/
                          
                              S_input *Sinput=Sglobal->Sinput;
                          
                              S_temp Stemp;
                          
                              Stemp.padNum=Sglobal->Scontrol->numPad;//copie.
                              Stemp.skinNum=Sglobal->Sinfos->skin;//copie.
                              Stemp.tuneNum=Sglobal->Sinfos->tune;//copie.
                              Stemp.control=Sglobal->Scontrol->modeControl;//copie
                              Stemp.btDroit=Sglobal->Scontrol->padBtDroite;//copie
                              Stemp.btGauc=Sglobal->Scontrol->padBtGauche;//copie
                              Stemp.clavDroit=Sglobal->Scontrol->clavierDroite;//copie
                              Stemp.clavGauc=Sglobal->Scontrol->clavierGauche;//copie
                          
                          
                              /***** déclaration des variables ******/
                          
                          
                              bool fin=false;//fin de boucle.
                          
                              int i=0,//temporaire.
                                  selection=0, //index de ligne.
                                  increment=0, //sens de selection.
                                  retour=1; //valeur du return.
                          
                          
                              char padName[25],//nom du pad.
                                  skinFile[20],//nom du fichier du skin.
                                  musicFile[20],//nom du fichier de musique.
                                  tuneName[20],//nom de la musique.
                                  touches[10];//touches affectées.
                          
                          
                          //SDL
                          
                              SDL_Color colorTxt={255,255,255,0};//couleur du text (blanc).
                          
                              SDL_Surface *surf_padName=NULL,//surface nom du pad.
                                          *surf_musicName=NULL,//surface nom de la musique.
                                          *surf_option=NULL,//surface image de fond.
                                          *surf_select=NULL,//fleche de selection.
                                          *surf_skin=NULL,//skin.
                                          *surf_modCtrl[2]={NULL},//images du type de control.
                                          *surf_touches=NULL;//images des affectations.
                          
                              SDL_Rect optPos,//position d'affichage de l'image de fond.
                                      selectPos,//position d'affichage de la fleche de sélection.
                                      modPos,//position d'affichage du mode de controle.
                                      skinPos,//position d'affichage du skin.
                                      padTxtPos,//position d'affichage du nom du pad.
                                      musicTxtPos,//position d'affichage du nom de la musique.
                                      touchesPos;//position du text affectation.
                          
                          
                          //TTF
                          
                              TTF_Font *police=NULL;//police.
                          
                          //FMOD
                          
                              FMUSIC_MODULE *tune=NULL;//musique.
                          
                              /***** Initialisation des variables *******/
                          
                              //initialisation des controles.
                              init_input(Sinput);
                          
                          
                              //init de padName.
                              if (Stemp.control==1)
                                  sprintf(padName,SDL_JoystickName(Stemp.padNum));
                              else
                                  sprintf(padName,"clavier");
                          
                          
                              //init de skinFile.
                              sprintf(skinFile,"pics/skin%d.bmp",Stemp.skinNum);
                          
                          
                              if (Stemp.tuneNum)
                              {
                                  //init de musicFile.
                                  sprintf(musicFile,"sounds/tune%d.mod",Stemp.tuneNum);
                          
                          
                                  //Chargement de la musique.
                                  if ((tune=FMUSIC_LoadSong(musicFile))==NULL)
                                  {//gestion de l'erreur
                                      printf("Err / chargement musique : %s\n",FSOUND_Err(FSOUND_GetError()));
                                      fin=true;
                                  }
                                  else
                                  {//lancement de la musique.
                                      FMUSIC_SetLooping(tune,true);
                                      FMUSIC_PlaySong(tune);
                                      sprintf(tuneName,FMUSIC_GetName(tune));
                                  }
                              }
                              else
                              {
                                  tune=NULL;
                                  sprintf(tuneName,"Aucune");
                              }
                          
                          
                          
                          
                          
                              //chargement de la police.
                              police=TTF_OpenFont("font/comic.ttf",20);
                          
                          
                              if(police==NULL)
                              {//gestion de l'erreur.
                                  printf("Err chargement de la police de characteres : %s\n",TTF_GetError());
                                  fin=true;
                                  retour=0;
                              }
                              else
                                  TTF_SetFontStyle(police,TTF_STYLE_NORMAL);
                          
                          
                              //surf_padName.
                              if ((surf_padName=TTF_RenderText_Solid(police,padName,colorTxt))==NULL)
                              {//gestion de l'erreur.
                                  printf("option / Err de création de surf_padName :%s\n",SDL_GetError());
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//rect du nom du pad.
                                  padTxtPos.x=200;
                                  padTxtPos.y=202;
                                  padTxtPos.h=surf_padName->h;
                                  padTxtPos.w=surf_padName->w;
                              }
                          
                          
                              //surf_musicName.
                              if ((surf_musicName=TTF_RenderText_Solid(police,tuneName,colorTxt))==NULL)
                              {//gestion de l'erreur
                                  printf("option / Err de création de surf_musicName :%s\n",TTF_GetError());
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//rect du nom du music.
                                  musicTxtPos.x=155;
                                  musicTxtPos.y=352;
                                  musicTxtPos.h=surf_musicName->h;
                                  musicTxtPos.w=surf_musicName->w;
                              }
                          
                          
                              //surf_option.
                              if((surf_option=SDL_LoadBMP("pics/options.bmp"))==NULL)
                              {//gestion de l'erreur.
                                  printf("Err de chargement de options.bmp :%s\n",SDL_GetError());
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//rect du menu.
                                  optPos.x=optPos.y=0;
                                  optPos.h=surf_option->h;
                                  optPos.w=surf_option->w;
                              }
                          
                          
                              //surf_select.
                              if ((surf_select=SDL_LoadBMP("pics/select.bmp"))==NULL)
                              {//gestion de l'erreur
                                  printf("Err de chargement de select bmp :%s\n",SDL_GetError());
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//rect de la fleche de selection
                                  selectPos.x=5;
                                  selectPos.y=205;
                                  selectPos.h=surf_select->h;
                                  selectPos.w=surf_select->w;
                              }
                          
                          
                              //suppression du gris de la fleche de selection.
                              SDL_SetColorKey(surf_select,SDL_SRCCOLORKEY,SDL_MapRGB(surf_select->format, 125, 125, 125));
                          
                          
                              //surf_modCtrl[1].
                              if ((surf_modCtrl[1]=IMG_Load("pics/joystick.jpeg"))==NULL)
                              {//gestion de l'erreur.
                                  printf("Err de chargement de joystick.jpeg :%s\n",SDL_GetError());
                                  fin=true;
                                  retour=0;
                              }
                          
                          
                              //surf_modCtrl[0].
                              if ((surf_modCtrl[0]=IMG_Load("pics/clavier.jpeg"))==NULL)
                              {//gestion de l'erreur.
                                  printf("Err de chargement de clavier.jpeg :%s\n",SDL_GetError());
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//rect de l'image controle.
                                  modPos.x=150;
                                  modPos.y=205;
                                  modPos.h=modPos.w=30;
                              }
                          
                          
                              //surf_skin.
                              if ((surf_skin=SDL_LoadBMP(skinFile))==NULL)
                              {//gestion de l'erreur.
                                  printf("Err de chargement du skinset :%s\n",SDL_GetError());
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//rect des skins.
                                  skinPos.x=150;
                                  skinPos.y=300;
                                  skinPos.h=surf_skin->h;
                                  skinPos.w=surf_skin->w;
                              }
                          
                          
                              /****** Boucle Principale *******/
                          
                              while (!fin)
                              {//boucle principale
                          
                                  get_input(Sglobal);//actualisation des saisies
                          
                                  if (Sinput->quit)
                                  {//quitter le programme
                                      retour=0;
                                      fin=true;
                                  }
                          
                                  if(Sinput->key[SDLK_F1])
                                  {//fullscreen
                                      switch_screen(ecran,Sglobal);
                                      Sglobal->Sinput->key[SDLK_F1]=false;
                                  }
                          
                                  if (Sinput->key[SDLK_ESCAPE] || Sinput->padBt[ACT][1])
                                  {//echap
                                      Sinput->key[SDLK_ESCAPE]=Sinput->padBt[ACT][1]=Sinput->padBt[PREV][1]=false;
                                      fin=true;
                                  }
                          
                                  if ((Sinput->key[SDLK_DOWN] || Sinput->padHat[ACT][SDL_HAT_DOWN]) && selection<5)
                                  {//si haut, monter la fleche
                          
                                      selection++;
                          
                                      if (selection<4)
                                          selectPos.y+=50;
                                      else if (selection==4)
                                      {
                                          selectPos.y+=100;
                                          selectPos.x=150;
                                      }
                                      else
                                      {
                                          selectPos.y+=50;
                                          selectPos.x=90;
                                      }
                          
                                      SDL_BlitSurface(surf_select,NULL,ecran,&selectPos);//application de la fleche
                          
                                      Sinput->key[SDLK_DOWN]=Sinput->padHat[ACT][SDL_HAT_DOWN]=false;
                          
                                      SDL_Flip(ecran);
                                  }
                          
                                  else if ((Sinput->key[SDLK_UP] || Sinput->padHat[ACT][SDL_HAT_UP]) && selection>0)
                                  {//si bas, descendre la fleche
                                      selection--;
                          
                                      if (selection<3)
                                      {//positionnement fleche
                                          selectPos.y-=50;
                                      }
                                      else if (selection==4)
                                      {
                                          selectPos.y-=50;
                                          selectPos.x=150;
                                      }
                                      else
                                      {
                                          selectPos.y-=100;
                                          selectPos.x=5;
                                      }
                          
                                      Sinput->key[SDLK_UP]=Sinput->padHat[ACT][SDL_HAT_UP]=false;
                                  }
                          
                                  else
                                  {//par défaut reseter les entrées inutiles
                                      Sinput->key[SDLK_DOWN]=Sinput->key[SDLK_UP]=false;
                                      Sinput->padHat[ACT][SDL_HAT_UP]=Sinput->padHat[ACT][SDL_HAT_DOWN]=false;
                          
                                      if (selection==0 || selection==2 || selection==3)
                                          Sinput->key[SDLK_RETURN]=false;
                                  }
                          
                                  if (Sinput->key[SDLK_LEFT] || Sinput->padHat[ACT][SDL_HAT_LEFT])
                                  {//a gauche
                                      increment=-1;
                                      Sinput->key[SDLK_LEFT]=Sinput->padHat[ACT][SDL_HAT_LEFT]=0;
                                  }
                          
                                  if (Sinput->key[SDLK_RIGHT] || Sinput->padHat[ACT][SDL_HAT_RIGHT])
                                  {//à droite
                                      increment=1;
                                      Sinput->key[SDLK_RIGHT]=Sinput->padHat[ACT][SDL_HAT_RIGHT]=0;
                                  }
                          
                                  switch(Stemp.control)
                                  {//affichage des touches de control
                                      case 0:
                                      {
                                          sprintf(touches,"%c et %c",Stemp.clavDroit,Stemp.clavGauc);
                                      }
                                      break;
                          
                                      case 1:
                                      {
                                          sprintf(touches,"%d et %d",Stemp.btDroit,Stemp.btGauc);
                                      }
                                      break;
                          
                                      default:
                                      {
                                          Stemp.control=0;
                                      }
                                      break;
                                  }
                          
                                  if ((surf_touches=TTF_RenderText_Solid(police,touches,colorTxt))==NULL)
                                  {//gestion de l'erreur
                                      printf("option / Err de création de surf_touches :%s\n",TTF_GetError());
                                      fin=true;
                                      retour=0;
                                  }
                                  else
                                  {
                                      touchesPos.x=160;
                                      touchesPos.y=250;
                                      touchesPos.w=surf_touches->w;
                                      touchesPos.h=surf_touches->h;
                                  }
                          
                          
                          
                                  switch(selection)
                                  {//action selon ligne
                                      case 0:
                                      {// ligne 0 mode de control.
                                          if (increment)
                                          {
                                              switch (Stemp.control)
                                              {
                                                  case 0 :
                                                  {//clavier->pad
                          
                                                      if(SDL_NumJoysticks())
                                                      {
                                                          Stemp.control=1;
                          
                                                          if (increment>0)
                                                              Stemp.padNum=0;
                                                          else
                                                              Stemp.padNum=SDL_NumJoysticks()-1;
                          
                                                          SDL_FreeSurface(surf_padName);
                          
                                                          sprintf(padName,SDL_JoystickName(Stemp.padNum));
                          
                                                          if ((surf_padName=TTF_RenderText_Solid(police,padName,colorTxt))==NULL)
                                                          {//gestion de l'erreur
                                                              printf("option / Err de création de surf_padName :%s\n",TTF_GetError());
                                                              fin=true;
                                                              retour=0;
                                                          }
                                                      }
                                                  }
                                                  break;
                          
                                                  case 1 :
                                                  {//scan des pad -> clavier
                                                      if ((Stemp.padNum+increment>=0) && ((Stemp.padNum+increment)<SDL_NumJoysticks()))
                                                      {
                                                          Stemp.padNum=Stemp.padNum+increment;
                                                          sprintf(padName,SDL_JoystickName(Stemp.padNum));
                                                      }
                                                      else
                                                      {
                                                          Stemp.control=Stemp.padNum=0;
                                                          sprintf(padName,"clavier");
                                                      }
                          
                                                      SDL_FreeSurface(surf_padName);
                          
                                                      if ((surf_padName=TTF_RenderText_Solid(police,padName,colorTxt))==NULL)
                                                      {//gestion de l'erreur
                                                          printf("option / Err de création de surf_padName :%s\n",TTF_GetError());
                                                          fin=true;
                                                          retour=0;
                                                      }
                                                  }
                                                  break;
                                              }
                                          }
                                      }
                                      break;
                          
                                      case 1:
                                      {//ligne 1 choix des controles.
                          
                                          switch (Stemp.control)
                                          {
                                              case 0:
                                              {
                                                  if(Sinput->key[SDLK_RETURN])
                                                  {
                                                      if (!saisie_cfg(ecran,&Stemp))
                                                      {
                                                          retour=0;
                                                          fin=true;
                                                      }
                          
                                                      Sinput->key[SDLK_RETURN]=false;
                                                  }
                                              }
                                              break;
                          
                                              case 1:
                                              {
                                                  if(Sinput->padBt[ACT][0])
                                                  {
                                                      if (!saisie_cfg(ecran,&Stemp))
                                                      {
                                                          retour=0;
                                                          fin=true;
                                                      }
                          
                                                  Sinput->padBt[ACT][0]=Sinput->padBt[PREV][0]=false;
                                                  }
                                              }
                                              break;
                          
                                              default:
                                              break;
                                          }
                                      }
                                      break;
                          
                                      case 2:
                                      {//ligne 2 skin.
                          
                                          if (increment)
                                          {
                                              SDL_FreeSurface(surf_skin);
                          
                                              if(Stemp.skinNum+increment<0)
                                                  Stemp.skinNum=NB_SKIN-1;
                                              else if (Stemp.skinNum+increment>NB_SKIN-1)
                                                  Stemp.skinNum=0;
                                              else
                                                  Stemp.skinNum+=increment;
                          
                                              sprintf(musicFile,"pics/skin%d.bmp",Stemp.skinNum);
                          
                                              if ((surf_skin=SDL_LoadBMP(musicFile))==NULL)
                                              {//gestion de l'erreur
                                                  printf("Err de chargement du skinset :%s\n",SDL_GetError());
                                                  fin=true;
                                                  retour=0;
                                              }
                                          }
                                      }
                                      break;
                          
                                      case 3:
                                      {//ligne 3 musiques.
                          
                                          if (increment)
                                          {//selection droite / gauche
                                              FMUSIC_StopSong(tune);
                                              FMUSIC_FreeSong(tune);
                          
                          
                                              if(Stemp.tuneNum+increment<0)
                                                  Stemp.tuneNum=NB_TUNE-1;
                                              else if (Stemp.tuneNum+increment>NB_TUNE)
                                                  Stemp.tuneNum=0;
                                              else
                                                  Stemp.tuneNum+=increment;
                          
                                              if (Stemp.tuneNum)
                                              {
                                                  sprintf(musicFile,"sounds/tune%d.mod",Stemp.tuneNum);
                          
                                                  if ((tune=FMUSIC_LoadSong(musicFile))==NULL)
                                                  {//gestion de l'erreur.
                                                      printf("Err de chargement du tune :%s\n",FSOUND_Err(FSOUND_GetError()));
                                                      fin=true;
                                                      retour=0;
                                                  }
                                                  else
                                                  {//MAJ affichage et lancement musique.
                                                      FMUSIC_SetLooping(tune,false);
                                                      FMUSIC_PlaySong(tune);
                                                      sprintf(tuneName,FMUSIC_GetName(tune));
                                                  }
                                              }
                                              else
                                              {
                          
                                                  tune=NULL;
                                                  sprintf(tuneName,"Aucune");
                                              }
                          
                                              SDL_FreeSurface(surf_musicName);
                          
                                              if ((surf_musicName=TTF_RenderText_Solid(police,tuneName,colorTxt))==NULL)
                                              {//gestion de l'erreur
                                                  printf("option / Err de création de surf_musicName :%s\n",TTF_GetError());
                                                  fin=true;
                                                  retour=0;
                                              }
                                          }
                                      }
                                      break;
                          
                                      case 4:
                                      {//quitter
                                          if (Sinput->key[SDLK_RETURN] || Sinput->padBt[ACT][0])
                                              fin=true;
                                      }
                                      break;
                          
                                      case 5:
                                      {//quitter et sauvegarder
                                          if (Sinput->key[SDLK_RETURN] || Sinput->padBt[ACT][0])
                                          {
                                              Sglobal->Scontrol->numPad=Stemp.padNum;//copie.
                                              Sglobal->Sinfos->skin=Stemp.skinNum;//copie.
                                              Sglobal->Sinfos->tune=Stemp.tuneNum;//copie.
                                              Sglobal->Scontrol->modeControl=Stemp.control;//copie
                                              Sglobal->Scontrol->padBtDroite=Stemp.btDroit;//copie
                                              Sglobal->Scontrol->padBtGauche=Stemp.btGauc;//copie
                                              Sglobal->Scontrol->clavierDroite=Stemp.clavDroit;//copie
                                              Sglobal->Scontrol->clavierGauche=Stemp.clavGauc;//copie
                          
                                              fin=true;
                                          }
                                      }
                                      break;
                          
                                      default:
                                      break;
                                  }
                          
                                  increment=0;
                          
                                  //application du menu à l'ecran.
                                  SDL_BlitSurface(surf_option,NULL,ecran,&optPos);
                          
                                  //application de la fleche de selection.
                                  SDL_BlitSurface(surf_select,NULL,ecran,&selectPos);
                          
                                  //application du mode de control.
                                  SDL_BlitSurface(surf_modCtrl[Stemp.control],NULL,ecran,&modPos);
                          
                                  //application du nom du pad.
                                  SDL_BlitSurface(surf_padName,NULL,ecran,&padTxtPos);
                          
                                  //application du skin.
                                  SDL_BlitSurface(surf_skin,NULL,ecran,&skinPos);
                          
                                  //application du nom de la musique.
                                  SDL_BlitSurface(surf_musicName,NULL,ecran,&musicTxtPos);
                          
                                  //application des touches.
                                  SDL_BlitSurface(surf_touches,NULL,ecran,&touchesPos);
                          
                                  //rafraichissement ecran.
                                  SDL_Flip(ecran);
                          
                                  SDL_Delay(50);
                          
                              }//fin de boucle principale.
                          
                          
                              /******Sortie******/
                          
                              SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));//ecran noir
                          
                              SDL_Flip(ecran);
                          
                              FMUSIC_StopSong(tune);
                          
                          
                              //libération de la mémoire.
                              for (i=0;i<2;i++)
                              SDL_FreeSurface(surf_modCtrl[i]);
                          
                              SDL_FreeSurface(surf_musicName);
                              SDL_FreeSurface(surf_padName);
                              SDL_FreeSurface(surf_option);
                              SDL_FreeSurface(surf_select);
                              SDL_FreeSurface(surf_skin);
                          
                              TTF_CloseFont(police);
                          
                              FMUSIC_FreeSong(tune);
                          
                              return(retour);
                          }
                          
                          
                          int menu_best(SDL_Surface *ecran, S_global *Sglobal, int score)
                          {//enregistrement des records ***EN COURS***
                          
                              /*****Declarations*****/
                          
                              //Reprise :
                              S_score *Sscore=Sglobal->Sscore;
                          
                              int rank=compare_score(score,Sscore),//classement.
                                  retour=1,//valeur de retour de la fonction.
                                  charPos=0,
                                  tickPrec=SDL_GetTicks(),
                                  tickAct=tickPrec;
                          
                              float i=0.0,//temporaire.
                                  angle=0.0;//angle d'affichage.
                          
                              bool fin=false,//bolléen de fin de boucle.
                                  alt=false;//bool d'alternance du char.
                          
                          
                              char actChar='a',//char actuel.
                                  txtrank[20],//text du classement.
                                  nom[4]="aaa";//nom avant modif.
                          
                                  sprintf(txtrank,"nouveau classement : %d",compare_score(score,Sglobal->Sscore)+1);
                          
                              SDL_Rect rankPos;
                              rankPos.x=20;
                              rankPos.y=5;
                          
                              SDL_Rect nomPos;
                              nomPos.x=250;
                              nomPos.y=100;
                          
                              SDL_Rect cupPos;
                          
                              SDL_Color colorTxt={255,255,255,0};
                          
                              SDL_Event event;
                          
                              SDL_EnableKeyRepeat(1000,200);
                          
                              SDL_Surface *surf_cup=NULL;
                              SDL_Surface *surf_cupTemp=NULL;
                              SDL_Surface *surf_nom=NULL;
                              SDL_Surface *surf_rank=NULL;
                          
                              FSOUND_SAMPLE *applause=NULL;
                          
                              TTF_Font *police=NULL;
                          
                              if((police=TTF_OpenFont("font/comic.ttf",40))==NULL)
                              {//gestion de l'erreur.
                                  printf("Err / chargement de comic.ttf %s\n",TTF_GetError());
                                  retour=0;
                                  fin=true;
                              }
                          
                          
                              if ((surf_cup=SDL_LoadBMP("pics/cup.bmp"))==NULL)
                              {//gestion de l'erreur.
                                  retour=0;
                                  fin=true;
                                  printf("Err / chargement de cup.bmp :%s",SDL_GetError());
                              }
                          
                          
                              if ((applause=FSOUND_Sample_Load(FSOUND_FREE,"sounds/applause.wav",0,0,0))==NULL)
                              {//gestion de l'erreur.
                                  printf("Err / chargement de applause.wav :%s\n",FSOUND_Err(FSOUND_GetError()));
                                  retour=0;
                                  fin=true;
                              }
                              else
                              {
                                  FSOUND_PlaySound(FSOUND_FREE,applause);
                              }
                          
                              /*****Intro*****/
                          
                              for (i=0.01,angle=0;i<=0.73;i+=0.01)
                              {//boucle d'animation de la coupe.
                          
                                  //nettoyage de l'écran.
                                  SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
                          
                                  //nouvelle image
                                  surf_cupTemp=rotozoomSurface(surf_cup,angle,i,SMOOTHING_OFF);
                          
                                  angle=1000*i;
                          
                                  cupPos.x=(ecran->w/2-cupPos.w/2);
                                  cupPos.y=(ecran->h/2-cupPos.h/2);
                          
                                  SDL_BlitSurface(surf_cupTemp,NULL,ecran,&cupPos);
                          
                                  SDL_Flip(ecran);
                          
                                  SDL_Delay(20);
                              }
                          
                              surf_cupTemp=rotozoomSurface(surf_cup,0,0.75,SMOOTHING_OFF);
                              SDL_BlitSurface(surf_cupTemp,NULL,ecran,&cupPos);
                              SDL_Flip(ecran);
                          
                              SDL_Delay(2000);
                          
                          
                              /****Boucle principale*****/
                          
                          
                              while(!fin)
                              {//boucle de saisie.
                                  while (SDL_PollEvent(&event))
                                  {
                          
                                      switch (event.type)
                                      {
                                          case SDL_QUIT:
                                              fin=true;
                                              retour=0;
                                          break;
                          
                                          case SDL_KEYDOWN :
                          
                                              switch (event.key.keysym.sym)
                                              {
                                                  case SDLK_UP :
                          
                                                      if (actChar+1<=122)
                                                          actChar++;
                          
                                                      nom[charPos]=actChar;
                          
                                                  break;
                          
                                                  case SDLK_DOWN :
                          
                                                      if (actChar-1>=97)
                                                          actChar--;
                          
                                                      nom[charPos]=actChar;
                          
                                                  break;
                          
                                                  case SDLK_LEFT :
                          
                                                      nom[charPos]=actChar;
                          
                                                      if (charPos-1>=0)
                                                      {
                                                          charPos--;
                                                          actChar=nom[charPos];
                                                      }
                                                  break;
                          
                                                  case SDLK_RIGHT :
                          
                                                      nom[charPos]=actChar;
                          
                                                      if (charPos+1<=2)
                                                      {
                                                          charPos++;
                                                          actChar=nom[charPos];
                                                      }
                                                  break;
                          
                                                  case SDLK_RETURN :
                          
                                                      nom[charPos]=actChar;
                                                      fin=true;
                                                  break;
                          
                                                  default:
                                                  break;
                                              }
                                          break;
                          
                                          default :
                                          break;
                                      }
                                  }
                          
                                  if ((surf_nom=TTF_RenderText_Solid(police,nom,colorTxt))==NULL)
                                      {
                                          printf("Erreur de création de surf_nom :%s\n",TTF_GetError());
                                          retour=0;
                                          fin=true;
                                      }
                          
                                  if ((surf_rank=TTF_RenderText_Solid(police,txtrank,colorTxt))==NULL)
                                      {
                                          printf("Erreur de création de surf_rank :%s\n",TTF_GetError());
                                          retour=0;
                                          fin=true;
                                      }
                          
                                  tickAct=SDL_GetTicks();
                          
                          
                                  if (tickAct<tickPrec+500 && !alt)
                                  {
                                      actChar=nom[charPos];
                                      nom[charPos]='_';
                                      alt=true;
                                  }
                                  else if (tickAct>=tickPrec+500)
                                  {
                                      nom[charPos]=actChar;
                                      alt=false;
                                  }
                          
                                  if (tickAct>=tickPrec+1000)
                                      tickPrec=SDL_GetTicks();
                          
                                  SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
                          
                                  SDL_BlitSurface(surf_cupTemp,NULL,ecran,&cupPos);
                          
                                  SDL_BlitSurface(surf_rank,NULL,ecran,&rankPos);
                          
                                  SDL_BlitSurface(surf_nom,NULL,ecran,&nomPos);
                          
                                  SDL_Flip(ecran);
                          
                                  SDL_Delay(20);
                              }
                          
                              /****Sortie*****/
                          
                              save_record(Sscore,nom,rank,score);
                          
                              SDL_FreeSurface(surf_cup);
                              SDL_FreeSurface(surf_cupTemp);
                              SDL_FreeSurface(surf_rank);
                              SDL_FreeSurface(surf_nom);
                          
                              FSOUND_Sample_Free(applause);
                          
                              TTF_CloseFont(police);
                          
                              return(retour);
                          }
                          



                          jeu.cpp :
                          #include <iostream>
                          #include <SDL/SDL.h>
                          #include <SDL/fmod.h>
                          #include <SDL/SDL_ttf.h>
                          #include <SDL/SDL_image.h>
                          #include "constantes.h"
                          #include "inputs.h"
                          #include "jeu_fnctns.h"
                          #include "fichier.h"
                          #include "menu.h"
                          
                          
                          
                          int jeu(SDL_Surface *ecran, S_global *Sglobal)
                          {//Le jeu en lui-même ***VALIDE***
                          
                              /***** Declarations *****/
                          
                              //reprise des structures.
                              S_control *Scontrol=Sglobal->Scontrol;
                              S_score *Sscore=Sglobal->Sscore;
                              S_input *Sinput=Sglobal->Sinput;
                          
                          
                              //piece actuelle et next :
                              S_piece pieceAct,pieceNxt;
                          
                          
                              char nomFichier[15];//nom du fichier à charger
                          
                              bool fin=false;//bit de validité de boucle.
                          
                              int i=0,j=0,//variables temporaires de boucles.
                                  retour=1,//valeur de retour de fonction.
                                  ligneADecaler=0,//nombre de ligne à supprimer.
                                  nbLigne=0,//nombre de ligne supprimées.
                                  score=0,//score.
                                  tempLigne=0,//temporaire de calcul de front.
                                  level=0,//niveau en cours.
                                  tempsPrec=0,//memo temps pour comparaison.
                                  tempsAct=0,//temps actuel.
                                  mouvement=RIEN,//mouvement en cours.
                                  difficulteVit=1000;//difficulté (vitesse).
                          
                          
                              bool tableau[NB_BLOCK_LARG][NB_BLOCK_HAUT]={false},//tableau de jeu.
                                  newPiece=false,//lancement d'une piece.
                                  frontLvl=false;//front montant.
                          
                              //vidange de la matrice.
                              for(i=0;i<NB_BLOCK_HAUT;i++)
                                  for(j=0;j<NB_BLOCK_LARG;j++)
                                      tableau[j][i]=false;
                          
                              //initialisation.
                              init_input(Sinput);
                          
                              //lecture du fichier de scores.
                              if (!lire_score(Sscore))
                                  init_score(Sscore);
                          
                          
                          //SDL
                          
                              SDL_Rect tempPos;
                          
                              //chargement du tableau de bord.
                              SDL_Surface *board=IMG_Load("pics/board.jpg");
                          
                              if (board==NULL)
                              {//gestion de l'erreur.
                                  printf("JEU / Err chargement de board.jpg");
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//SDL_Rect.
                              tempPos.x=BOARDPOS;
                              tempPos.y=0;
                              tempPos.h=board->h;
                              tempPos.w=board->w;
                              }
                          
                              //application du tableau de bord.
                              SDL_BlitSurface(board,NULL,ecran,&tempPos);
                          
                          //Création de la surface du skin.
                              sprintf(nomFichier,"pics/skin%d.bmp",Sglobal->Sinfos->skin);
                              SDL_Surface* carre=SDL_LoadBMP(nomFichier);
                          
                              if (carre==NULL)
                              {//gestion de l'erreur.
                                  printf("Err / chargement skin :%s\n",SDL_GetError());
                                  fin=true;
                                  retour=0;
                              }
                          
                          //Chargement de la musique
                          
                              FMUSIC_MODULE *tune=NULL;
                          
                              if (Sglobal->Sinfos->tune)
                              {//si musique.
                                  sprintf(nomFichier,"sounds/tune%d.mod",Sglobal->Sinfos->tune);
                                  tune=FMUSIC_LoadSong(nomFichier);
                          
                                  if (tune==NULL)
                                  {//gestion de l'erreur.
                                      printf("Err / chargement musique :%s\n",FSOUND_Err(FSOUND_GetError()));
                                      fin=true;
                                      retour=0;
                                  }
                                  else
                                  {//démarrage musique
                                      FMUSIC_SetLooping(tune,true);
                                      FMUSIC_PlaySong(tune);
                                  }
                              }
                          
                          
                          //GESTION DU NOMBRE DE LIGNE :
                          
                              char charNbLigne[5];
                          
                              //POLICE ET COULEUR DU TEXTE
                              TTF_Font *police=TTF_OpenFont("font/comic.ttf",30);
                          
                              if(police==NULL)
                              {//gestion de l'erreur
                                  printf("Err chargement de la police de characteres\n");
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//format de police
                                  TTF_SetFontStyle(police,TTF_STYLE_NORMAL);
                              }
                          
                              /***** Preliminaire*****/
                          
                          
                              sprintf(charNbLigne,"%d",nbLigne);
                          
                              //positionnement de l'affichage du nombre de ligne :
                              SDL_Rect dispLinePos;
                              dispLinePos.x=370;
                              dispLinePos.y=352;
                              dispLinePos.h=dispLinePos.w=0;
                          
                              disp_texte(ecran,charNbLigne,police,&dispLinePos);
                          
                          //GESTION AFFICHAGE DU SCORE :
                          
                              char charScore[10];
                          
                              sprintf(charScore,"%d",score);
                          
                              //positionnement de l'affichage :
                              SDL_Rect dispScorePos;
                              dispScorePos.x=370;
                              dispScorePos.y=472;
                              dispScorePos.h=dispScorePos.w=0;
                          
                              disp_texte(ecran,charScore,police,&dispScorePos);
                          
                          //GESTION AFFICHAGE LEVEL :
                          
                              char charLvl[5];
                          
                              sprintf(charLvl,"%d",level);
                          
                              //positionnement de l'affichage :
                              SDL_Rect dispLvlPos;
                              dispLvlPos.x=370;
                              dispLvlPos.y=230;
                              dispLvlPos.h=dispLvlPos.w=0;
                          
                              disp_texte(ecran,charLvl,police,&dispLvlPos);
                          
                             // bool fin=false;//bit de validité de boucle
                          
                              //initialisation des premiere pieces :
                              init_piece(&pieceAct,carre,rand()%7);
                              init_piece(&pieceNxt,carre,rand()%7);
                              disp_next(ecran,&pieceNxt);
                          
                              SDL_EnableKeyRepeat(100,100);
                          
                              /***** Boucle Principale*****/
                          
                              while (!fin)
                              {//boucle principale du jeu
                          
                          
                                  get_input(Sglobal);//lectures des entrées utilisateur
                                  tempsAct=SDL_GetTicks();
                          
                                  if (newPiece)
                                  {//gestion d'envoi d'une nouvelle piece
                                      init_piece(&pieceAct,carre,pieceNxt.type);
                                      init_piece(&pieceNxt,carre,rand()%7);
                                      disp_next(ecran,&pieceNxt);
                                      newPiece=false;
                                  }
                          
                                  if (frontLvl)
                                  {//action toutes les 10 lignes :
                                      difficulteVit-=50;
                                      score+=1000;
                                      level++;
                          
                                      sprintf(charLvl,"%d",level);
                          
                                      disp_texte(ecran,charLvl,police,&dispLvlPos);
                          
                                      frontLvl=false;
                                  }
                          
                                  if (Sinput->quit)
                                  {//croix quitter
                                      Sinput->quit=false;
                                      retour=0;
                                      score=0;
                                      fin=true;
                                  }
                          
                                  if(Sinput->key[SDLK_F1])
                                  {//fullscreen
                                      switch_screen(ecran,Sglobal);
                          
                                      //ré-application des surfaces.
                                      SDL_BlitSurface(board,NULL,ecran,&tempPos);
                                      disp_texte(ecran,charNbLigne,police,&dispLinePos);
                                      disp_texte(ecran,charScore,police,&dispScorePos);
                                      disp_texte(ecran,charLvl,police,&dispLvlPos);
                                      disp_next(ecran,&pieceNxt);
                                      SDL_Flip(ecran);
                          
                                      Sinput->key[SDLK_F1]=false;
                                  }
                          
                                  if(Sinput->key[SDLK_ESCAPE])
                                  {//touche echap
                                      Sinput->key[SDLK_ESCAPE]=false;
                                      score=0;
                                      fin=true;
                                  }
                          
                                  if(!Scontrol->modeControl && Sinput->key[Scontrol->clavierGauche]
                                      || Scontrol->modeControl && Sinput->padBt[ACT][0])
                                  {//si rotation gauche
                                      mouvement=ROT_G;
                                      Sinput->key[Scontrol->clavierGauche]=false;
                                      Sinput->padBt[ACT][0]=false;
                                  }
                          
                                  if(!Scontrol->modeControl && Sinput->key[Scontrol->clavierDroite]
                                      || Scontrol->modeControl && Sinput->padBt[ACT][1])
                                  {//si rotation droite
                                      mouvement=ROT_D;
                                      Sinput->key[Scontrol->clavierDroite]=false;
                                      Sinput->padBt[ACT][1]=false;
                                  }
                          
                                  if (!Scontrol->modeControl && Sinput->key[SDLK_RIGHT]
                                      || Scontrol->modeControl && Sinput->padHat[ACT][SDL_HAT_RIGHT])
                                  {//si commande droite
                                      mouvement=DROITE;
                                      Sinput->key[SDLK_RIGHT]=false;
                                      Sinput->padHat[ACT][SDL_HAT_RIGHT]=false;
                                  }
                          
                                  if (!Scontrol->modeControl && Sinput->key[SDLK_LEFT]
                                      || Scontrol->modeControl && Sinput->padHat[ACT][SDL_HAT_LEFT])
                                  {//si commande gauche
                                      mouvement=GAUCHE;
                                      Sinput->key[SDLK_LEFT]=false;
                                      Sinput->padHat[ACT][SDL_HAT_LEFT]=false;
                                  }
                          
                                  if (tempsAct-tempsPrec>=difficulteVit && mouvement!=BAS)
                                  {
                                      tempsPrec=SDL_GetTicks();
                                      mouvement=BAS;
                                  }
                          
                                  if (mouvement!=BAS
                                      &&
                                          (!Scontrol->modeControl && Sinput->key[SDLK_DOWN]
                                          || Scontrol->modeControl && Sinput->padHat[ACT][SDL_HAT_DOWN])
                                      )
                                  {//si commande bas
                                      mouvement=BAS;
                                      score+=5;
                                      Sinput->key[SDLK_DOWN]=false;
                                      Sinput->padHat[Scontrol->numPad][SDL_HAT_DOWN]=false;
                                  }
                          
                                  if (mouvement!=RIEN)
                                  {//s'il y a eu un mouvement :
                                      switch (test_Mvt(&pieceAct,tableau,mouvement))
                                      {//selon resultat du test de mouvement
                                          case 1://bouge la piece
                                              bouger(ecran,&pieceAct,mouvement);
                                          break;
                          
                                          case 2://fixe la piece dans la matrice
                                              if (!(fixer(&pieceAct,tableau)))
                                              {//game over si fixer() retourne 0
                                                  game_over(ecran,police);
                                                  fin=true;
                                              }
                                              else
                                              {//sinon
                                                  do
                                                  {//control des lignes et décalage
                                                      ligneADecaler=test_ligne(tableau);//cherche une ligne complete
                          
                                                      if (ligneADecaler)
                                                      {//décalage des ligne
                                                          decalage(ecran,tableau,ligneADecaler);
                                                          SDL_Delay(100);
                                                          SDL_Flip(ecran);
                                                          tempLigne++;
                          
                                                          if (!((nbLigne+tempLigne)%10))//activation du front montant toutes les 10 lignes
                                                              frontLvl=true;
                                                      }
                                                  }
                                                  while (ligneADecaler);//tant qu'il y a des lignes completes
                                                  nbLigne+=tempLigne;//comptage du nombre de ligne
                          
                                                  for(i=1;i<=tempLigne;i++)
                                                  {//augmentation du score en fonction du nombre de lignes faite en un coup
                                                      score+=100*i;
                                                  }
                                                  tempLigne=0;
                          
                                                  sprintf(charNbLigne,"%d",nbLigne);
                          
                                                  disp_texte(ecran,charNbLigne,police,&dispLinePos);
                          
                                                  newPiece=true;//lancement d'une nouvelle piece
                                              }
                                          break;
                          
                                          default :
                                          break;
                                      }
                                  }
                          
                                  if (mouvement)
                                  {//actualisation des affichages
                                      sprintf(charScore,"%d",score);
                          
                                      disp_texte(ecran,charScore,police,&dispScorePos);
                          
                                      SDL_Flip(ecran);
                                      mouvement=RIEN;
                                  }
                              }
                          
                              /***** Sortie *****/
                          
                                  FMUSIC_StopSong(tune);
                          
                              //libération de la mémoire
                          
                                  FMUSIC_FreeSong(tune);
                          
                                  SDL_FreeSurface(carre);
                          
                                  SDL_FreeSurface(board);
                                  TTF_CloseFont(police);
                          
                                  if (score && compare_score(score,Sscore)>=-1)
                                  {//enregistrement du score
                                      if (!menu_best(ecran,Sglobal,score))
                                          retour=0;
                                  }
                          
                                  if(!ecrire_score(Sscore))
                                  {//sauvegarde des scores dans le fichier
                                      printf("Err sauvegarde des scores\n");
                                  }
                          
                              return(retour);
                          }
                          


                          jeu_fnctns.cpp :
                          #include <iostream>
                          #include <SDL/SDL.h>
                          #include "constantes.h"
                          #include <SDL/SDL_ttf.h>
                          
                          
                          
                          void init_piece(S_piece *Spiece,SDL_Surface *bloc,const int forme)
                          {//initialisation de la structure piece ***VALIDE***
                          
                              Spiece->type=forme;
                              Spiece->carre=bloc;
                              Spiece->orientation=0;
                              Spiece->decoup.x=TAILLE_BLOCK*forme;
                              Spiece->decoup.y=0;
                              Spiece->decoup.h=Spiece->decoup.w=TAILLE_BLOCK;
                          
                              for(int i=0;i<4;i++)
                                  Spiece->pos[i].h=Spiece->pos[i].w=TAILLE_BLOCK;
                          
                              switch (forme)
                              {
                                  case BARRE:
                          
                                      Spiece->pos[0].x=5;
                                      Spiece->pos[0].y=-1;
                                      Spiece->pos[1].x=4;
                                      Spiece->pos[1].y=-1;
                                      Spiece->pos[2].x=6;
                                      Spiece->pos[2].y=-1;
                                      Spiece->pos[3].x=7;
                                      Spiece->pos[3].y=-1;
                          
                                  break;
                          
                                  case TE:
                          
                                      Spiece->pos[0].x=5;
                                      Spiece->pos[0].y=0;
                                      Spiece->pos[1].x=5;
                                      Spiece->pos[1].y=-1;
                                      Spiece->pos[2].x=4;
                                      Spiece->pos[2].y=0;
                                      Spiece->pos[3].x=6;
                                      Spiece->pos[3].y=0;
                          
                                  break;
                          
                                  case CARRE:
                          
                                      Spiece->pos[0].x=4;
                                      Spiece->pos[0].y=-1;
                                      Spiece->pos[1].x=4;
                                      Spiece->pos[1].y=0;
                                      Spiece->pos[2].x=5;
                                      Spiece->pos[2].y=-1;
                                      Spiece->pos[3].x=5;
                                      Spiece->pos[3].y=0;
                          
                                  break;
                          
                                  case ESS:
                          
                                      Spiece->pos[0].x=5;
                                      Spiece->pos[0].y=0;
                                      Spiece->pos[1].x=4;
                                      Spiece->pos[1].y=0;
                                      Spiece->pos[2].x=5;
                                      Spiece->pos[2].y=-1;
                                      Spiece->pos[3].x=6;
                                      Spiece->pos[3].y=-1;
                                  break;
                          
                                  case ZED:
                          
                                      Spiece->pos[0].x=5;
                                      Spiece->pos[0].y=0;
                                      Spiece->pos[1].x=6;
                                      Spiece->pos[1].y=0;
                                      Spiece->pos[2].x=5;
                                      Spiece->pos[2].y=-1;
                                      Spiece->pos[3].x=4;
                                      Spiece->pos[3].y=-1;
                          
                                  break;
                          
                                  case EL:
                          
                                      Spiece->pos[0].x=5;
                                      Spiece->pos[0].y=-1;
                                      Spiece->pos[1].x=6;
                                      Spiece->pos[1].y=-1;
                                      Spiece->pos[2].x=4;
                                      Spiece->pos[2].y=-1;
                                      Spiece->pos[3].x=4;
                                      Spiece->pos[3].y=0;
                          
                                  break;
                          
                                  case LE:
                          
                                      Spiece->pos[0].x=5;
                                      Spiece->pos[0].y=-1;
                                      Spiece->pos[1].x=4;
                                      Spiece->pos[1].y=-1;
                                      Spiece->pos[2].x=6;
                                      Spiece->pos[2].y=-1;
                                      Spiece->pos[3].x=6;
                                      Spiece->pos[3].y=0;
                          
                                  break;
                              }
                          }
                          
                          
                          int test_Mvt(S_piece *Spiece, const bool tableau[NB_BLOCK_LARG][NB_BLOCK_HAUT],const int direction)
                          {//la Spiece peut ou non bouger ***VALIDE***
                          
                              /***** Déclarations *****/
                          
                              int retour=1,//valeur de retour de la fonction.
                                  i=0,//temporaire de boucle.
                                  Xt=0,Yt=0,//encombrement X Y.
                                  TempX=0,TempY=0;//temporaire X Y.
                          
                          
                              /***** Execution *****/
                          
                              for (i=0;i<4;i++)
                              {
                                  switch (direction)
                                  {
                                      case BAS :
                                      {
                                          if (((Spiece->pos[i].y+1)>=NB_BLOCK_HAUT) || (tableau[Spiece->pos[i].x][Spiece->pos[i].y+1]))
                                          retour=2;
                                      }
                                      break;
                          
                                      case DROITE :
                                      {
                                          if (Spiece->pos[i].x+1>=NB_BLOCK_LARG || tableau[Spiece->pos[i].x+1][Spiece->pos[i].y])
                                          retour=0;
                                      }
                                      break;
                          
                                      case GAUCHE :
                                      {
                                          if (Spiece->pos[i].x-1<0 || tableau[Spiece->pos[i].x-1][Spiece->pos[i].y])
                                              retour=0;
                                      }
                                      break;
                          
                                      case ROT_D :
                                      {
                                          Xt=Spiece->pos[i].x-Spiece->pos[0].x;
                                          Yt=Spiece->pos[i].y-Spiece->pos[0].y;
                          
                                          TempY=Spiece->pos[0].y+Xt;
                                          TempX=Spiece->pos[0].x-Yt;
                          
                                          if (TempX>=NB_BLOCK_LARG || TempX<0 || TempY>=NB_BLOCK_HAUT || tableau[TempX][TempY])
                                              retour=0;
                                      }
                                      break;
                          
                                      case ROT_G :
                                      {
                                          Xt=Spiece->pos[i].x-Spiece->pos[0].x;
                                          Yt=Spiece->pos[i].y-Spiece->pos[0].y;
                          
                                          TempY=Spiece->pos[0].y-Xt;
                                          TempX=Spiece->pos[0].x+Yt;
                          
                                          if (TempX>=NB_BLOCK_LARG || TempX<0 || TempY>=NB_BLOCK_HAUT || tableau[TempX][TempY])
                                              retour=0;
                                      }
                                  }
                              }
                          
                              return(retour);
                          }
                          
                          
                          void bouger(SDL_Surface *ecran, S_piece *Spiece, int direction)
                          {//bouge une Spiece ***VALIDE***
                          
                              /***** Déclarations *****/
                          
                              int i=0,//temporaire de boucle
                                  Xt=0,Yt=0;
                          
                              SDL_Rect tempPos;
                          
                              tempPos.w=TAILLE_BLOCK;
                              tempPos.h=TAILLE_BLOCK;
                          
                          
                              /***** preliminaire *****/
                          
                              for(i=0;i<4;i++)
                              {//efface la Spiece
                                  tempPos.x=BOARDPOS + TAILLE_BLOCK*Spiece->pos[i].x;
                                  tempPos.y=TAILLE_BLOCK*Spiece->pos[i].y;
                          
                                  SDL_FillRect(ecran,&tempPos,SDL_MapRGB(ecran->format,0,0,0));
                              }
                          
                              /***** execution *****/
                          
                              switch (direction)
                              {
                                  case BAS :
                                  {
                                      for (i=0;i<4;i++)
                                          Spiece->pos[i].y++;
                                  }
                                  break;
                          
                                  case DROITE :
                                  {
                                      for (i=0;i<4;i++)
                                          Spiece->pos[i].x++;
                                  }
                                  break;
                          
                                  case GAUCHE :
                                  {
                                      for (i=0;i<4;i++)
                                          Spiece->pos[i].x--;
                                  }
                                  break;
                          
                                  case ROT_D :
                                  {
                                      for (i=0;i<4;i++)
                                      {
                                          Xt=Spiece->pos[i].x-Spiece->pos[0].x;
                                          Yt=Spiece->pos[i].y-Spiece->pos[0].y;
                          
                                          Spiece->pos[i].y=Spiece->pos[0].y+Xt;
                                          Spiece->pos[i].x=Spiece->pos[0].x-Yt;
                                      }
                          
                                  }
                                  break;
                          
                                  case ROT_G :
                                  {
                                      for (i=0;i<4;i++)
                                      {
                                          Xt=Spiece->pos[i].x-Spiece->pos[0].x;
                                          Yt=Spiece->pos[i].y-Spiece->pos[0].y;
                          
                                          Spiece->pos[i].y=Spiece->pos[0].y-Xt;
                                          Spiece->pos[i].x=Spiece->pos[0].x+Yt;
                                      }
                                  }
                                  break;
                              }
                          
                              for (i=0;i<4;i++)
                              {//redessine la Spiece
                                  tempPos.x=BOARDPOS + TAILLE_BLOCK*Spiece->pos[i].x;
                                  tempPos.y=TAILLE_BLOCK*Spiece->pos[i].y;
                          
                                  SDL_BlitSurface(Spiece->carre,&Spiece->decoup,ecran,&tempPos);
                              }
                          }
                          
                          
                          int fixer(S_piece *Spiece, bool tableau[NB_BLOCK_LARG][NB_BLOCK_HAUT])
                          {//insert la Spiece dans la matrice ***VALIDE***
                          
                              int i=0,//temporaire de boucle.
                                  maxi=0;//valeur en coord Y du plus haut point de la Spiece
                          
                              for(i=0;i<4;i++)
                              {//boucle de figeage
                                  tableau[Spiece->pos[i].x][Spiece->pos[i].y]=true;
                          
                                  if (Spiece->pos[i].y>maxi)
                                      maxi=Spiece->pos[i].y;
                              }
                          
                              return (maxi);
                          
                          }
                          
                          
                          int test_ligne (bool tableau[NB_BLOCK_LARG][NB_BLOCK_HAUT])
                          {//renvoie le numero de ligne à supprimer sinon ZERO ***VALIDE***
                          
                              int i=NB_BLOCK_HAUT-1,j=0,//temporaires de boucle.
                                  colonneNB=0;//nombre de colonnes pleines.
                          
                              for (i=NB_BLOCK_HAUT-1;i>=0;i--)
                              {
                                  for(j=0;j<NB_BLOCK_LARG;j++)
                                  {
                                      if (tableau[j][i])
                                          colonneNB++;
                                  }
                          
                                  if (colonneNB==NB_BLOCK_LARG)
                                      return (i);
                          
                                  colonneNB=0;
                              }
                          
                              return (0);
                          }
                          
                          
                          void decalage (SDL_Surface *ecran, bool tableau[NB_BLOCK_LARG][NB_BLOCK_HAUT],int ligne)
                          {//effectue le décalage graphique et matrice ***VALIDE***
                          
                              int i=0,j=0;//temporaires de boucle.
                          
                              SDL_Rect tempPos,//temporaire.
                                      decoupe;//coordonnées de découpe.
                          
                              tempPos.w=decoupe.w=TAILLE_BLOCK;
                              tempPos.h=decoupe.h=TAILLE_BLOCK;
                          
                              for(i=ligne;i>=0;i--)
                              {
                                  for(j=0;j<NB_BLOCK_LARG;j++)
                                  {
                                      if (i)
                                      {
                                          tableau[j][i]=tableau[j][i-1];
                                          tempPos.x=decoupe.x=j*TAILLE_BLOCK + BOARDPOS;
                                          tempPos.y=i*TAILLE_BLOCK;
                                          decoupe.y=(i-1)*TAILLE_BLOCK;
                          
                                          SDL_BlitSurface(ecran,&decoupe,ecran,&tempPos);
                                      }
                                      else
                                      {
                                          tableau[j][i]=false;
                                      }
                                  }
                              }
                          }
                          
                          
                          void disp_next(SDL_Surface *ecran, S_piece *Spiece)
                          {//affiche la prochaine Spiece ***VALIDE***
                          
                              int i; //temporaires
                          
                              SDL_Rect tempPos;
                          
                              tempPos.x=NEXT_X+4*TAILLE_BLOCK;
                              tempPos.y=NEXT_Y-TAILLE_BLOCK;
                              tempPos.h=2*TAILLE_BLOCK;
                              tempPos.w=4*TAILLE_BLOCK;
                          
                              //nettoyage de la zone d'affichage
                              SDL_FillRect(ecran,&tempPos,SDL_MapRGB(ecran->format,0,0,0));
                          
                              tempPos.h=TAILLE_BLOCK;
                              tempPos.w=TAILLE_BLOCK;
                          
                              for (i=0;i<4;i++)
                              {//redessine la Spiece
                                  tempPos.x=NEXT_X+Spiece->pos[i].x*TAILLE_BLOCK;
                                  tempPos.y=NEXT_Y+Spiece->pos[i].y*TAILLE_BLOCK;
                          
                                  SDL_BlitSurface(Spiece->carre,&Spiece->decoup,ecran,&tempPos);
                              }
                          }
                          
                          
                          void disp_texte(SDL_Surface *ecran, char texte[], TTF_Font* police, SDL_Rect* position)
                          {//affiche les textes ***VALIDE***
                          
                              SDL_Color colorTxt={255,255,255,0};
                              SDL_Surface *surf_text=NULL;
                              SDL_Rect temp;
                          
                              if ((surf_text=TTF_RenderText_Solid(police,texte,colorTxt))==NULL)
                              {//gestion de l'erreur
                                  printf("disp_text / Erreur de création de surf_text\n");
                                  exit(EXIT_FAILURE);
                              }
                          
                              temp.x=position->x;
                              temp.y=position->y;
                              temp.h=surf_text->h+5;
                              temp.w=surf_text->w+5;
                          
                              SDL_FillRect(ecran,position,SDL_MapRGB(ecran->format,0,0,0));//nettoyage de la zone d'affichage
                              SDL_BlitSurface(surf_text,NULL,ecran,position);//application du text
                          
                              SDL_FreeSurface(surf_text);
                          
                          }
                          
                          
                          void game_over(SDL_Surface* ecran, TTF_Font *police)
                          {//game over  ***VALIDE***
                          
                              int i=0, j=0;
                              unsigned tempsAct;
                          
                              SDL_Rect tempPos;
                          
                              tempPos.h=TAILLE_BLOCK;
                              tempPos.w=TAILLE_BLOCK;
                          
                              char gameOver[10];
                          
                              SDL_Color colorTxt={255,255,255,0};
                          
                              SDL_Surface *surf_gameOver=NULL;
                          
                              sprintf(gameOver,"GAME OVER");
                          
                              if ((surf_gameOver=TTF_RenderText_Solid(police,gameOver,colorTxt))==NULL)
                              {//gestion de l'erreur
                                  printf("Err création du text game over : %s\n",SDL_GetError());
                              }
                              else
                              {//execution.
                                  for(i=0;i<NB_BLOCK_HAUT;i++)
                                  {//disparition des blocs.
                                      tempPos.y=i*TAILLE_BLOCK;
                          
                                      for (j=0;j<NB_BLOCK_LARG;j++)
                                      {
                          
                                          tempPos.x=j*TAILLE_BLOCK;
                          
                                          SDL_Delay(10);
                          
                                          SDL_FillRect(ecran,&tempPos,SDL_MapRGB(ecran->format,0,0,0));
                          
                                          SDL_Flip(ecran);
                                      }
                                  }
                          
                                  tempPos.x=(TAILLE_BLOCK*NB_BLOCK_LARG-surf_gameOver->w)/2;
                                  tempPos.h=surf_gameOver->h;
                                  tempPos.w=surf_gameOver->w;
                          
                                  for(i=0;i<=ecran->h/2;i+=5)
                                  {//descente du texte.
                                      tempPos.y=i;
                                      SDL_FillRect(ecran,&tempPos,SDL_MapRGB(ecran->format,0,0,0));
                                      SDL_BlitSurface(surf_gameOver,NULL,ecran,&tempPos);
                          
                                      SDL_Delay(50);
                          
                                      SDL_Flip(ecran);
                                  }
                          
                                  tempsAct=SDL_GetTicks();
                          
                                  while (tempsAct+5000>SDL_GetTicks())
                                      SDL_Delay(100);
                              }
                          }
                          


                          inputs.cpp :
                          #include <iostream>
                          #include <SDL/SDL.h>
                          #include <SDL/SDL_ttf.h>
                          #include "constantes.h"
                          
                          
                          
                          void init_input(struct S_input* Sinput)
                          {//initialisation des entrées.***VALIDE***
                          
                              Sinput->quit=false;
                          
                              for(int i=0;i<SDLK_LAST;i++)
                              {
                                  Sinput->key[i]=false;
                          
                                  if (i<8)
                                  {//mise à 0 des boutons souris.
                                      Sinput->mseBt[i]=false;
                                  }
                          
                                  if (i<10)
                                  {//mise à 0 des boutons des pads.
                                      for(int j=0;j<2;j++)
                                          Sinput->padBt[j][i]=false;
                                  }
                          
                                  if (i<8)
                                  {//mise à 0 des chapeaux des pads.
                                      for(int j=0;j<2;j++)
                                      {
                                          Sinput->padHat[j][i]=false;
                                      }
                                  }
                              }
                          
                              Sinput->padRepet=200;//valeur de répetition des chapeaux.
                              Sinput->btRepet=200;//valeur de répetition des boutons.
                              Sinput->padRepetActTime=Sinput->btRepetActTime=SDL_GetTicks();
                          }
                          
                          
                          void get_input(struct S_global *Sglobal)
                          {//actualisation des entrées.***VALIDE***
                          
                          
                              SDL_Event event;
                          
                              int i=0;
                          
                              //Reprise pour lecture
                              S_input *Sinput=Sglobal->Sinput;
                              SDL_Joystick *joy=NULL;
                          
                          
                              //Reprise pour lecture
                              if (Sglobal->Scontrol->joy!=NULL)
                                  joy=Sglobal->Scontrol->joy[Sglobal->Scontrol->numPad];
                          
                          
                              while (SDL_PollEvent(&event))
                              {
                                  switch (event.type)
                                  {
                                      case SDL_QUIT :
                                          Sinput->quit=true;
                                      break;
                          
                                      case SDL_KEYDOWN :
                                          Sinput->key[event.key.keysym.sym]=true;
                                      break;
                          
                                      case SDL_MOUSEBUTTONDOWN :
                                          Sinput->mseBt[event.button.button]=true;
                                      break;
                          
                                      case SDL_JOYBUTTONDOWN :
                                          if (event.jbutton.which==Sglobal->Scontrol->numPad && Sglobal->Scontrol->modeControl)
                                          {
                                              Sinput->padBt[ACT][1]=Sinput->padBt[PREV][1]=(event.jbutton.button==Sglobal->Scontrol->padBtDroite);
                                              Sinput->padBt[ACT][0]=Sinput->padBt[PREV][0]=(event.jbutton.button==Sglobal->Scontrol->padBtGauche);
                                              Sinput->btRepetActTime=SDL_GetTicks();
                                          }
                                      break;
                          
                                      case SDL_JOYHATMOTION :
                          
                                          switch (event.jhat.value)
                                          {
                          
                                              case SDL_HAT_UP :
                          
                                                  if (event.jhat.which==Sglobal->Scontrol->numPad && Sglobal->Scontrol->modeControl)
                                                  {
                                                      Sinput->padHat[ACT][SDL_HAT_UP]=true;
                                                      Sinput->padHat[PREV][SDL_HAT_UP]=true;
                                                      Sinput->padRepetActTime=SDL_GetTicks();
                                                  }
                          
                                                  break;
                          
                                              case SDL_HAT_DOWN :
                          
                                                  if (event.jhat.which==Sglobal->Scontrol->numPad && Sglobal->Scontrol->modeControl)
                                                  {
                                                      Sinput->padHat[ACT][SDL_HAT_DOWN]=true;
                                                      Sinput->padHat[PREV][SDL_HAT_DOWN]=true;
                                                      Sinput->padRepetActTime=SDL_GetTicks();
                                                  }
                          
                                              break;
                          
                                              case SDL_HAT_LEFT :
                          
                                                  if (event.jhat.which==Sglobal->Scontrol->numPad && Sglobal->Scontrol->modeControl)
                                                  {
                                                      Sinput->padHat[ACT][SDL_HAT_LEFT]=true;
                                                      Sinput->padHat[PREV][SDL_HAT_LEFT]=true;
                                                      Sinput->padRepetActTime=SDL_GetTicks();
                                                  }
                          
                                              break;
                          
                                              case SDL_HAT_RIGHT:
                          
                                                  if (event.jhat.which==Sglobal->Scontrol->numPad && Sglobal->Scontrol->modeControl)
                                                  {
                                                      Sinput->padHat[ACT][SDL_HAT_RIGHT]=true;
                                                      Sinput->padHat[PREV][SDL_HAT_RIGHT]=true;
                                                      Sinput->padRepetActTime=SDL_GetTicks();
                                                  }
                          
                                              break;
                          
                                              case SDL_HAT_CENTERED :
                          
                                                  //suppression de la mémorisation des fronts montants
                                                  for(i=0;i<10;i++)
                                                  Sinput->padHat[PREV][i]=false;
                          
                                              break;
                          
                          
                                              default:
                                              break;
                                          }
                          
                                          default:
                                          break;
                                      }
                              }
                          
                              if (joy!=NULL && Sglobal->Scontrol->modeControl)
                              {//gestion du pad avec répétition
                                  switch (SDL_JoystickGetHat(joy,0))
                                  {//vérification du chapeau
                          
                                      case SDL_HAT_UP :
                          
                                          if (Sinput->padHat[PREV][SDL_HAT_UP] && SDL_GetTicks()> Sinput->padRepetActTime+Sinput->padRepet)
                                          {//control de l'état précedent du chapeau
                                              Sinput->padHat[ACT][SDL_HAT_UP]=true;
                                              Sinput->padRepetActTime=SDL_GetTicks();
                                          }
                          
                                      break;
                          
                                      case SDL_HAT_DOWN :
                          
                                          if (Sinput->padHat[PREV][SDL_HAT_DOWN] && SDL_GetTicks()> Sinput->padRepetActTime+Sinput->padRepet)
                                          {//control de l'état précedent du chapeau
                          
                                              Sinput->padHat[ACT][SDL_HAT_DOWN]=true;
                                              Sinput->padRepetActTime=SDL_GetTicks();
                                          }
                          
                                      break;
                          
                                      case SDL_HAT_LEFT :
                          
                                          if (Sinput->padHat[PREV][SDL_HAT_LEFT] && SDL_GetTicks()> Sinput->padRepetActTime+Sinput->padRepet)
                                          {//control de l'état précedent du chapeau
                          
                                              Sinput->padHat[ACT][SDL_HAT_LEFT]=true;
                                              Sinput->padRepetActTime=SDL_GetTicks();
                                          }
                          
                                      break;
                          
                                      case SDL_HAT_RIGHT :
                          
                                          if (Sinput->padHat[PREV][SDL_HAT_RIGHT] && SDL_GetTicks()> Sinput->padRepetActTime+Sinput->padRepet)
                                          {//control de l'état précedent du chapeau
                          
                                              Sinput->padHat[ACT][SDL_HAT_RIGHT]=true;
                                              Sinput->padRepetActTime=SDL_GetTicks();
                                          }
                          
                                      break;
                          
                                      default:
                                      break;
                                  }
                          
                                  if (SDL_JoystickGetButton(joy,Sglobal->Scontrol->padBtGauche)
                                      && Sinput->padBt[PREV][0]
                                      && SDL_GetTicks()> Sinput->btRepetActTime+Sinput->btRepet )
                                  {//si bouton rotation gauche (prioritaire)
                          
                                      Sinput->padBt[ACT][0]=true;
                                      Sinput->btRepetActTime=SDL_GetTicks();
                                  }
                          
                                  else if (SDL_JoystickGetButton(joy,Sglobal->Scontrol->padBtDroite)
                                      && Sinput->padBt[PREV][1]
                                      && SDL_GetTicks()> Sinput->btRepetActTime+Sinput->btRepet)
                                  {//si bouton rotation droite
                          
                                      Sinput->padBt[ACT][1]=true;
                                      Sinput->btRepetActTime=SDL_GetTicks();
                                  }
                              }
                          }
                          
                          
                          int saisie_cfg(SDL_Surface *ecran,S_temp *Stemp)
                          {//saisie de configuration des touches ***VALIDE***
                          
                                  /**** Déclarations ****/
                          
                              int i=0,//temp d'index
                              retour=1;//valeur de retour de la fonction
                          
                              bool fin=false;//bit de fin de boucle
                          
                              char droiteTxt[35]="appuyer sur droite",
                                  gaucheTxt[35]="appuyer sur gauche";
                          
                          //SDL
                          
                              SDL_Event event;
                          
                              SDL_Color colorTxt={255,255,255,0};//couleur du text
                          
                              //surface des textes.
                              SDL_Surface *surf_txt=NULL;
                          
                              //position du texte.
                              SDL_Rect textPos;
                              textPos.x=150;
                              textPos.y=250;
                          
                          
                          //TTF
                          
                              //ouverture de la police
                              TTF_Font *police=TTF_OpenFont("font/comic.ttf",20);
                          
                              if(police==NULL)
                              {//gestion de l'erreur.
                                  printf("saisie_Cfg / Err ouverture comic.ttf");
                                  fin=true;
                                  retour=0;
                              }
                              else
                              {//création de la surface
                                  TTF_SetFontStyle(police,TTF_STYLE_NORMAL);
                          
                                  if((surf_txt=TTF_RenderText_Solid(police,droiteTxt,colorTxt))==NULL)
                                  {
                                      printf("saisie_cfg / Err création de surface :%s",SDL_GetError());
                                      fin=true;
                                      retour=0;
                                  }
                                  else
                                  {
                                      textPos.h=surf_txt->h;
                                      textPos.w=surf_txt->w;
                                      SDL_FillRect(ecran,&textPos,SDL_MapRGB(ecran->format,0,0,0));//nettoyage de la zone d'affichage
                                      SDL_BlitSurface(surf_txt,NULL,ecran,&textPos);
                                  }
                              }
                          
                              SDL_Flip(ecran);
                          
                          
                              /***** Boucle Principale*****/
                          
                              while(!fin)
                              {//boucle principale.
                                  SDL_WaitEvent(&event);
                          
                                  if(event.type==SDL_QUIT)
                                  {//quitter
                                      retour=0;
                                      fin=true;
                                  }
                          
                                  switch (Stemp->control)
                                  {//capture des controles.
                                      case 0:
                                      {//capture clavier.
                                          if(!i && event.type==SDL_KEYDOWN)
                                          {
                                              Stemp->clavDroit=event.key.keysym.sym;
                                              i++;
                                          }
                                          else if (i && event.type==SDL_KEYDOWN)
                                          {
                                              Stemp->clavGauc=event.key.keysym.sym;
                                              fin=true;
                                          }
                                      }
                                      break;
                          
                                      case 1:
                                      {//capture pad.
                                          if (!i && event.type==SDL_JOYBUTTONDOWN && event.jbutton.which==Stemp->padNum)
                                          {
                                              Stemp->btDroit=event.jbutton.button;
                                              i++;
                                          }
                                          else if(i && event.type==SDL_JOYBUTTONDOWN && event.jbutton.which==Stemp->padNum)
                                          {
                                              Stemp->btGauc=event.jbutton.button;
                                              fin=true;
                                          }
                                      }
                                      break;
                          
                                      default:
                                      break;
                                  }
                          
                                  if (i)
                                  {//Basculement du texte.
                                      SDL_FreeSurface(surf_txt);
                                      SDL_FillRect(ecran,&textPos,SDL_MapRGB(ecran->format,0,0,0));//nettoyage de la zone d'affichage
                          
                          
                                      if((surf_txt=TTF_RenderText_Solid(police,gaucheTxt,colorTxt))==NULL)
                                      {//gestion d'erreur.
                                          printf("saisie_cfg / Err création de surface :%s",SDL_GetError());
                                          fin=true;
                                          retour=0;
                                      }
                          
                                      SDL_BlitSurface(surf_txt,NULL,ecran,&textPos);
                                      SDL_Flip(ecran);
                                  }
                              }
                          
                              /***** Sortie *****/
                          
                              SDL_FreeSurface(surf_txt);
                              TTF_CloseFont(police);
                              return(retour);
                          }
                          


                          fichiers.cpp :
                          #include <iostream>
                          #include <SDL/SDL.h>
                          #include <SDL/fmod.h>
                          #include <stdio.h>
                          #include <stdlib.h>
                          #include "constantes.h"
                          #include "fichier.h"
                          
                          void init_global(S_global *Sglobal)
                          {//initialisation de la strucure générale ***VALIDE***
                          
                              Sglobal->Sinput=new S_input;
                              Sglobal->Sinfos=new S_infos;
                              Sglobal->Sscore=new S_score;
                              Sglobal->Scontrol=new S_control;
                          }
                          
                          
                          void libere_global_mem(S_global *Sglobal)
                          {//libération de la mémoire ***VALIDE***
                          
                              delete Sglobal->Scontrol->joy;
                              delete Sglobal->Sinput;
                              delete Sglobal->Sinfos;
                              delete Sglobal->Sscore;
                              delete Sglobal->Scontrol;
                          }
                          
                          
                          void init_infos(S_infos *Sinfos)
                          {//initialisations des infos globales ***VALIDE***
                          
                              Sinfos->fullscreen=false;
                              Sinfos->hauteur=0;
                              Sinfos->modeJoueur=0;
                              Sinfos->vitesse=0;
                              Sinfos->skin=0;
                              Sinfos->tune=0;
                          }
                          
                          
                          void init_control(S_control *Scontrol)
                          {//initialisation des controles par défaut ***VALIDE***
                          
                              Scontrol->modeControl=0;
                              Scontrol->numPad=0;
                              Scontrol->padBtDroite=0;
                              Scontrol->padBtGauche=1;
                              Scontrol->clavierDroite=SDLK_w;
                              Scontrol->clavierGauche=SDLK_q;
                          }
                          
                          
                          int lire_control(struct S_global *Sglobal)
                          {//lecture des infos de control dans le fichier ***VALIDE***
                          
                              FILE*fichier=fopen("data/control.dat","r");
                          
                              if (fichier==NULL)
                              {//gestion d'erreur
                                  printf("Err ouverture de control.dat\n");
                                  return(0);
                              }
                          
                              rewind(fichier);
                          
                              fscanf(fichier,"%d %d %d %d %d %d %d %d",&Sglobal->Scontrol->modeControl,
                                                                      &Sglobal->Scontrol->numPad,
                                                                      &Sglobal->Scontrol->padBtDroite,
                                                                      &Sglobal->Scontrol->padBtGauche,
                                                                      &Sglobal->Scontrol->clavierDroite,
                                                                      &Sglobal->Scontrol->clavierGauche,
                                                                      &Sglobal->Sinfos->skin,
                                                                      &Sglobal->Sinfos->tune);
                          
                              fclose(fichier);
                          
                              return(1);
                          }
                          
                          
                          int ecrire_control(struct S_global *Sglobal)
                          {//sauvegarde des infos de control dans le fichier ***VALIDE***
                          
                              FILE *fichier=fopen("data//control.dat","w");
                          
                              if (fichier==NULL)
                              {//gestion d'erreur
                                  printf("Err ouverture de control.dat\n");
                                  return(0);
                              }
                          
                              rewind(fichier);
                          
                              fprintf(fichier,"%d %d %d %d %d %d %d %d\n",Sglobal->Scontrol->modeControl,
                                                                          Sglobal->Scontrol->numPad,
                                                                          Sglobal->Scontrol->padBtDroite,
                                                                          Sglobal->Scontrol->padBtGauche,
                                                                          Sglobal->Scontrol->clavierDroite,
                                                                          Sglobal->Scontrol->clavierGauche,
                                                                          Sglobal->Sinfos->skin,
                                                                          Sglobal->Sinfos->tune);
                          
                              fclose(fichier);
                          
                              return(1);
                          
                          
                          }
                          
                          
                          int lire_score(struct S_score *Sscore)
                          {//lis le fichier des scores ***VALIDE***
                          
                              int i=0;
                              FILE *fichier=fopen("data/scores.dat","r");
                          
                              if (fichier==NULL)
                              {//gestion d'erreur
                                  printf("Err de chargement du fichier des scores.\n");
                                  return(0);
                              }
                          
                              for(i=0;i<10;i++)
                              {//lecture du fichier
                                  placerCurs(fichier,i);
                                  fgets(Sscore->score[i],20,fichier);
                              }
                          
                              fclose(fichier);
                              return(1);
                          }
                          
                          
                          int ecrire_score(struct S_score *Sscore)
                          {//ecris le fichier des scores ***VALIDE***
                          
                              int i=0;
                              FILE *fichier=fopen("data/scores.dat","w");
                          
                              if (fichier==NULL)
                              {//gestion d'erreur
                                  printf("Err de creation du fichier des scores.\n");
                                  return(0);
                              }
                          
                              for(i=0;i<10;i++)
                              {//ecriture du fichier
                                 fprintf(fichier,"%s",Sscore->score[i]);
                              }
                          
                              fclose(fichier);
                              return(1);
                          
                          }
                          
                          
                          int init_score(struct S_score *Sscore)
                          {//initialise les scores en cas d'erreur d'ouverture du fichier scores ***VALIDE***
                          
                              int i=0;
                          
                              for(i=0;i<10;i++)
                              {//remplissage des scores par défaut
                                  sprintf(Sscore->score[i],"aaa %d\n",10*i);
                              }
                          
                              return(1);
                          }
                          
                          
                          int placerCurs(FILE *fichier, int ligne)
                          {//placement curseur dans fichier ***VALIDE***
                          
                              int i=0;
                              rewind(fichier);
                              char lettre='*';
                          
                              while (i<ligne && lettre!=EOF)
                              {
                                  lettre=fgetc(fichier);
                          
                                  if (lettre=='\n')
                                      i++;
                              }
                              return(ftell(fichier));
                          }
                          
                          
                          void pad_set (S_control *Scontrol)
                          {//attribution des pads branchés ***VALIDE***
                          
                              int i=0;
                          
                              Scontrol->joy=new SDL_Joystick*[SDL_NumJoysticks()];
                          
                              if (Scontrol->joy==NULL)
                              {
                                  printf("Err reservation memoire\n");
                                  exit(EXIT_FAILURE);
                              }
                          
                              for(i=0;i<SDL_NumJoysticks();i++)
                              {
                                  Scontrol->joy[i]=SDL_JoystickOpen(i);
                              }
                          }
                          
                          
                          void pad_reset (S_control *Scontrol)
                          {//libération des pads ***VALIDE***
                          
                              int i=0;
                          
                                  for(i=0;i<SDL_NumJoysticks();i++)
                                  {
                                      SDL_JoystickClose(Scontrol->joy[i]);
                                  }
                          }
                          
                          
                          int compare_score(int score, S_score *Sscore)
                          {//détermine la position du score ***VALIDE***
                          
                              int i=9;
                          
                              if (score>=char_to_int(&Sscore->score[9][4]))
                              {
                                  while (score>char_to_int(&Sscore->score[i][4]) && i>-1)
                                  {
                                      i--;
                                  }
                              }
                              else
                                  return(-2);
                          
                          
                              return(i+1);
                          }
                          
                          
                          int char_to_int(const char text[])
                          {//transcodage char[] en int ***VALIDE***
                          
                              int i=0,//temporaire de boucle.
                                  exp=1,//poid du digit.
                                  result=0;//resultat.
                          
                              for(i=strlen(text)-2;i>=0;i--)
                              {
                                  result+=(text[i]-48)*exp;
                                  exp=exp*10;
                              }
                          
                              return (result);
                          }
                          
                          
                          void save_record(S_score *Sscore,char nom[],int rank,int score)
                          {//calage du nouveau score. ***VALIDE***
                          
                              int i=0;
                          
                              for (i=9;i>=rank;i--)
                              {
                                  strcpy(Sscore->score[i],Sscore->score[i-1]);
                              }
                          
                              sprintf(Sscore->score[rank],"%s %d\n",nom,score);
                          }
                          
                          
                          void switch_screen(SDL_Surface *ecran,S_global *Sglobal)
                          {//passage en fullscreen ***VALIDE***
                          
                              switch (Sglobal->Sinfos->fullscreen)
                                      {
                                          case false :
                                          {
                                              SDL_FreeSurface(ecran);
                          
                                              ecran = SDL_SetVideoMode(TAILLE_BLOCK*NB_BLOCK_LARG+240, TAILLE_BLOCK*NB_BLOCK_HAUT, 32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
                          
                                              if (ecran==NULL)
                                              {//defaut de creation de la fenetre.
                                                  printf("MAIN / Err init fenetre %s\n", SDL_GetError());
                                                  exit(EXIT_FAILURE);
                                              }
                                              Sglobal->Sinfos->fullscreen=true;
                                          }
                                          break;
                          
                                          case true :
                                          {
                                              SDL_FreeSurface(ecran);
                          
                                              ecran = SDL_SetVideoMode(TAILLE_BLOCK*NB_BLOCK_LARG+240, TAILLE_BLOCK*NB_BLOCK_HAUT, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
                          
                                              if (ecran==NULL)
                                              {//defaut de creation de la fenetre.
                                                  printf("MAIN / Err init fenetre %s\n", SDL_GetError());
                                                  exit(EXIT_FAILURE);
                                              }
                                              Sglobal->Sinfos->fullscreen=false;
                                          }
                                          break;
                                      }
                          }
                          
                          
                          char *FSOUND_Err(int valeur)
                          {//transformation des erreurs FSOUND en text ***VALIDE***
                              switch (valeur)
                              {
                                  case FMOD_ERR_NONE :
                                      return ("no default");
                                      break;
                          
                                  case FMOD_ERR_BUSY :
                                      return ("Cannot call this command after FSOUND_Init. Call FSOUND_Close first.");
                                      break;
                          
                                  case FMOD_ERR_UNINITIALIZED :
                                      return ("This command failed because FSOUND_Init or FSOUND_SetOutput was not called");
                                      break;
                          
                                  case FMOD_ERR_INIT:
                                      return("Error initializing output device.");
                                      break;
                          
                                  case FMOD_ERR_ALLOCATED:
                                      return("Error initializing output device, the output device is already in use and cannot be reused");
                                      break;
                          
                                  case FMOD_ERR_PLAY:
                                      return("Playing the sound failed");
                                      break;
                          
                                  case FMOD_ERR_OUTPUT_FORMAT:
                                      return("Soundcard does not support the features needed for this soundsystem (16bit stereo output)");
                                      break;
                          
                                  case FMOD_ERR_COOPERATIVELEVEL:
                                      return("Error setting cooperative level for hardware");
                                      break;
                          
                                  case FMOD_ERR_CREATEBUFFER:
                                      return("Error creating hardware sound buffer");
                                      break;
                          
                                  case FMOD_ERR_FILE_NOTFOUND:
                                      return("File not found");
                                      break;
                          
                                  case FMOD_ERR_FILE_FORMAT:
                                      return("Unknown file format");
                                      break;
                          
                                  case FMOD_ERR_FILE_BAD:
                                      return("Error loading file");
                                      break;
                          
                                  case FMOD_ERR_MEMORY:
                                      return("Not enough memory or resources");
                                      break;
                          
                                  case FMOD_ERR_VERSION:
                                      return("The version number of this file format is not supported");
                                      break;
                          
                                  case FMOD_ERR_INVALID_PARAM:
                                      return("An invalid parameter was passed to this function");
                                      break;
                          
                                  case FMOD_ERR_NO_EAX:
                                      return("Tried to use an EAX command on a non EAX enabled channel or output");
                                      break;
                          
                                  case FMOD_ERR_CHANNEL_ALLOC:
                                      return("Failed to allocate a new channel");
                                      break;
                          
                                  case FMOD_ERR_RECORD:
                                      return("Recording is not supported on this machine");
                                      break;
                          
                                  case FMOD_ERR_MEDIAPLAYER:
                                      return("Windows Media Player not installed so cannot play wma or use internet streaming");
                                      break;
                          
                                  case FMOD_ERR_CDDEVICE:
                                      return("An error occured trying to open the specified CD device");
                                      break;
                              }
                          
                              return(NULL);
                          }
                          


                          et voilà...
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Bonhomme !! | Jeu de plateforme : Prototype.

                            11 mai 2011 à 16:10:35

                            Une fonction de 374 lignes :/ ? Tu devrais essayer de decouper ca ;)

                            @paraze: Pourrais-tu changer le tableau sur le premier poste s'il te plait? :) (c'est note que mon projet est Shaak et celui de tsunami SDFx, alors que c'est l'inverse)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 mai 2011 à 16:16:02

                              re,
                              tu parles de la fonction jeu ?
                              il y a beaucoup de déclarations, la boucle en fait dans les 150 lignes, ça m'a semblé correct...

                              Il y a à peine une grosse douzaine de tests, après il est sûr qu'espacer
                              et indenter ( { =1 ligne ?) pour essayer de rendre le code lisible, c'est forcément consommateur de ligne. Malgré ce petit bémol que je prendrai en compte sur mes prochains développements, je pense avoir suffisamment eclairci et commenté le code pour que ça reste compréhensible.

                              Comme je ne suis pas programmeur PC à la base (automaticien en fait...) je n'ai pas encore les reflexes adaptés pour tout découper, ça viendra surement ^^.

                              Pour la petite histoire, un collègue avait développé une communication pour passer des recettes à des variateurs en CAN sur automate schneider. Quand il a fallu revenir dessus presque 5 ans après, personne n'a pu relire, y compris lui même. J'ai transformé sa centaine de lignes en presque 400 lignes, et tout est devenu plus clair pour tout le monde, comme quoi, des fois ;) .
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Bonhomme !! | Jeu de plateforme : Prototype.

                                11 mai 2011 à 16:21:42

                                @shamanas : Voila, j'ai édité.
                                @drx : Merci de ta participation mais quand tu dis que 374 lignes (même que 150), c'est correcte, je te conseille de lire ceci : http://www.siteduzero.com/membres-294-214198.html#bio
                                En gros, tes fonctions doivent faire moins de 50 lignes (50 étant le max du maximum). ^^
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  11 mai 2011 à 17:49:01

                                  Ce n'est pas absolu mai il vaut mieux, oui. Sinon, pourquoi tu a nomme tes fichiers .cpp? Les seuls elements de c++ que je vois sont le type bool (peut ausii etre trouve dans stdbool.h, qui est dans le standard C99) et les new et delete. Autant inclure stdbool.h et utiliser malloc et free si c'est les seuls avantages de C++ que tu utilises non?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    11 mai 2011 à 18:04:03

                                    Citation : shamanas

                                    Ce n'est pas absolu mai il vaut mieux, oui. Sinon, pourquoi tu a nomme tes fichiers .cpp? Les seuls elements de c++ que je vois sont le type bool (peut ausii etre trouve dans stdbool.h, qui est dans le standard C99) et les new et delete. Autant inclure stdbool.h et utiliser malloc et free si c'est les seuls avantages de C++ que tu utilises non?


                                    +1
                                    Et tu peux aussi faire comme moi : typedef enum{FALSE, TRUE}Bool; ^^
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      11 mai 2011 à 18:12:34

                                      heu..
                                      pour le c++, c'est bête mais quand je fais la SDL, code::blocks crée des fichiers CPP tout seul et je n'y avais pas fait attention, et comme ça marchait quand même, je ne me suis pas posé plus de question que ça.
                                      Puis surtout j'étais parti pour le faire en C++, mais j'ai eu peur de ne pas avoir le temps d'assimiler le cours ET développer le jeu pour le 1er Mai, du coup j'ai pas rechangé ensuite... désolé.

                                      Et aussi, c'est votre avis sur la gestion des erreurs qui m'intéresserait, parce qu'avec le exit(EXIT_FAILURE), on ne passe pas par les libérations, du coup, j'ai pris l'option de de shunter la boucle en cas d'erreur pour faire les libérations quand même.
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Bonhomme !! | Jeu de plateforme : Prototype.

                                        11 mai 2011 à 18:26:47

                                        Salut !

                                        Pour que le programme libère la sdl (et d'autres choses si tu veux) toute seule quand tu quitte le programme, utilise ceci : atexit(SDL_Quit);

                                        Bonne chance !
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          11 mai 2011 à 18:29:06

                                          Citation : paraze

                                          Salut !

                                          Pour que le programme libère la sdl (et d'autres choses si tu veux) toute seule quand tu quitte le programme, utilise ceci : atexit(SDL_Quit);

                                          Bonne chance !



                                          Hm fait plutôt une fonction cleanup de type void ou tu met toute les libération de mémoire
                                          puis tu appelle cette fonction avec atexit

                                          a+
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            11 mai 2011 à 18:33:02

                                            Oui, enfin, pour que tout ce fasse tout seul sans qu'il ait à faire 20000 appels de fonction, il faut utiliser atexit (je voulais juste lui montrer la fonction atexit). ^^
                                            Sinon, tu as raison.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              11 mai 2011 à 23:57:49

                                              Citation : informaticienzero

                                              Tu utilise quel IDE ?

                                              Citation : paraze

                                              Voici la démarche à suivre pour configurer Code::Blocks : Project => Build options => clique en haut à gauche sur le nom de ton projet => onglet "Compiler settings" => sous-onglet "Other options".
                                              Ensuite, vous pouvez ajouter les options de compilation souhaitées.
                                              Enfin, faites "Régénérer" (Ctrl + F11).

                                              Voici la démarche à suivre pour configurer Microsoft Visual C++ : Propriétés du projet => C/C++ => général.
                                              Ensuite, vous pouvez mettre le niveau (level) de warning à 4.



                                              J'utilise Code Blocks et j'ai réussi à mettre les options de compilation données dans le premier post mais je tourne toujours avec autant de warning ! J'en ai 231 pour l'instant. En ce moement votre tête doit sûrement ressembler à ça : :waw:
                                              Mais je vous arrête tout de suite c'est à cause d'un switch sur un event. Il me sort 231 warnings sur la même ligne. Celle du dernier break du switch et là il me dit par exemple :
                                              warning : enumeration value 'SDLK_LAST' not handeld in switch
                                              Et il me met ça pour chacun des événements non testés.
                                              Quelqu'un pourrait m'expliquer svp ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              qry = 2b || !2b
                                                12 mai 2011 à 0:19:12

                                                Ajoute un default au(x) switch(s).
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  12 mai 2011 à 0:33:23

                                                  Citation : reino

                                                  Ajoute un default au(x) switch(s).


                                                  Merci beaucoup c'est bien mieux comme ça ! :D
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  qry = 2b || !2b
                                                    12 mai 2011 à 11:43:15

                                                    Apres plusieures heures de debuggage et d'innombrables essais de comprendre les algorithmes concernes, j'ai enfin reussi a coder (et comprendre) la convolution 2d :D Grace a la convolution, j'ai implementer le filtre de detection de bords de Sobel et je vais sans doute implementer plus d'effets bases sur la convolution :)
                                                    J'edite mon post avec le nouveau code et j'upload les sources ainsi que l'executable linux 32 bits :D

                                                    PS: J'ai aussi ajoute plusieurs commentaires :)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      12 mai 2011 à 12:14:13

                                                      Citation : shamanas

                                                      Apres plusieures heures de debuggage et d'innombrables essais de comprendre les algorithmes concernes, j'ai enfin reussi a coder (et comprendre) la convolution 2d :D Grace a la convolution, j'ai implementer le filtre de detection de bords de Sobel et je vais sans doute implementer plus d'effets bases sur la convolution :)


                                                      Il y avait un bon tuto de NoHaR sur le sujet, mais il a disparu (en cours de réécriture).
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        12 mai 2011 à 15:33:10

                                                        Pour la prochaine version de sdfx, je prepare une nouvelle interface, avec des checkbox, comme ca on peut avoir plusieurs effets actives en meme temps :) Sinon, j'ai aussi implemente les effets sharpen et emboss

                                                        Voila, nouveau menu implemente :)
                                                        J'edite avec le nouveau code
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          12 mai 2011 à 22:07:15

                                                          Bonjour, je viens de découvrir ce topic, peut on encore s'inscrire ?

                                                          Je suis encore un peu nouveau et je connais un peu le C depuis quelques mois grâce au cours de m@theo, ou je me suis un peu planté lors du sokoban :'(

                                                          Mais en ce moment et ce depuis quelques jours je me suis mis sur un casse-brique avec la SDL, bon il n'est pas encore jouable pour l'instant, mais on peut déjà déplacer la barre avec une boule dessus :D (reste à la faire casser les blocs et rebondir).

                                                          Si on peut encore s'inscrire, j'aimerais donner un but à ce projet, même si je suis débutant je veux participer !
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            12 mai 2011 à 22:09:17

                                                            Bien sur que tu peux t'inscrire :) Presente juste ton programme de la meme facon que tout le monde ;)
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              12 mai 2011 à 22:12:25

                                                              Je le présente comment ?

                                                              screen ? code source ?
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              [Concours] Après la console, place à la SDL

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown