Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erest0r en 30 Agosto 2013, 00:40 am



Título: Duda creando un menu usando la libreria SDL
Publicado por: erest0r en 30 Agosto 2013, 00:40 am
Hola de nuevo, he empezado a usar la libreria SDL por mi cuenta a punta de tutoriales, y tengo un problema en una parte del codigo que no sabria como solucionarlo, aqui va el codigo:

Código:
#include "SDL/SDL.h"

int main( int argc, char* args[] ){

    int eleccion = 0, imagen = 0;

    SDL_Surface* screen2 = NULL;
    SDL_Surface* opcion1 = NULL;
    SDL_Surface* opcion2 = NULL;
    SDL_Surface* yoshi2 = NULL;
    SDL_Surface* pikachu2 = NULL;
    SDL_Surface* flecha = NULL;

    SDL_Event tecla;

    SDL_Rect posicion_opcion1;
    SDL_Rect posicion_opcion2;
    SDL_Rect posicion_pikachu2;
    SDL_Rect posicion_yoshi2;
    SDL_Rect posicion_flecha;

    posicion_opcion1.x = 60;
    posicion_opcion1.y = 60;

    posicion_opcion2.x = 60;
    posicion_opcion2.y = 180;

    posicion_flecha.x = 300;
    posicion_flecha.y = 60;

    SDL_Init( SDL_INIT_EVERYTHING );

    opcion1 = SDL_LoadBMP( "opcion1.bmp" );
    opcion2 = SDL_LoadBMP( "opcion2.bmp" );
    flecha = SDL_LoadBMP( "flecha.bmp" );
    yoshi2 = SDL_LoadBMP( "yoshi2.bmp" );
    pikachu2 = SDL_LoadBMP( "pikachu2.bmp" );
    screen2 = SDL_SetVideoMode(600, 660, 32, SDL_SWSURFACE);

    while(true){
        SDL_FillRect(screen2, 0, SDL_MapRGB(screen2->format, 0, 0, 0));
        SDL_BlitSurface(opcion1, NULL, screen2, &posicion_opcion1);
        SDL_BlitSurface(opcion2, NULL, screen2, &posicion_opcion2);
        SDL_BlitSurface(flecha, NULL, screen2, &posicion_flecha);
        SDL_Flip(screen2);
        while(SDL_PollEvent(&tecla)){
            if(tecla.type == SDL_QUIT){
                SDL_FreeSurface(opcion1);
                SDL_FreeSurface(opcion2);
                SDL_FreeSurface(yoshi2);
                SDL_FreeSurface(pikachu2);
                SDL_FreeSurface(flecha);
                exit(0);
            }
            if(tecla.key.keysym.sym == SDLK_ESCAPE){
                    SDL_FreeSurface(opcion1);
                    SDL_FreeSurface(opcion2);
                    SDL_FreeSurface(yoshi2);
                    SDL_FreeSurface(pikachu2);
                    SDL_FreeSurface(flecha);
                    exit(0);
            }
            else if(tecla.key.keysym.sym == SDLK_RETURN ){
                    if(eleccion == 0){
                        imagen = 1;
                        while(imagen == 1){
                            SDL_FillRect(screen2, 0, SDL_MapRGB(screen2->format, 0, 0, 0));
                            SDL_BlitSurface(yoshi2, NULL, screen2, NULL);
                            SDL_Flip(screen2);
                            while(SDL_PollEvent(&tecla)){
                                    if(tecla.key.keysym.sym == SDLK_ESCAPE){

                                        imagen = 0;
                                    }
                            }
                        }

                    }
                    else if( eleccion == 1 ){
                            imagen = 1;
                            while(imagen == 1){
                                SDL_FillRect(screen2, 0, SDL_MapRGB(screen2->format, 0, 0, 0));
                                SDL_BlitSurface(pikachu2, NULL, screen2, NULL);
                                SDL_Flip(screen2);
                                while(SDL_PollEvent(&tecla)){
                                    if(tecla.key.keysym.sym == SDLK_ESCAPE){

                                        imagen = 0;
                                    }
                                }
                            }

                        }
                }
                 else if(tecla.key.keysym.sym == SDLK_DOWN){
                            if(eleccion == 0){
                                posicion_flecha.y += 120;
                                eleccion = 1;
                            }
                      }
                      else if(tecla.key.keysym.sym == SDLK_UP){
                                if(eleccion == 1){
                                    posicion_flecha.y -= 120;
                                    eleccion = 0;
                                }
                           }
        }

    }
    return 0;
}

El punto especifico esta que cuando el usuario selecciona una opcion, perfectamente le muestra la imagen de la eleccion que tomo, y cuando presiona ESCAPE para devolverse, el programa reconoce como si el usuario hubiese presionado la tecla 2 veces y se sale, en vez de regresar al menu principal.

Muchas gracias de antemano.