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 :

Menu en C


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Par défaut Menu en C
    Bonjour, bonsoir
    Je realise actuellement un petit programme en C
    Pour ce programme je souhaite faire un menu.
    J'ai donc pris un font pour mon menu et trois png pour le texte (Pour faire un effet de sélection avec un changement de couleur)
    Sauf que les images ce superpose et ne passe pas au troisième choix (
    la fenêtre ce ferme à ce moment là)

    Une image du bug :
    Nom : Capture du 2015-06-12 22:47:03.png
Affichages : 6494
Taille : 397,0 Ko

    code source :
    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
    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
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    #include "SDL/SDL.h"
    #include "SDL/SDL_image.h"
    #include <string>
     
    #include "headers/constantes.h"
    #include "headers/jeu.h"
    #include "headers/editeur.h"
     
    //Les surfaces
    SDL_Surface *screen = NULL ;
    SDL_Surface *background  = NULL ;
    SDL_Surface *menu[3] = {NULL} ;
     
    //La structure d'événements
    SDL_Event event ;
     
     
     
     
     
    bool init()
    {
        //Initialisation de tous les sous-systèmes de SDL
        if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
        {
            return false ;
        }
     
        SDL_WM_SetIcon(IMG_Load("images/logo.png"), NULL) ;
     
        //Mise en place de l'écran
        screen = SDL_SetVideoMode(  SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF);
        background = IMG_Load("images/menu/background.png") ;
         //Mise en place de la barre caption 
        SDL_WM_SetCaption( "Test Chat Kra V 0.0", NULL ) ;
     
        //S'il y a une erreur lors de la mise en place de l'écran
        if( screen == NULL )
        {
            return false ;
        }
     
        if( background == NULL )
        {
            return false ;
        }
     
        return true ;
    }
     
     
    void clean_up()
    {
     
        //On libère la feuille de sprites
        SDL_FreeSurface( background ) ;
     
     
        //On quitte SDL
        SDL_Quit() ;
    }
     
    bool load_files()
    {
        //Chargement de la feuille de sprite
        menu[0] = IMG_Load("images/menu/jouer.png") ;
    	menu[1] = IMG_Load("images/menu/editeur.png") ;
    	menu[2] = IMG_Load("images/menu/quitter.png") ;
     
        //S'il y a eu un problème au chargement de la feuille de sprites
        if( menu[0] == NULL |menu[1] == NULL |menu[2] == NULL )
        {
            return false ;
        }
     
        return true;
    }
     
    int main (int argc, char* argv[])
    {
    	//Ce qui va nous permettre de quitter
        bool quit = false ;
     
        //Initialisation
        int i = 0 ;
        int continuer = 1 ;
        int menuCourrant = 0 ;
     
        SDL_Rect positionBackground ;
     
        positionBackground.x = 0 ;
        positionBackground.y = 0 ;
     
        //Chargement des fichiers
        if( load_files() == false )
        {
            return (1) ;
        }
     
        if( init() == false )
        {
            return (1) ;
        }
     
        //On remplit l'écran 
        SDL_BlitSurface(background, NULL, screen, &positionBackground) ;
        SDL_BlitSurface(menu[0], NULL, screen, &positionBackground) ;
     
        SDL_Flip(screen) ;
        //Event : menu
    	while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
            	case SDL_QUIT:
    		        continuer = 0;
    		        break;
     
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0 ;
                            break ;
     
    		 			case SDLK_UP:
     
    						if(menuCourrant = 0)
    						  menuCourrant = 2 ;
     
    						if(menuCourrant = 1)
    						  menuCourrant = 0 ;
     
    						if(menuCourrant = 2)
    						  menuCourrant = 1 ;
     
    						SDL_BlitSurface(menu[menuCourrant], NULL, screen, &positionBackground) ;
     
    						while(i < 3)
    						{SDL_FreeSurface(menu[i]) ; i++;}
    						break ;
     
     
    					case SDLK_DOWN:
     
    						if(menu[0])
    						  menuCourrant = 1 ;
     
    						else if(menu[1])
    						  menuCourrant = 2 ;
     
    						else if(menu[2])
    						  menuCourrant = 0 ;
     
                            SDL_BlitSurface(menu[menuCourrant], NULL, screen, &positionBackground) ;
     
    						while(i < 3)
    						{SDL_FreeSurface(menu[i]) ; i++;}
    						break ;
    				}
                break ;
            }
            SDL_Flip(screen) ;
    	}
     
        //On libère les images et on quitte SDL
        SDL_FreeSurface(background) ;
        while(i < 3)
    	{SDL_FreeSurface(menu[i]) ; i++;}
     
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    Merci =)

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    déjà tu semble ne pas traiter haut et bas de la même manière, y'en a un qui se base sur menuCourant et l'autre sur le tableau menu[]

    si on prend un exemple simple, on est sur le premier item du menu, donc menuCourant=0, et on presse SDLK_UP, on rentre alors dans ton bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(menuCourrant = 0) menuCourrant = 2 ;
    if(menuCourrant = 1) menuCourrant = 0 ;
    if(menuCourrant = 2) menuCourrant = 1 ;
    donc le programme avance tranquilement, à la première ligne il se rend compte que menuCourant vaut 0, donc il change sa valeur en 2... et il continue sa progression
    la deuxième ligne ne l'intéresse pas, à la troisième par contre comme on a changé sa valeur juste avant on rentre dans le if et menuCourant devient alors 1

    donc on était sur le 1er item du menu, on a appuyé une fois sur la flèche du haut et on se retrouve sur l'item juste en dessous, ce qu'il faut ici ce n'est pas une forêt de if ce serait plutot un switch/case ou même simplement un if bien controlé, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    menuCourant--;
    if (menuCourant < 0) menuCourant = 2;
    et idem pour SDLK_DOWN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    menuCourant++;
    if (menuCourant > 2) menuCourant = 0;

  3. #3
    Membre averti
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Par défaut
    Merci pour ces corrections BufferBob =),
    Par contre mon problème persiste, je continue de chercher

    code :
    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
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    #include "SDL/SDL.h"
    #include "SDL/SDL_image.h"
    #include <string>
     
    #include "headers/constantes.h"
    #include "headers/jeu.h"
    #include "headers/editeur.h"
     
    //Les surfaces
    SDL_Surface *screen = NULL ;
    SDL_Surface *background  = NULL ;
    SDL_Surface *menu[3] = {NULL} ;
     
    //La structure d'événements
    SDL_Event event ;
     
     
     
     
     
    bool init()
    {
        //Initialisation de tous les sous-systèmes de SDL
        if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
        {
            return false ;
        }
     
        SDL_WM_SetIcon(IMG_Load("images/logo.png"), NULL) ;
     
        //Mise en place de l'écran
        screen = SDL_SetVideoMode(  SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF);
        background = IMG_Load("images/menu/background.png") ;
         //Mise en place de la barre caption 
        SDL_WM_SetCaption( "Test Chat Kra V 0.0", NULL ) ;
     
        //S'il y a une erreur lors de la mise en place de l'écran
        if( screen == NULL )
        {
            return false ;
        }
     
        if( background == NULL )
        {
            return false ;
        }
     
        return true ;
    }
     
     
    void clean_up()
    {
    	int count = 0 ;
     
        //On libère la feuille de sprites
        SDL_FreeSurface(background) ;
     
        while(count < 3)
    	{
    		SDL_FreeSurface(menu[count]) ;
    		 count++;
    	}
     
     
        //On quitte SDL
        SDL_Quit() ;
    }
     
    bool load_files()
    {
        //Chargement de la feuille de sprite
        menu[0] = IMG_Load("images/menu/jouer.png") ;
    	menu[1] = IMG_Load("images/menu/editeur.png") ;
    	menu[2] = IMG_Load("images/menu/quitter.png") ;
     
        //S'il y a eu un problème au chargement de la feuille de sprites
        if( menu[0] == NULL |menu[1] == NULL |menu[2] == NULL )
        {
            return false ;
        }
     
        return true;
    }
     
    int main (int argc, char* argv[])
    {
        //Initialisation
        int i = 0 ;
        int continuer = 1 ;
        int menuCourant = 0 ;
     
        SDL_Rect positionBackground ;
     
        positionBackground.x = 0 ;
        positionBackground.y = 0 ;
     
        //Chargement des fichiers
        if( load_files() == false )
        {
            return (1) ;
        }
     
        if( init() == false )
        {
            return (1) ;
        }
     
        //On remplit l'écran 
        SDL_BlitSurface(background, NULL, screen, &positionBackground) ;
        SDL_BlitSurface(menu[0], NULL, screen, &positionBackground) ;
     
        //Mise à jour de l'écran
        if( SDL_Flip( screen ) == -1 )
        {
            return 1 ;
        }
     
        //Event : menu
    	while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
            	case SDL_QUIT:
    		        continuer = 0;
    		        break;
     
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0 ;
                            break ;
     
    		 			case SDLK_UP:
     
    						menuCourant--;
    						if (menuCourant < 0) menuCourant = 2;
     
    						SDL_BlitSurface(menu[menuCourant], NULL, screen, &positionBackground) ;
     
    						SDL_FreeSurface(menu[menuCourant]) ;
    						break ;
     
     
    					case SDLK_DOWN:
     
    						menuCourant++;
    						if (menuCourant > 2) menuCourant = 0;
     
                            SDL_BlitSurface(menu[menuCourant], NULL, screen, &positionBackground) ;
     
    						SDL_FreeSurface(menu[menuCourant]) ;
    						break ;
    				}
                break ;
            }
            SDL_Flip(screen) ;
    	}
     
        clean_up() ;
     
        return EXIT_SUCCESS;
    }

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    je t'avoue là comme ça j'ai pas trop regardé, si tu mets les images etc. pour qu'on puisse compiler & exécuter je pourrais peut-être t'aider plus

    edit: pour le moins je me demande pourquoi tu SDL_FreeSurface tes trois images pour le menu à chaque fois qu'une touche est pressée

  5. #5
    Membre averti
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Par défaut
    "je t'avoue là comme ça j'ai pas trop regardé, si tu mets les images etc. pour qu'on puisse compiler & exécuter je pourrais peut-être t'aider plus"

    Un lien : https://drive.google.com/folderview?...Dg&usp=sharing

    " pour le moins je me demande pourquoi tu SDL_FreeSurface tes trois images pour le menu à chaque fois qu'une touche est pressée "

    Oui je viens de voir ça aussi, que de bêtise en une nuit ^^

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    juste pour savoir, tu codes en quoi, C ou C++ ? (ton post est dans la section C, le code ressemble à du C, et tu utilises des types bool et des includes C++)

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

Discussions similaires

  1. TreeView et menu contextuel...
    Par agh dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/04/2009, 12h23
  2. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  3. Menu d'installation
    Par Le Yannos dans le forum Langage
    Réponses: 3
    Dernier message: 27/08/2002, 22h15
  4. Inserer Un Menu dans un autre en execution
    Par apt dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 11h22
  5. Menu en GL
    Par Kaïn dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/05/2002, 11h58

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