[SDL] Mantener tecla pulsada para mover sprite

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 ;
}
Aquí tienes un par de ejemplos. Aún si no sabes inglés, el código está muy claro. El primero fragmento es lo que tu ya tienes hecho y que es un error muy típico al trabajar con SDL (y muchos otros sistemas de input). El segundo es lo que puedes hacer, aunque no es la única opción; y el tercero es otra cosa que puedes hacer si quieres añadir aceleración.

http://gpwiki.org/index.php/C:SDL_Practical_Keyboard_Input

¡Suerte!
Gracias, a ver si este finde puedo probarlo.
Para hacer eso debes responder a los eventos que se generar cuando se pulsa una tecla (keydown) y se libera (keyup)
La idea es sencilla, vas a almacenar el estado de cada tecla en variables (variables independientes, arrays, eso es otra cuestión), en este caso el estado es "tecla pulsada" o "tecla no pulsada" con lo que con variables booleanas vale.
Cuando detectes que una tecla se ha pulsado con los eventos de SDL, pones a true la variable de estado de esa variable, y cuando detectes que se ha dejado de pulsar la pones a false.
Luego, para mover el sprite lo que haces es consultar el estado de esas variables y actuar en consecuencia. La idea es separar conceptos:
mientras ( NOT juegoTerminado)

    //Aquí actualizamos el estado de las teclas que están pulsadas o no
    ActualizaEstadoTeclas()

    //Aquí actualizamos el estado del sprite (posicion) comprobando en nuestras variables qué teclas están pulsadas  (estado que hemos cambiado en la función anterior)
    ActualizarEstadoSprite()

    //Dibujamos el sprite en su posición que ha sido actualizada por la función anterior
    DibujarSprite()

fin mientras


Eso es un bucle para videojuego muy (muy) simplificado, pero para ir aprendiendo es de sobra.
Para leer teclado, existe también una interesante función llamada SDL_GetKeyState(); y que puedes usar de ésta forma:

Uint8 *keystate=NULL;

keystate = SDL_GetKeyState(NULL);
if(keystate)
    {
    if(keystate[SDLK_RETURN])  {/*pulsada*/} else  {/* no pulsada*/}
    }




Antes de usarla, no viene mal usar:

SDL_EnableKeyRepeat(0,0);


Para evitar la autorepetición de las teclas.

Yo no es que haya usado mucho las SDL, pero en mi juego Guitarfun es así como leo el teclado y me parece mas lógico que tratarlo como eventos dentro de un juego (y puedes comprobar la pulsación de varias teclas simultaneas de una forma sencilla, claro)

Saludos.
Hermes escribió:Para leer teclado, existe también una interesante función llamada SDL_GetKeyState(); y que puedes usar de ésta forma:

Uint8 *keystate=NULL;

keystate = SDL_GetKeyState(NULL);
if(keystate)
    {
    if(keystate[SDLK_RETURN])  {/*pulsada*/} else  {/* no pulsada*/}
    }




Antes de usarla, no viene mal usar:

SDL_EnableKeyRepeat(0,0);


Para evitar la autorepetición de las teclas.

Yo no es que haya usado mucho las SDL, pero en mi juego Guitarfun es así como leo el teclado y me parece mas lógico que tratarlo como eventos dentro de un juego (y puedes comprobar la pulsación de varias teclas simultaneas de una forma sencilla, claro)

Saludos.


Efectivamente Hermes, tienes razón, otra manera de comprobarlo es esa, aunque la gestión de eventos no es asíncrona, más que eventos sería mejor denominarlos mensajes, están en una cola y los vas sacando y procesando por frame, con lo que tampoo es tanto.
Sin embargo como dices, creo que es incluso más cómodo leer el teclado como indicas.
Cuando lleguen las navidades probare todo lo que me habeis dicho gracias. Ya posteare a ver que tal.
7 respuestas