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

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

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    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 : 6026
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 éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    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 du Club
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    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 éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    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 du Club
    Homme Profil pro
    Pâtissier
    Inscrit en
    Avril 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    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 éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    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++)

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

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    Par défaut
    Haha je code en C après tout ce qui est SDL j'ai lu le tutoriel sur developpez, ça fonctionnez sur mon programme en C et avec gcc.
    Je vais me faire brûlez pour cette pratique ou c'est faisable ?

    Plus sérieusement les bool, je les est mis en C donc remplacez par int (C'est bien ça ?)
    Mais pour include c++ je voit pas de quoi tu parle

    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 ;
     
     
     
     
     
    int init()
    {
        //Initialisation de tous les sous-systèmes de SDL
        if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
        {
            return 0 ;
        }
     
        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 0 ;
        }
     
        if( background == NULL )
        {
            return 0 ;
        }
     
        return 1 ;
    }
     
     
    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() ;
    }
     
    int 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 0 ;
        }
     
        return 1;
    }
     
    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;
    }

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bien le bonjour;

    Ceci est une include C++. Pour le C, il faut inclure le header string.h.

    Ensuite, les bool existe bel et bien en C, ils ont été introduit en C99. Pour les utiliser, il faut inclure le header stdbool.h ( http://en.cppreference.com/w/c/types/boolean ).

    Plus généralement, tu trouvera ici ton bonheur pour savoir "ce qui existe" : http://en.cppreference.com/w/c/header

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    le problème est toujours le même, tu ne dois pas SDL_FreeSurface tes images sinon le programme crash, la fonction ne sert pas à effacer l'image de l'écran elle sert à libérer son espace en mémoire ! du coup quand on réutilise l'image menu[0] par exemple, elle n'existe plus pour SDL et le programme plante

    pour le moins c'est la logique de ton programme qui n'est pas la bonne, tu as une boucle while principale, à chaque tour de boucle tu écoutes le clavier, puis tu redessine la scène entièrement, et tu la blit

    dans la foulée et pour pouvoir compiler j'ai relevé un certain nombre de boulettes, en vrac :
    • eviter d'appeler ses binaires "test", y'a déjà une commande qui s'appelle comme ca sous linux, c'est comme appeller un binaire "ls" ou "netstat" c'est un peu maladroit et si on maitrise pas bien ça peut mener à des effets de bord
    • #include <string> est une tournure C++, en C on rajoutera un .h à la fin #include <string.h> et les deux bibliothèques ne sont pas équivalentes, méfiance.
    • comme tu l'as fait remarquer le type bool n'existe pas en C (cf post précédent ) il faut le remplacer par un int au plus simple
    • le Makefile est un peu hasardeux aussi, mais n'étant pas du tout un spécialiste je me contenterais de relever le fait qu'il manque au minimum le flag -SDL_image pour linker correctement ainsi que les objets main.o et jeu.o
    • aussi dans le Makefile tu as marqué constances.h au lieu de headers/constantes.h à priori
    • les constantes true et false ne sont pas définies automatiquement, perso je les ai rajouté à constantes.h
    • les FLAGS de compilation il faut en général les mettre à la fin des paramètres sans quoi ça peut générer des erreurs : $(CC) -o $(BIN) main.o jeu.o $(OBJ) $(LDFLAGS)
    • aussi dans le Makefile il y a une lettre qui manque CFLAGS = $(ERROR_CFLAGS) $(SDL_CFLAGS), du coup ça n'était pas pris en compte, et là... la vérité apparait ;-)
    • enfin il faut aussi modifier le Makefile pour qu'il aille trouver les fichiers dans le répertoire sources/


    le diff des modifications que j'ai effectué pour compiler :
    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
    diff -rd lilsamu-orig/Makefile lilsamu-ok/Makefile
    6,7c6,7
    < SRC = main.c jeu.c
    < OBJ = constances.h
    ---
    > SRC = sources/main.c sources/jeu.c
    > OBJ = sources/headers/constantes.h
    12c12
    < ERROR_CFLAGS = -Wall -W -pedantic
    ---
    > ERROR_CFLAGS =-Wall -W -pedantic
    18c18
    < CFLAGS = $(ERROR_FLAGS) $(SDL_CFLAGS)
    ---
    > CFLAGS = $(ERROR_CFLAGS) $(SDL_CFLAGS)
    24c24
    < LDFLAGS = $(ERROR_FLAGS) $(SDL_LDFLAGS) -lSDL_ttf
    ---
    > LDFLAGS = $(ERROR_FLAGS) $(SDL_LDFLAGS) -lSDL_ttf -lSDL_image
    32,33c32,33
    <       $(CC) $(CFLAGS) -c $(SRC)
    <       $(CC) $(LDFLAGS) -o $(BIN) $(OBJ)
    ---
    >       $(CC) -c $(SRC) $(CFLAGS)
    >       $(CC) -o $(BIN) main.o jeu.o $(OBJ) $(LDFLAGS)
    40d39
    < 
    diff -rd lilsamu-orig/sources/headers/constantes.h lilsamu-ok/sources/headers/constantes.h
    10a11,13
    >       #define true    1
    >       #define false   0
    > 
    15d17
    < 
    diff -rd lilsamu-orig/sources/main.c lilsamu-ok/sources/main.c
    3c3
    < #include <string>
    ---
    > #include <string.h>
    21c21
    < bool init()
    ---
    > int init()
    70c70
    < bool load_files()
    ---
    > int load_files()
    du coup la prise en compte des CFLAGS remonte tout un tas de warnings, pour l'essentiel des variables inutilisées, des commentaires C++ // au lieu de commentaires C /**/ (la faute à -pedantic), et surtout dans tes switch il manque un default: break (dans le 1er le break est présent mais pas la clause default celà dit)

    edit: je te propose la tournure suivante :
    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
        /* Chargement des fichiers */
        if( load_files() == false ) return 1 ;
        if( init() == false ) return 1 ;
     
        /* Event : menu */
        while (continuer) {
            SDL_WaitEvent(&event);
            switch(event.type) {
                case SDL_QUIT: continuer = false; break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym) {
                        case SDLK_ESCAPE: continuer = false ; break ;
                        case SDLK_UP:
                            menuCourant--;
                            if (menuCourant < 0) menuCourant = 2;
                            break ;
                        case SDLK_DOWN:
                            menuCourant++;
                            if (menuCourant > 2) menuCourant = 0;
                            break ;
                        default: break;
                    }
                default: break ;
            }
            /* On remplit l'écran */
            SDL_BlitSurface(background, NULL, screen, &positionBackground) ;
            SDL_BlitSurface(menu[menuCourant], NULL, screen, &positionBackground) ;
            SDL_Flip(screen) ;
        }

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

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    le problème est toujours le même, tu ne dois pas SDL_FreeSurface tes images sinon le programme crash, la fonction ne sert pas à effacer l'image de l'écran elle sert à libérer son espace en mémoire ! du coup quand on réutilise l'image menu[0] par exemple, elle n'existe plus pour SDL et le programme plante

    pour le moins c'est la logique de ton programme qui n'est pas la bonne, tu as une boucle while principale, à chaque tour de boucle tu écoutes le clavier, puis tu redessine la scène entièrement, et tu la blit
    Ok merci beaucoup, donc je vait reflechir à ça =)

    Citation Envoyé par BufferBob Voir le message
    dans la foulée et pour pouvoir compiler j'ai relevé un certain nombre de boulettes, en vrac :
    • eviter d'appeler ses binaires "test", y'a déjà une commande qui s'appelle comme ca sous linux, c'est comme appeller un binaire "ls" ou "netstat" c'est un peu maladroit et si on maitrise pas bien ça peut mener à des effets de bord
    • #include <string> est une tournure C++, en C on rajoutera un .h à la fin #include <string.h> et les deux bibliothèques ne sont pas équivalentes, méfiance.
    • comme tu l'as fait remarquer le type bool n'existe pas en C (cf post précédent ) il faut le remplacer par un int au plus simple
    • le Makefile est un peu hasardeux aussi, mais n'étant pas du tout un spécialiste je me contenterais de relever le fait qu'il manque au minimum le flag -SDL_image pour linker correctement ainsi que les objets main.o et jeu.o
    • aussi dans le Makefile tu as marqué constances.h au lieu de headers/constantes.h à priori
    • les constantes true et false ne sont pas définies automatiquement, perso je les ai rajouté à constantes.h
    • les FLAGS de compilation il faut en général les mettre à la fin des paramètres sans quoi ça peut générer des erreurs : $(CC) -o $(BIN) main.o jeu.o $(OBJ) $(LDFLAGS)
    • aussi dans le Makefile il y a une lettre qui manque CFLAGS = $(ERROR_CFLAGS) $(SDL_CFLAGS), du coup ça n'était pas pris en compte, et là... la vérité apparait ;-)
    • enfin il faut aussi modifier le Makefile pour qu'il aille trouver les fichiers dans le répertoire sources/
    Alors déjà merci pour le mal que tu t'es donné
    (Je n'utilise pas le makefile j'aprend tout juste sont utilisation et je n'est fait que un essai qui était dans ce dossier, je compile avec "ggc source/*.c -I header -lSDLmain -lSDL -lSDL_image)
    Je vait donc corrigé tout ça.

    Citation Envoyé par BufferBob Voir le message


    le diff des modifications que j'ai effectué pour compiler :
    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
    diff -rd lilsamu-orig/Makefile lilsamu-ok/Makefile
    6,7c6,7
    < SRC = main.c jeu.c
    < OBJ = constances.h
    ---
    > SRC = sources/main.c sources/jeu.c
    > OBJ = sources/headers/constantes.h
    12c12
    < ERROR_CFLAGS = -Wall -W -pedantic
    ---
    > ERROR_CFLAGS =-Wall -W -pedantic
    18c18
    < CFLAGS = $(ERROR_FLAGS) $(SDL_CFLAGS)
    ---
    > CFLAGS = $(ERROR_CFLAGS) $(SDL_CFLAGS)
    24c24
    < LDFLAGS = $(ERROR_FLAGS) $(SDL_LDFLAGS) -lSDL_ttf
    ---
    > LDFLAGS = $(ERROR_FLAGS) $(SDL_LDFLAGS) -lSDL_ttf -lSDL_image
    32,33c32,33
    <       $(CC) $(CFLAGS) -c $(SRC)
    <       $(CC) $(LDFLAGS) -o $(BIN) $(OBJ)
    ---
    >       $(CC) -c $(SRC) $(CFLAGS)
    >       $(CC) -o $(BIN) main.o jeu.o $(OBJ) $(LDFLAGS)
    40d39
    < 
    diff -rd lilsamu-orig/sources/headers/constantes.h lilsamu-ok/sources/headers/constantes.h
    10a11,13
    >       #define true    1
    >       #define false   0
    > 
    15d17
    < 
    diff -rd lilsamu-orig/sources/main.c lilsamu-ok/sources/main.c
    3c3
    < #include <string>
    ---
    > #include <string.h>
    21c21
    < bool init()
    ---
    > int init()
    70c70
    < bool load_files()
    ---
    > int load_files()
    du coup la prise en compte des CFLAGS remonte tout un tas de warnings, pour l'essentiel des variables inutilisées, des commentaires C++ // au lieu de commentaires C /**/ (la faute à -pedantic), et surtout dans tes switch il manque un default: break (dans le 1er le break est présent mais pas la clause default celà dit)

    edit: je te propose la tournure suivante :
    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
        /* Chargement des fichiers */
        if( load_files() == false ) return 1 ;
        if( init() == false ) return 1 ;
     
        /* Event : menu */
        while (continuer) {
            SDL_WaitEvent(&event);
            switch(event.type) {
                case SDL_QUIT: continuer = false; break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym) {
                        case SDLK_ESCAPE: continuer = false ; break ;
                        case SDLK_UP:
                            menuCourant--;
                            if (menuCourant < 0) menuCourant = 2;
                            break ;
                        case SDLK_DOWN:
                            menuCourant++;
                            if (menuCourant > 2) menuCourant = 0;
                            break ;
                        default: break;
                    }
                default: break ;
            }
            /* On remplit l'écran */
            SDL_BlitSurface(background, NULL, screen, &positionBackground) ;
            SDL_BlitSurface(menu[menuCourant], NULL, screen, &positionBackground) ;
            SDL_Flip(screen) ;
        }

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

    Informations professionnelles :
    Activité : Pâtissier

    Informations forums :
    Inscription : Avril 2014
    Messages : 32
    Points : 59
    Points
    59
    Par défaut
    Merci beaucoup pour ces réponses rapides, elles m'ont bien aidé et appris =)

  12. #12
    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
    Aussi comme conseil: passer au plus à SDL_PollEvent au lieu de SDL_WaitEvent

+ 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