Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Eventos y SDL_LoadBMP en SDL

Iniciado por SPARTANVS, 19 de Abril de 2008, 09:30:17 AM

« anterior - próximo »

SPARTANVS

Ola, tengo 2 problemas, empiezo por el que me parece mas importante.

Estoy haciendo un jueguecito, eres un cañoncito y disparas a los aviones enemigos mediante unas teclas disparas y mueves el cañon de derecha a izquierda. como estoy empezando con SDL, pues estoy haciendo mis pruebas con graficos simples y programas muy pequeñitos.

El problema que tengo con los eventos es que cuando pulsas una tecla si, la imagen se mueve, pero si la dejas pulsada no sigue miviendose. Imaginaos un jueguecito de aviones (como el 1942) en el que tubierais que pulsar la tecla de disparo acada medio segundo para que disparara continuamente, no creo que fuera muy divertido.

aqui esta el codigo que uso para los eventos:

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

if (event.key.keysym.sym == SDLK_u)
{
x = x + 5;
}
}
}


tambien he porvado esta otra forma:

keys=SDL_GetKeyState(NULL);

if (keys[SDLK_u] == 1)
{
x = x + 0,1;
}



El segundo problema es que me gustaria para mi juego uqe estubiera dividido en distintas carpetas para las distintas imgenes de enemigos y niveles. Pero no se como cargar la imagen desde una carpeta, sino que pongo la imagen en el mismo directorio que el ejecutable y ya esta, pero no es lo que busco.

esta es la funcion que uso para cargar imagenes:



image = SDL_LoadBMP("grafico.bmp");
if (image == NULL)
{
printf("No se pudo cargar la imagen: %s\n", SDL_GetError());
}


image es simplemente la varibale que contiene la superficie. COmo vereis, entre comillas he puesto grafico.bmp, he porvado poner nombrecarpeta\grafico.bmp, pero no me lo caraga ya que esa barra la coge como una secuencia de escape.

gracias por todo.
PD: al que me contesto el hilo de las tablas, gracias tambien que no he podido conectarme y ahora no encuentro el hilo.

Chema

Hola SPARTAAAAAAAANVS :P

Como estabas haciendo los eventos no funcionará. Si solo miras el SDL_KEYDOWN el cañon se moverá una vez cuando apretes la tecla. Hay que mirar el SDL_KEYDOWN y el SDL_KEYUP:


     while (SDL_PollEvent (&event))
     {
        if (event.type == SDL_KEYDOWN)
        {
           if (event.key.keysym.sym == SDLK_u)
           {
                 mover = 1;
           }
         }
         if (event.type == SDL_KEYUP)
         {
              if (event.key.keysym.sym == SDLK_u)
             {
                    mover = 0;
                }
        }
     }

     if(mover)
            x = x + 5;


Con la variable mover controlas si la tecla está pulsada o no.

Cita de: "SPARTANVS"tambien he porvado esta otra forma:

keys=SDL_GetKeyState(NULL);
if (keys[SDLK_u] == 1)
{
x = x + 0,1;
}


Ésto debería funcionar y es más fácil . Quizá tengas un error en algún sitio. Recuerda que antes de llamar a SDL_GetKeyState hay que llamar a SDL_PumpEvents.

Cita de: "SPARTANVS"
he porvado poner nombrecarpeta\grafico.bmp, pero no me lo caraga ya que esa barra la coge como una secuencia de escape.

Para que no te la coja como secuencia de escape pon nombrecarpeta\\grafico.bmp

Que vaya bien con el juego

SPARTANVS

Me has dado una respuesta rapida, bien explicada y precisa, PROFESIONAL.

muchas gracias ya me carga el grafico desde la carpeta.

respecto a los venetos, me interesa mas la segunda forma claro, pero no me funciona, aunque la verdad es que no he llamado la funcion SDL_PumpEvents(); ¿Cual es el prototipo? o mejor dicho..¿como funciona? ¿donde la llamo? ¿para que sirve? he buscado en google pero o encuentro paginas que no explican nada o estan en ingles.

MUCHAS GRACIAS

por cierto si lo consigo hacer (el juego) te lo dedicare por la ayuda.

Chema

El prototipo es SDL_PumpEvents(). Sirve para que SDL procese los eventos pendientes. Si llamas a SDL_PollEvents no hace falta llamar a SDL_PumpEvents.

La tienes que llamar una vez en cada vuelta del bucle principal, antes de llamar a SDL_GetKeyState:

// Game Loop
while(!quit)
{
 // Leemos eventos
 SDL_PumpEvents();

 // Obtiene mapa del estado actual del teclado
 Uint *keyboard=SDL_GetKeyState(0);

 if(keyboard[SDLK_UP])    printf("Se presiono cursor arriba\n");
 if(keyboard[SDLK_DOWN])  printf("Se presiono cursor abajo\n");
 if(keyboard[SDLK_LEFT])  printf("Se presiono cursor izquierdo\n");
 if(keyboard[SDLK_RIGHT]) printf("Se presiono cursor derecho\n");

 if(keyboard([SDLK_ESCAPE]) quit=1;
}


Ah, y si te gusta esto de los videojuegos ponte en serio con el Inglés.

SPARTANVS

Muchas gracias he sustituido lo que me has puesto por lo que tenia y me funciona perfe XD, nose en que fallaria me habria olvidado de lgo  :shock:

por cierto me encanta SDL, he visto DirectX y opengl por encima y lo facil que es SDL es asombroso, aunque claro tambien tiene que es en 2D y creo que Directx en realidad es complicado por el propio windows, joder con todas las variables HWeg, no se los podian poner mas raros . :D

SPARTANVS

respecto a lo del ingles, llevo 6 años casi 7 en una academia, pero cuando llegan palabras y frases muy complicadas pues me lio ni mi madre las entiende que es profesora  :?  (bueno en realidad si)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.