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 :

Probleme lors du passage en argument de SDL_Surface *ecran


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 31
    Points
    31
    Par défaut Probleme lors du passage en argument de SDL_Surface *ecran
    Bonjour je suis en train de refaire mon jeu de sudoku en y ajoutant du graphisme avec la librairie SDL, j'ai commencé juste par les fonctions d'initialisations de la sdl et de l'affichage de la grille, mais j'ai un probleme, lorsque je veux faire des fonctions et passer ma surface principale en argument de fonction, ça ne marche plus, quand je debug, d'une fonction à une autre la surface ecran redevient NULL et je ne comprend pas pourquoi.

    Si vous pourriez m'éclairer, je vous remercie d'avance.

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <SDL/SDL.h>
     
     
    /* Structure d'une case de sudoku */
     
    struct case_sudoku{
      int temp[10];   // tableau des possibilités de la case
      int valeur_case; // valeur de la case , 0 si aucune valeur
    };
     
    typedef struct case_sudoku case_sudoku;
     
    /* Variables globales */
     
    SDL_Surface *cases[8]={NULL};
     
    /*Prototypes de fonctions */
     
    void init_grille(case_sudoku tab[][9]);
    void init_sdl(case_sudoku tab[][9],SDL_Surface *ecran,SDL_Surface *grille);
    void aff_grille(case_sudoku tab[][9],SDL_Surface *ecran,SDL_Surface *grille);
    void free_grille(case_sudoku tab[][9],SDL_Surface *grille);
     
    /* Fonction principale */
     
    int main (void) {
     
      case_sudoku tab[9][9];
     
      SDL_Surface *ecran=NULL;
      SDL_Surface *grille=NULL;
     
      init_sdl(tab,ecran,grille);
      init_grille(tab);
      aff_grille(tab,ecran,grille);
     
      while(1);
     
      free_grille(tab,grille);
     
      return 0; 
     
    }
     
     
    void init_sdl(case_sudoku tab[][9],SDL_Surface *ecran,SDL_Surface *grille) {
     
       if(SDL_Init(SDL_INIT_VIDEO)!=0)
       {
         fprintf(stderr,"Erreur d'initialisation de la SDL : %s",SDL_GetError());
         exit(EXIT_FAILURE);
       }
     
       ecran=SDL_SetVideoMode(600,600,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
       if(ecran==NULL)
         {
           fprintf(stderr,"Erreur lors du chargement video : %s",SDL_GetError());
           exit(EXIT_FAILURE);
         }
     
       SDL_WM_SetCaption("Sudoku",NULL);
     
       SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
       SDL_Flip(ecran);
       grille=SDL_LoadBMP("grille.bmp");
       cases[0]=SDL_LoadBMP("1.bmp");
       cases[1]=SDL_LoadBMP("2.bmp");
       cases[2]=SDL_LoadBMP("3.bmp");
       cases[3]=SDL_LoadBMP("4.bmp");
       cases[4]=SDL_LoadBMP("5.bmp");
       cases[5]=SDL_LoadBMP("6.bmp");
       cases[6]=SDL_LoadBMP("7.bmp");
       cases[7]=SDL_LoadBMP("8.bmp");
       cases[8]=SDL_LoadBMP("9.bmp");
     
    }
     
    /* Libère la mémoire */
     
    void free_sdl(case_sudoku tab,SDL_Surface *grille) {
     
      char i;
     
      SDL_FreeSurface(grille);
      for(i=0;i<9;i++)
        SDL_FreeSurface(cases[i]);
      SDL_Quit();
     
    }
     
    /* Initialise la grille à vide */
     
    void init_grille(case_sudoku tab[][9]) {
     
      char i,j,k;
     
      for(i=0;i<9;i++) 
        {
          for(j=0;j<9;j++) 
    	{
    	  for(k=0;k<10;k++)
    	    {
    	      tab[i][j].valeur_case=0; 
    	      tab[i][j].temp[k]=0;
    	    }
    	}
        }
    }
     
    /* Affiche la grille de sudoku */
     
    void aff_grille(case_sudoku tab[][9],SDL_Surface *ecran,SDL_Surface *grille) {
     
      SDL_Rect pos_grille;
      SDL_Rect pos_nbre;
     
      int k,m,l,n;
     
      pos_grille.x=(600/2)-(359/2);
      pos_grille.y=(600/2)-(359/2);
     
      for(k=0,m=9;m<359;m+=39,k++)
        {
          pos_nbre.y=m;
          for(l=0,n=9;n<359;n+=39,l++)
    	{
    	  pos_nbre.x=n;
    	  if((tab[k][l].valeur_case)!=0)
    	    {
    	      SDL_BlitSurface(cases[1],NULL,grille,&pos_nbre);
    	    }
    	}
        }
     
      SDL_BlitSurface(grille,NULL,ecran,&pos_grille); 
      SDL_Flip(ecran);
    }

  2. #2
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut
    La fonction SDL_SetVideoMode crée un pointeur vers une SDL_Surface, donc dans ta fonction c'est le pointeur qui va être modifié, et non la surface vers laquelle il pointe. ()

    Si tu veux récupérer le pointeur *ecran et comme tu as l'air de coder en C, il faut que tu fasse un pointeur de pointeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void init_sdl(case_sudoku tab[][9],SDL_Surface **Pecran, SDL_Surface *grille) {
        ...
        *Pecran = SDL_SetVideoMode(600,600,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
        ...
    }
     
    int main() {
        ...
        init_sdl(tab, &ecran, grille);
        ...
    }
    Bon comme ça fait longtemps que j'ai pas fait ça il y a peut-être une erreur , mais perso je me suis jamais embêté avec ça, j'utilise SDL_GetVideoSurface().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void init_sdl(case_sudoku tab[][9], SDL_Surface *grille) {
        ...
        SDL_SetVideoMode(600,600,32,SDL_HWSURFACE | SDL_DOUBLEBUF); // pas la peine de récupérer la surface
        ...
        SDL_Flip(SDL_GetVideoSurface());
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 68
    Points : 31
    Points
    31
    Par défaut
    Ok merci j'ai compris, j'ai plutôt utilisé des pointeurs de pointeurs et ça marche parfaitement (:

Discussions similaires

  1. Gros probleme de passage d'argument
    Par clemsye dans le forum Ogre
    Réponses: 3
    Dernier message: 06/01/2007, 12h00
  2. Probleme de passage d'arguments
    Par izorus dans le forum C++
    Réponses: 10
    Dernier message: 20/06/2006, 10h32
  3. Problème de passage d'argument a un thread
    Par goof_22 dans le forum SDL
    Réponses: 2
    Dernier message: 19/04/2006, 17h59
  4. probleme sur le passage d'argument par adresse
    Par ghostdog dans le forum C
    Réponses: 4
    Dernier message: 23/11/2005, 15h50
  5. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15

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