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 :

Affichage bizarre dans un menu


Sujet :

SDL

  1. #1
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 551
    Points
    1 551
    Par défaut Affichage bizarre dans un menu
    Hello tout le monde,

    Voici le petit problème qui me tarabuste: l'affichage se fait mal dans un menu! Il ne s'agit pas d'un problème d'algorithme, ou d'un mauvais usage de SDL (enfin, je l'espère), mais j'ai un résultat bizarre à l'écran (c'est la première fois, et pourtant j'utilise régulièmerent SDL).

    Voici une partie du code d'un menu:
    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
    int vmenu(int x,int y,int defval,...)
    {
    	SDL_Rect coo,menuCoo,borderCoo;
     
    	.... // dont calcul des coordonnées du menu dans menuCoo
     
     
    	drawBorder(vg->wnd,borderCoo,MENU_BORDERWIDTH,defaultmenuborderColor,&defaultmenubgColor); // Dessine les bords et remplit le fond du menu
     
    	coo.x=menuCoo.x+vg->spacelen+MENU_BORDERWIDTH;
    	coo.y=menuCoo.y+vg->spacelen+MENU_BORDERWIDTH;
    	coo.w=menuCoo.w-2*vg->spacelen-2*MENU_BORDERWIDTH;
    	coo.h=vg->textheight;
    	for(i=0;i<nitem;coo.y+=vg->textheight,i++) blitMenuItem(*(menuitem+i),vg->wnd,coo,(i==defval)?vg->textcolor:vg->notextcolor);
    	SDL_UpdateRect(vg->wnd,menuCoo.x,menuCoo.y,menuCoo.w,menuCoo.h);
     
    	done=0;
    	rc=defval;
    	while(!done) {
    		SDL_WaitEvent(&event);
    		oldrc=rc;
    		switch(event.type) {
    			case SDL_KEYDOWN:
    				switch(event.key.keysym.sym) {
    					case SDLK_ESCAPE: done=1; rc=defval; break;
    					case SDLK_UP: rc--; break;
    					case SDLK_DOWN: rc++; break;
    					case SDLK_RETURN: case SDLK_KP_ENTER: done=1; break;
    					default: break;
    					}
    				case SDL_MOUSEBUTTONUP: break;	// A traiter
    			default: break;
    			}
    		if(rc<0) rc=nitem-1;
    		else if(rc>=nitem) rc=0;
    		if(rc!=oldrc) {
    			coo.y=menuCoo.y+vg->spacelen+MENU_BORDERWIDTH+vg->textheight*oldrc;
    			blitMenuItem(*(menuitem+oldrc),vg->wnd,coo,vg->notextcolor);
    			coo.y=menuCoo.y+vg->spacelen+MENU_BORDERWIDTH+vg->textheight*rc;
    			blitMenuItem(*(menuitem+rc),vg->wnd,coo,vg->textcolor);
    			SDL_UpdateRect(vg->wnd,menuCoo.x,menuCoo.y,menuCoo.w,menuCoo.h);
    			}
    		}
     
    	....
     
    	return(rc);
    }
    Et la fonction qui affiche une ligne du menu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void blitMenuItem(char *str,SDL_Surface *srfc,SDL_Rect coo,SDL_Color textColor)
    {
    	SDL_Surface *text;
     
    	text=TTF_RenderText_Blended(vg->textfont,str,textColor);
    	coo.x+=(coo.w-text->w)/2;
    	SDL_BlitSurface(text,NULL,srfc,&coo);
    	SDL_FreeSurface(text);
    }
    Je joins deux images: la première, c'est celle après avoir affiché le menu avant d'entrer dans la boucle while(!done), la seconde celle du menu après avoir appuyé quelques fois sur les flèches haut / bas... voyez la différence !

    Si quelqu'un a une idée du pourquoi.....

    D'avance merci,

    Edgar.

    PS: que le texte soit centré ou non ne change rien, et pour les couleurs:
    SDL_Color notextcolor={0x65,0x65,0x65};
    SDL_Color textcolor={0xd0,0xd0,0xd0};
    Uint32 menubgcolor=SDL_MapRGB(vg->wnd->format,0x41,0x5e,0xaa);

    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  2. #2
    Membre régulier Avatar de c1702
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Je ne me suis jamais servi de la lib TTF, mais je pense que ça ne peut pas fonctionner correctement comme ça.

    La fonction TTF_RenderText_Blended te renvoie une surface avec de l'alpha. Donc il faut effacer ce qui est en dessous avant, sinon il reste des traces.

    Je pense que la fonction "shaded" (ou "solid" sans anti-alias) fonctionnerait mieux, surtout qu'apparement ton fond est uni.
    Voir sur la page :
    http://www.libsdl.org/projects/docs/..._35.html#SEC35

    Ou sinon, tu fais un fillrect avec la couleur de fond (ou le bout d'image qui va bien) avant de blitter ton texte.

    Clément.

    Edit : Faute de frappe.

  3. #3
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 551
    Points
    1 551
    Par défaut
    Hello Clément,

    Tu as parfaitement raison, après différents essais, le problème vient bien de la manière dont le _Blended crée la surface.

    Solution: remplacer le Blended par un _Shaded, et donner (en SDL_Color) la couleur de fond à appliquer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void blitMenuItem(char *str,SDL_Surface *srfc,SDL_Rect coo,SDL_Color textColor,SDL_Color bgColor)
    {
    	SDL_Surface *text;
     
    	text=TTF_RenderText_Shaded(vg->textfont,str,textColor,bgColor);
    	coo.x+=(coo.w-text->w)/2;
    	SDL_BlitSurface(text,NULL,srfc,&coo);
    	SDL_FreeSurface(text);
    }
    Merci à toi,

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

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

Discussions similaires

  1. Affichage bizarre dans mes navigateurs
    Par djiga4me dans le forum Windows 7
    Réponses: 6
    Dernier message: 21/05/2013, 09h27
  2. Affichage bizarre dans IE explorer !
    Par mormach dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/06/2008, 00h14
  3. [Spip] Affichage conditionnel dans un menu
    Par elekaj34 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 09/12/2007, 22h42
  4. Problème affichage form avec Internet Explorer dans un menu
    Par dupard2006 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 28/03/2006, 19h26
  5. Réponses: 4
    Dernier message: 12/10/2005, 21h22

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