/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema SDL C, Menu de juego.

 
      Índice del Foro elrincondelc.com -> Gráficos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Anastacius



Registrado: 26 Oct 2013
Mensajes: 41

MensajePublicado: 18/12/2013 5:52 pm
Título: Problema SDL C, Menu de juego.

Hola a todos.

Estoy volviendo a comenzar en la programacion grafica en SDL, para diseñar juegos en 2D.

Tengo un problema. El juego tiene una pantalla de presentacion, y tras presionar cualquier tecla, deberia aparecer un boton. Sin embargo, cuando presiono una tecla, se cierra todo.

Dejo el Codigo. Nota: Dev C ++

Código:
#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>

void sdlon();//Carga SDL al sistema y coloca la superficie principal.
void hall();
SDL_Surface *intro, *screen, *sign, *jugador1;
SDL_Rect intror, signr, jugador1r;
SDL_Event event, inicio;
int done = 0;
int inicioi;
bool stop = false;



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


sdlon();

hall();

SDL_Flip(screen);
// liberar superficie
SDL_FreeSurface(intro);
// Esperamos la pulsación de una tecla para salir

   while(done == 0) {
              while ( SDL_PollEvent(&event) ) {
                    if ( event.type == SDL_KEYUP )

                       done = 1;

                       }
}

return 0;

}
////////////////////////////////////////
void hall()
{
inicioi = 1;
int step = 0;
intro = SDL_LoadBMP("Inicio.bmp");
sign = SDL_LoadBMP("Intro.bmp");
jugador1 = SDL_LoadBMP("Jugador1.bmp");
if ( intro == NULL ) {
printf("No pude cargar gráfico: %s\n", SDL_GetError());
exit(1);
}
if(sign == NULL)
{
         printf("Error: Sign button%s\n", SDL_GetError());
         exit(1);
}
intror.x = 211;
intror.y = 166;
intror.w = intro->w;
intror.h = intro->h;

signr.x = 411;
signr.y = 600;
signr.w = sign->w;
signr.h = sign->h;

jugador1r.x = 100;
jugador1r.y = 100;
jugador1r.w = jugador1->w;
jugador1r.h = jugador1->h;
SDL_SetColorKey(jugador1, SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(jugador1->format, 0, 0, 0));
SDL_SetColorKey(sign,SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(sign->format,0,0,0));


           Uint8 *enter;
           enter = SDL_GetKeyState(NULL);
           SDL_BlitSurface(intro, NULL, screen, &intror);
           SDL_BlitSurface(sign, NULL, screen, &signr);
           SDL_Flip(screen);
           while(inicioi == 0) {
             
              while ( SDL_PollEvent(&inicio) ) {
                   
                    if ( event.type == SDL_KEYDOWN ){

                       step = step + 1;
                       }
                       }
                                 
           
           
           if(step == 1)
           {
                      SDL_BlitSurface(jugador1, NULL, screen, &jugador1r);
                      inicioi = 0;
           }
           
           
}


}



void sdlon()
{
     if (SDL_Init(SDL_INIT_VIDEO) < 0) {
     printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
     exit(1);
     }
     // Activamos modo de video
     screen = SDL_SetVideoMode(1022,710,24,SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN);
     if (screen == NULL) {
     screen = SDL_SetVideoMode(1022,710,24,SDL_HWSURFACE | SDL_DOUBLEBUF);
     }
}



El problema es que no aparece el boton jugador1 cuando presiono cualquier tecla, solo se cierra el programa, como si lo ignorase... llevo un dia con este problema, es algo muy tonto que se me esta escondiendo...

"Lo escencial es invisible a los ojos"

En este caso, para mi esta siendo muy verdadero.

Muchas gracias de antemano.
_________________
Programacion en C - HTML - Batch -
Aprendiendo : Java...
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 335
Ubicación: Argentina

MensajePublicado: 19/12/2013 5:10 pm
Título:

Buenas.

En la func. hall() tienes 3 problemas.
El primero con el primer bucle while, termina inmediatamente.
Código:

void hall()
{
  inicioi = 1;
  ....
  while(inicioi == 0) {


El segundo con el segundo bucle while, diferentes variables:
Código:

  while ( SDL_PollEvent(&inicio) ) {
             if ( event.type == SDL_KEYDOWN )


Al solucionar el problemas anteriores se genera otro, bucle infinito.
Código:

while(inicioi == 0)
{
  ....
  if ( step == 1 )
  {
     inicioi = 0; <--- mal
  }
}



En main el problema está en SDL_PollEvent.
En cola de eventos se tienen dos relacionados con el teclado: SDL_KEYDOWN y SDL_KEYUP.
SDL_KEYDOWN se vacía en la func. hall(), con el primer SDL_PollEvent, pero queda en cola SDL_KEYUP. En main al comparar si existe SDL_KEYUP el resultado es verdadero, asi que done = 1;
Una solución es volver a comparar con SDL_KEYDOWN.
Es decir:
Código:

 while ( SDL_PollEvent(&event) ) {
            if ( event.type == SDL_KEYDOWN )
                   done = 1;
 }


Saludos.
Volver arriba
Dirección AIM
Anastacius



Registrado: 26 Oct 2013
Mensajes: 41

MensajePublicado: 19/12/2013 6:29 pm
Título:

Muchisimas gracias Smile

La verdad hace rato que no tocaba SDL para hacer juegos (estaba estudiando WINAPI), pero ahora en vacaciones se me antojo hacer uno, y tengo las cosas olvidadas... tome ciertos ejemplos tal cual estaban en los libros...

Desde ahora voy a usar diagramas y notas para que esto no suceda de nuevo...

Muchas gracias Smile
_________________
Programacion en C - HTML - Batch -
Aprendiendo : Java...
Volver arriba
      Índice del Foro elrincondelc.com -> Gráficos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com