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

 C Discussion :

[SDL]Listes et SDL


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut [SDL]Listes et SDL
    Bonsoir à tous !

    Voilà, j'ai un petit probleme en C et SDL.
    En effet, j'ai creer une liste chainée où mes noeuds sont composés d'une information couleur (R,V,B) (valeur entiere).
    J'aimerai utiliser la SDL pour afficher mes noeuds et donc les couleurs de chacun d'entres eux.
    J'ai utilisé la fonction SDL_FillRect en l'inscrustant dans une fonction spécialement dédiée.
    Avec le code ci-dessous mes trois noeuds s'affichent bien mais ne restent pas à l'écran, le bleu arrive puis disparait tres vite, le blanc arrive et puis le rouge. En gros ca fait un effet clignotant. J'aimerai que mes trois noeuds s'affichent en même temps et ne disparaissent pas.

    Voici ma fonction:

    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
     
    void afficheNoeudListeCoul(noeud *pListe)
    {
    	noeud *pTemp;
     
    	SDL_Surface *rectangle = NULL, *screen = NULL;
    	SDL_Rect position;
    	Uint8  video_bpp = 0;
    	Uint32 videoflags = SDL_SWSURFACE;
    	screen=SDL_SetVideoMode(300,30, video_bpp, videoflags);
    	SDL_WM_SetCaption("Listes", NULL);
    	rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
     
    	position.x=100;
    	position.y=5;
     
    	pTemp = pListe;
    	while(pTemp)
    	{
    		position.x = position.x + 20;
    		SDL_FillRect(rectangle, NULL, SDL_MapRGB(screen->format,pTemp->coul.R,pTemp->coul.V, pTemp->coul.B));
    		SDL_BlitSurface(rectangle, NULL, screen, &position); 
    		SDL_Flip(screen);
    		pTemp = pTemp->pSuivant; 
    		afficheNoeudListeCoul(pTemp);
     
    	}
    	SDL_Flip(screen);
    	SDL_FreeSurface(rectangle);
     
    }

    Et voici mon main :

    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
     
    int main(int argc, char *argv[])
    {
    	SDL_Surface *rectangle = NULL, *screen = NULL;
    	Uint32 initflags = SDL_INIT_VIDEO;  /* See documentation for details */
    	Uint8  video_bpp = 0;
    	Uint32 videoflags = SDL_SWSURFACE;
    	int    done;
    	SDL_Event event;
    	noeud * pListe = NULL;
    	/* -----------------------CREATION DE LA PLISTE  ---------------------------------*/
    	/* creation du premier noeud */
    	if((pListe = creerNoeudListe(0,0,255,"bleu")) == NULL)
    		return(0);
     
    	/* creation du deuxieme noeud */
    	if((pListe->pSuivant = creerNoeudListe(255,255,255,"blanc")) == NULL)
        {
    		detruireNoeudListe(&pListe);
    		return(0);
        }
     
    	/* creation du troisieme noeud */
    	if((pListe->pSuivant->pSuivant = creerNoeudListe(255,0,0,"rouge")) == NULL)
        {
    		detruireNoeudListe(&pListe);
    		return(0);
        }
     
    screen=SDL_SetVideoMode(640,480, video_bpp, videoflags);
     
    	if (screen == NULL) {
    		fprintf(stderr, "Couldn't set 640x480x%d video mode: %s\n",
    				video_bpp, SDL_GetError());
    		SDL_Quit();
    		exit(2);
    	}
    	if ( SDL_Init(initflags) < 0 ) {
    		fprintf(stderr, "Couldn't initialize SDL: %s\n",
    				SDL_GetError());
    		exit(1);
    	}
     
    afficheNoeudListeCoul(pListe);
     
    done = 0;
    	while ( !done ) {
     
    		/* Check for events */
    		while ( SDL_PollEvent(&event) ) {
    			switch (event.type) {
     
    				case SDL_MOUSEMOTION:
    					break;
    				case SDL_MOUSEBUTTONDOWN:
    					break;
    				case SDL_KEYDOWN:
    					/* Any keypress quits the app... */
    				case SDL_QUIT:
    					done = 1;
    					break;
    				default:
    					break;
    			}
    		}
    	}
    	SDL_Quit();
    	return(0);
    }
    Je sais, il y a pas mal de ligne pour un post mais je ne voudrai rien louper.
    Auriez-vous une idée ou voir même une solution ?
    Merci pour votre aide !

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Le code posté ne compile pas, du coup, on teste moins bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    08-10-14.c:3: error: parse error before '*' token
    08-10-14.c: In function `afficheNoeudListeCoul':
    08-10-14.c:5: error: `noeud' undeclared (first use in this function)
    08-10-14.c:5: error: (Each undeclared identifier is reported only once
    08-10-14.c:5: error: for each function it appears in.)
    08-10-14.c:5: error: `pTemp' undeclared (first use in this function)
    08-10-14.c:19: error: `pListe' undeclared (first use in this function)
    08-10-14.c: In function `main':
    08-10-14.c:46: error: `noeud' undeclared (first use in this function)
    08-10-14.c:46: error: `pListe' undeclared (first use in this function)
    Sinon, afficheNoeudListeCoul s'appelle elle même en fin de boucle while. Est-ce vraiment voulu ? car du coup, on efface la position du carré qu'on veut dessiner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(pTemp) {
      position.x = position.x + 20;
      SDL_FillRect(rectangle, NULL, SDL_MapRGB(screen->format, pTemp->coul.R, pTemp->coul.V, pTemp->coul.B));
      SDL_BlitSurface(rectangle, NULL, screen, &position); 
      SDL_Flip(screen);
      pTemp = pTemp->pSuivant; 
    }
    Voici le code avec lequel j'ai testé :
    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
    void afficheNoeudListeCoul()
    {
        size_t i;
        SDL_Surface *rectangle = NULL, *screen = NULL;
        SDL_Rect position;
        Uint8 video_bpp = 0;
        Uint32 videoflags = SDL_SWSURFACE;
        screen = SDL_SetVideoMode(300, 30, video_bpp, videoflags);
        SDL_WM_SetCaption("Listes", NULL);
        rectangle =
            SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
     
        position.x = 100;
        position.y = 5;
     
        for (i = 0; i < 256; i += 32) {
            position.x += 21;
            SDL_FillRect(rectangle, NULL,
                         SDL_MapRGB(screen->format, 255 - i, i, i));
            SDL_BlitSurface(rectangle, NULL, screen, &position);
            SDL_Flip(screen);
        }
     
        SDL_Flip(screen);
        SDL_FreeSurface(rectangle);
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut
    Oui c'est voulu pour l'appel récursif car je veux afficher tous les noeuds de ma liste :s
    Et ca ne compile pas car je n'ai pas donné toutes les fonctions et structures de mon programme (ca ferait un peu trop de code).
    Je pense aussi que le problème est du à la récursivité mais au dernier appel de ma fonction le dernier carré devrait rester alors que dans mon cas il disparait aussi.

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par ceetix Voir le message
    Oui c'est voulu pour l'appel récursif car je veux afficher tous les noeuds de ma liste :s
    Mais cela ne fait pas ce qui est voulu :

    On commence dans un premier afficheNoeudListeCoul à afficher les nœuds du premier à la fin, puis dans le deuxième, on demande à afficher eu second au dernier... bref un plat de spagetti. Il faudrait un peu instrumenter le code (ajouter des printf) pour voir comment se déroule l'exécution. Le resultat devrait être bien loin de ce qui est attendu.
    A chaque fois qu'on rentre dans cette fonction, on recrée une fenetre d'affichage... de plus, l'information de décalage (position.x += 20) est perdue à chaque appel de récursion...

    Pour faire un récursion, il faudra séparer afficheNoeudListeCoul en deux partie :
    une première responsable de l'initialisation;
    une second de récursion proprement dite.
    par exemple :
    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
    void init(noeud *n)
    {
    	noeud *pTemp;
    	SDL_Rect pos = {100, 5};
    	SDL_Surface *rectangle = NULL, *screen = NULL;
    	Uint8  video_bpp = 0;
    	Uint32 videoflags = SDL_SWSURFACE;
    	screen=SDL_SetVideoMode(300,30, video_bpp, videoflags);
    	SDL_WM_SetCaption("Listes", NULL);
    	rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
     
    	draw(pListe, pos, rectangle, screen);
     
    	SDL_Flip(screen);
    	SDL_FreeSurface(rectangle);
     
    }
    void draw(noeud *n, SDL_Rect pos, SDL_Surface * rect, SDL_Surface * scr)
    {
        if(NULL == n)
            return;
        pos.x += 20;
        SDL_FillRect(rect, NULL, SDL_MapRGB(screen->format, n->coul.R, n->coul.V, n->coul.B));
        SDL_BlitSurface(rectangle, NULL, scr, &pos); 
        SDL_Flip(screen);
        draw(n->pSuivant, pos, rect, scr);
    }
    Mais pourquoi s'embetter avec une récursion alors que dans le code, il y a déjà ce qu'il faut pour afficher tous les noeuds :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(pTemp) {
      /*...*/
      pTemp = pTemp->pSuivant; 
    }
    Citation Envoyé par ceetix Voir le message
    Et ca ne compile pas car je n'ai pas donné toutes les fonctions et structures de mon programme (ca ferait un peu trop de code).
    Oui mais un code qui ne compile ne nous apprend pas toujours ce qu'on veut sur le problème.
    Ce qu'il faut faire, c'est élaguer le code jusqu'à avoir un code qui compile, mais où le problème reste présent.
    Citation Envoyé par ceetix Voir le message
    Je pense aussi que le problème est du à la récursivité mais au dernier appel de ma fonction le dernier carré devrait rester alors que dans mon cas il disparait aussi.
    Il faut instrumenter plutôt que supposer, ou suivre au debogueur.

    De mon côté, je suppose que le problème vient du dernier appel à la fonction qui crée une surface mais ne dessine aucun noeud dedans. (Je dis que je suppose car je ne peux pas le tester.)

    Petit exemple d'instrumentation :

    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
     
    void afficheNoeudListeCoul(noeud *pListe)
    {
    	noeud *pTemp;
     
    	SDL_Surface *rectangle = NULL, *screen = NULL;
    	SDL_Rect position;
    	Uint8  video_bpp = 0;
    	Uint32 videoflags = SDL_SWSURFACE;
     
            printf("creation de screen\n");
    	screen=SDL_SetVideoMode(300,30, video_bpp, videoflags);
    	SDL_WM_SetCaption("Listes", NULL);
     
            printf("creation de rectangle\n");
    	rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
     
    	position.x=100;
    	position.y=5;
     
    	pTemp = pListe;
    	while(pTemp)
    	{
    		position.x = position.x + 20;
     
                    printf("tracé d'un noeud\n");
    		SDL_FillRect(rectangle, NULL, SDL_MapRGB(screen->format,pTemp->coul.R,pTemp->coul.V, pTemp->coul.B));
    		SDL_BlitSurface(rectangle, NULL, screen, &position); 
    		SDL_Flip(screen);
    		pTemp = pTemp->pSuivant; 
     
                    printf("appel de afficheNoeudListeCoul\n");
    		afficheNoeudListeCoul(pTemp);
    	}
    	SDL_Flip(screen);
    	SDL_FreeSurface(rectangle);
     
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 50
    Par défaut
    Merci pour ton aide mabu !
    C'est très gentil de ta part !
    Je vais essayer de voir ca dès que j'ai le temps et je reposterai pour te dire si j'ai reussi ou non !

Discussions similaires

  1. [SDL / openGL] Affichage SDL 2D et OpenGL
    Par Naelhem dans le forum SDL
    Réponses: 5
    Dernier message: 12/10/2006, 14h35
  2. [FAQ][SOURCE][SDL] Souris sous SDL
    Par fearyourself dans le forum Contribuez
    Réponses: 2
    Dernier message: 01/08/2006, 20h08
  3. [SDL] Integration fenetre SDL dans fenetre C# ?
    Par salammbo dans le forum OpenGL
    Réponses: 3
    Dernier message: 07/02/2005, 09h47

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