Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





[SDL] Mantener tecla pulsada para mover sprite

Iniciado por Pumuki, 18 de Noviembre de 2008, 11:01:12 AM

« anterior - próximo »

Pumuki


Buenas, como podria hacer en SDL que cuando mantenga pulsado una tecla del teclado el personaje se mueva hasta que deje de pulsar? Programo para pc.
He buscado informacion, y encontre que dentro de la estructura keyboardEvent hay una variable state que puede recibir estos valores (SDL_PRESSED y SDL_RELEASED), pero no se como utilizarlos.

Tengo esto, consiguiendo que se mueva:


void Teclado(void)           
{
SDL_Event evento;                // Para leer el teclado
     // Leer teclado
        if (SDL_PollEvent(&evento))                   
         {
         if (evento.type == SDL_KEYDOWN)     
         {     
          switch (evento.key.keysym.sym) 
          {
           case SDLK_UP:  posy=posy-10 ; orientacion=norte; break;   
           case SDLK_DOWN: posy=posy+10 ; orientacion= sur; break; 
           case SDLK_LEFT: posx=posx-10 ; orientacion=oeste; break;   
           case SDLK_RIGHT: posx=posx+10 ; orientacion=este; break;   
           case SDLK_ESCAPE:  encendido=false ; break;             
          }
         
         }
        }
     return ;
}

lemoniac

Una forma de hacerlo sería consultar el estado del teclado con SDL_GetKeyState (http://www.libsdl.org/cgi/docwiki.cgi/SDL_GetKeyState)

Y tu código cambiaría a algo similar a:
Código (c) [Seleccionar]
keys = SDL_GetKeyState(NULL);
...
if(keys[SDLK_UP])
{
   posy-= 10;
   orientacion = norte;
}


Si no llamas a la función Teclado un número de veces fijo por segundo, deberías cambiar ese 10 que tienes ahí para que el movimiento sea fluido e igual en todas las máquinas.


A parte, deberías cambiar el if por un while al llamar a SDL_PollEvent, porque es posible que si llegan más de un evento por frame se procesen los eventos más tarde de lo que toca o en el caso peor, que no se procesen nunca.


Como opinión subjetiva, si es en C++, te sugiero encapsular las posiciones en una clase sobrecargando los operadores para facilitarte la vida.