IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

[SDL] Problème jeu de labyrinthe


Sujet :

SDL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 4
    Points
    4
    Par défaut [SDL] Problème jeu de labyrinthe
    Bonjour,
    comme le titre l'indique je suis en train de faire un jeu de labyrinthe avec la SDL en C , mais j'ai rencontré un probleme au cours du developpement de celui-ci , plus precisément lors du chargement de la map du labyrinthe , si quelqu'un se sent le courage de regarder un peu mon code source
    (l'erreur n'est pas une erreure de compilation mais d'execution , a la fin du chargement de la map le programme reste en bug il ne fait rien et finit par planter...,) je sais deja que l'erreur est autour de ma fonction charger

    :
    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <iostream>
    #include <SDL/SDL.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "charger.h"
    #include "constantes.h"
    #include "bouger.h"
     
    int main(int argc,char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_Rect position_joueur;
        int carte[32][32] = {0};
        int continuer = 1;
        SDL_Event event;
        int erreure = AUTRES,fin = 1,i=1;
        while(fin)
        {
        position_joueur = charger_terrain(i,&carte);
        while(continuer)
        {
        SDL_WaitEvent(&event);
        return EXIT_SUCCESS;
        switch(event.type)
        {
                          case SDL_QUIT:
                               return 0;
                               break;
                          case SDL_KEYDOWN:
                               switch(event.key.keysym.sym)
                               {
                                                           case SDLK_a:
                                                                erreure = bouger(GAUCHE,&carte,position_joueur);
                                                                if(erreure == VICTOIRE)
                                                                {
                                                                           i++;
                                                                           position_joueur = charger_terrain(i,&carte);
                                                                }
                                                                break;
                                                           case SDLK_d:
                                                               erreure = bouger(DROITE,&carte,position_joueur);
                                                               if(erreure == VICTOIRE)
                                                                {
                                                                           i++;
                                                                           position_joueur = charger_terrain(i,&carte);
                                                                }
                                                               break;
                                                           case SDLK_w:
                                                                erreure = bouger(HAUT,&carte,position_joueur);
                                                                if(erreure == VICTOIRE)
                                                                {
                                                                            i++;
                                                                           position_joueur = charger_terrain(i,&carte);
                                                                }
                                                                break;
                                                           case SDLK_s:
                                                                erreure = bouger(BAS,&carte,position_joueur);
                                                                if(erreure == VICTOIRE)
                                                                {
                                                                            i++;
                                                                           position_joueur = charger_terrain(i,&carte);
                                                                }
                                                                break;
                               }
                               break;
                          default :
                               break;
        }//switch
       }//while   continuer
      }//while   fin
       SDL_Delay(1500);
    }
    charger.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include "constantes.h"
    #include <iostream>
    #include <SDL/SDL.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "charger.h"
    SDL_Rect charger_terrain(int niveau,int (*carte_Virtuelle)[32][32])
    {
        char nomfich[500];
        int caractereLU = 0;
        sprintf(nomfich,"labyrinthe%d.txt",niveau);
        SDL_Surface *mur,*vide,*bonhome,*ok,*ecran,*pos_bas;
        SDL_Rect position,positionFond,position_player;
        position.x = 0;
        position.y=0;
        ecran = SDL_SetVideoMode(990,990,32,SDL_HWSURFACE);
        mur = SDL_LoadBMP("mur.bmp");
        pos_bas = SDL_LoadBMP("perso_droite.bmp");
        vide = SDL_LoadBMP("vide.bmp");
        ok = SDL_LoadBMP("ok.bmp");
        FILE* fichier = NULL;
        int continuer = 1;
        fichier = fopen(nomfich,"r");
        while(continuer)
        {
          caractereLU = fgetc(fichier);
     
          if(caractereLU == '\n')
          {
                           position.y+=30;
                           position.x=0;
          }
     
          if(caractereLU == 'a')
          {
                SDL_BlitSurface(vide,NULL,ecran,&position); 
                (*carte_Virtuelle)[position.x/30][position.y/30] =   VIDE;
                position.x+=30;   
     
          }
          if(caractereLU == 'b')
          {
                SDL_BlitSurface(mur,NULL,ecran,&position);   
                (*carte_Virtuelle)[position.x/30][position.y/30] =   MUR; 
                position.x+=30;   
     
          }
          if(caractereLU == 'c')
          {
                SDL_BlitSurface(ok,NULL,ecran,&position);    
                (*carte_Virtuelle)[position.x/30][position.y/30] =   OK;
                position.x+=30;   
     
          }
          if(caractereLU == 'j')
          {
               position_player.x = position.x;
               position_player.y = position.y;
               SDL_BlitSurface(pos_bas,NULL,ecran,&position);
               (*carte_Virtuelle)[position.x/30][position.y/30] = DROITE;  
               position.x+=30; 
          }
          if(caractereLU == 'EOF')
          {
               SDL_SaveBMP(ecran,"map.bmp");
               return position_player;
          }
          SDL_Flip(ecran);
        }
    }



    l'erreur e trouve dans ce fichier source je pense , car l'mage map.bmp ne veut pas s'enregistrer et grâce a des tests.


    bouger.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <SDL/SDL.h>
    #include "constantes.h"
    #include "bouger.h"
     
    int bouger(int mouvement,int (*carte_Virtuelle)[32][32],SDL_Rect* position_joueur)
    {
     
         SDL_Surface *perso_gauche=NULL,*perso_droite=NULL,*perso_bas=NULL,*perso_haut=NULL,*ecranFOND,*ecran;
         ecranFOND = SDL_LoadBMP("map.bmp");
         ecran = SDL_SetVideoMode(990,990,32,SDL_HWSURFACE);
         SDL_Rect positionFond;
         positionFond.x = 0;
         positionFond.y = 0;
         perso_gauche = SDL_LoadBMP("perso_gauche.bmp");
         perso_droite = SDL_LoadBMP("perso_droite.bmp");
         perso_bas = SDL_LoadBMP("perso_bas.bmp");
         perso_droite = SDL_LoadBMP("perso_droite.bmp");
         SDL_BlitSurface(ecranFOND,NULL,ecran,&positionFond);
         if(mouvement == BAS)
         {
                      if((*carte_Virtuelle)[(position_joueur->x/30)][(position_joueur->y/30)+30] == MUR)
                      {
                          return ERROR;
                      }
                      if((*carte_Virtuelle)[(position_joueur->x/30)][(position_joueur->y/30)+30] == OK)
                      {
                          return VICTOIRE;
                      }
                      position_joueur->y += 30;
                      SDL_BlitSurface(perso_bas,NULL,ecran,position_joueur);
                      (*carte_Virtuelle)[position_joueur->x/30][position_joueur->y/30] = BAS;
         }
         if(mouvement == HAUT)
         {
                      if((*carte_Virtuelle)[(position_joueur->x/30)][(position_joueur->y/30)-30] == MUR)
                      {
                          return ERROR;
                      }
                      if((*carte_Virtuelle)[(position_joueur->x/30)][(position_joueur->y/30)-30] == OK)
                      {
                          return VICTOIRE;
                      }
                      position_joueur->y -= 30;
                      SDL_BlitSurface(perso_droite,NULL,ecran,position_joueur);
                      (*carte_Virtuelle)[position_joueur->x/30][position_joueur->y/30] = HAUT;
         }
         if(mouvement == GAUCHE)
         {
                      if((*carte_Virtuelle)[(position_joueur->x/30)-30][(position_joueur->y/30)] == MUR)
                      {
                          return ERROR;
                      }
                      if((*carte_Virtuelle)[(position_joueur->x/30)-30][(position_joueur->y/30)] == OK)
                      {
                          return VICTOIRE;
                      }
                      position_joueur->x -= 30;
                      SDL_BlitSurface(perso_gauche,NULL,ecran,position_joueur);
                      (*carte_Virtuelle)[position_joueur->x/30][position_joueur->y/30] = GAUCHE;
     
         }
         if(mouvement == DROITE)
         {
                      if((*carte_Virtuelle)[(position_joueur->x/30)+30][(position_joueur->y/30)] == MUR)
                      {
                          return ERROR;
                      }
                      if((*carte_Virtuelle)[(position_joueur->x/30)+30][(position_joueur->y/30)] == OK)
                      {
                          return VICTOIRE;
                      }
                      position_joueur->x += 30;
                      SDL_BlitSurface(perso_droite,NULL,ecran,position_joueur);
                      (*carte_Virtuelle)[position_joueur->x/30][position_joueur->y/30] = DROITE;
     
         }
     
    }


    Merci de votre aide,

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonjour,

    Voici quelques remarques sur ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SDL_Init(SDL_INIT_VIDEO);
    Il faut tester le retour de la fonction SDL_Init. C'est aussi une mauvaise idée de mettre cet appel au début, on le voit mal...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SDL_WaitEvent(&event);
    Idem, faut tester le retour de la fonction.

    Je ne regarde pas la suite de ce ficher, t'as mis un return...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        ecran = SDL_SetVideoMode(990,990,32,SDL_HWSURFACE);
        mur = SDL_LoadBMP("mur.bmp");
        pos_bas = SDL_LoadBMP("perso_droite.bmp");
        vide = SDL_LoadBMP("vide.bmp");
        ok = SDL_LoadBMP("ok.bmp");
    ...
        fichier = fopen(nomfich,"r");
    Il faut tester le retour de chaque fonction.

    Enfin, cette fonction n'a pas vraiment de sens. Il faut ouvrir la fenêtre séparément que charger une texture. Sinon tu ne peux que l'ouvrir une fois. Ensuite, il faut remplir la structure et faire une fonction qui, à partir de la structure, affiche le labyrinthe. Faire comme tu fais ne fera que dupliquer le même code...

    Dernier point, il faut libérer les surfaces créées avec SDL_FreeSurface.


    Dernier fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int bouger(int mouvement,int (*carte_Virtuelle)[32][32],SDL_Rect* position_joueur)
    {
     
         SDL_Surface *perso_gauche=NULL,*perso_droite=NULL,*perso_bas=NULL,*perso_haut=NULL,*ecranFOND,*ecran;
         ecranFOND = SDL_LoadBMP("map.bmp");
         ecran = SDL_SetVideoMode(990,990,32,SDL_HWSURFACE);
    Donc là tu ouvres de nouveau la fenêtre ? Ce n'est pas logique...

    Il faudrait aussi voir tes autres fichiers, un projet minimal, compilable et qui expose bien le problème et ce qu'on veut qu'il fasse est la meilleure solution.

    Jc

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Non mais c'est bon ca marche ,
    merci quand même.

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Gottfried
    Non mais c'est bon ca marche ,
    merci quand même.
    Quel était le problème alors ?

    Et ensuite ?

    Jc

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 5
    Points : 4
    Points
    4
    Par défaut reponse
    J'ai remplace 'EOF' par un symbole : '*' et ca a marche.Mais j'ai tout de même modifie un bon nombre de lignes de mon code source après.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Free Pascal] [SDL] Problème SDL - Jeu du Memory
    Par Taazer dans le forum Free Pascal
    Réponses: 7
    Dernier message: 15/11/2014, 22h01
  2. Réponses: 27
    Dernier message: 06/05/2012, 12h07
  3. [SDL] problème de débogage sdl_ttf
    Par mouteb dans le forum SDL
    Réponses: 4
    Dernier message: 08/09/2006, 17h06
  4. [Jeu 2D]Labyrinthe et matrice
    Par Invité dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 05/09/2006, 14h27
  5. [SDL] Problème avec SDL_Flip()
    Par Drannor dans le forum C
    Réponses: 6
    Dernier message: 24/11/2005, 22h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo