[SDL] Duda sobre mantener tecla pulsada o no

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

[SDL] Duda sobre mantener tecla pulsada o no

Notapor thepoi » Lun Jun 02, 2008 7:16 pm

Hola;
Estoy haciendo un primer videojuego para irme familiarizando con la SDL.

Mi intencion es queque cuando pulso la tecla "a" el personaje debe disparar una bola de fuego, el problema es que ,curiosamente, si mantengo pulsada la tecla "a" dispara 200 bolas de fuego seguidas en cuestion de milisegundos. (provocando un error de segmentacion, ya que
el array de bolas no es tan grande).

Lo que me gustaria saber es como implementar que si la tecla es pulsada dispare, pero no vuelva a disparar hasta que suelten la tecla y la vuelvan a pulsar para así eliminar el efecto "ametralladora" que se esta produciendo.

La seccion del codigo donde compruebo si se pulsa la tecla a:

Código: Seleccionar todo
   if (key[SDLK_a])  {
     unsigned ind = buscar (); //buscamos la primera bola libre
     bolas[ind].x_ = x_; //posicion bola = posicion personaje
     bolas[ind].y_ = y_;
     bolas[ind].estado_ = estado_;//sentido bola = direccion personaje
     std::cout << "bola " << ind << std::endl;
    }


Y llamo a la funcion que comprueba si el usuario pulsa la tecla "a" una vez
por iteracion de game loop.


Que deberia modificar? Que deberia añadir?

Espero no haber resultado muy lioso.

1 saludo y muchas gracias
thepoi
 
Mensajes: 17
Registrado: Sab May 31, 2008 9:41 pm

Notapor Alex_13_estu » Mar Jun 03, 2008 1:37 pm

¡Hola! Te recomiendo que, si lo que quieres es captar sólo el evento de pulsación de la tecla "A", uses eventos y no compruebes el estado del teclado. Esto sería algo así:

Código: Seleccionar todo
SDL_Event event;//Eventos

while(SDL_PollEvent(&event))//Mientras haya eventos
{
    if(event.type == SDL_KEYDOWN)//Si se pulsa na tecla
    {
        if(event.key.keysym.sym == SDLK_a)//Si es la tecla a
        {
             //AQUI PONES EL CODIGO QUE QUIERAS PARA LA PULSACIÓN DE "A"
         }
    }
}


Básicamene ese sería el código. No lo he probado, pero creo que está bien. La variable "SDL_Event event" es una variable que almacena los eventos de SDL. Simplemente pon donde te indico el código y conseguirás que se ejecute sólamente una vez, al pulsar la tecla.

Espero haberte ayudado.

Un saludo.
Alex_13_estu
 
Mensajes: 75
Registrado: Jue Mar 27, 2008 5:22 pm

Notapor thepoi » Vie Jun 06, 2008 4:51 pm

con eventos si funciona, lo "malo" es que tuve que cambiar todo el sistema de movimiento del personaje a eventos, pq si mezclaba ambas formas no funcionaba demasiado bien

gracias
thepoi
 
Mensajes: 17
Registrado: Sab May 31, 2008 9:41 pm

Notapor lucesita » Vie Jun 06, 2008 7:39 pm

y esto en que ah quedado, pudiste implementarlo? que tal te quedo? te funciona bien el metodo que te comento alex?

de todos modos tienes otra manera, haciendolo como lo hiciste vos, pero con un timer.

pseudocode:

Inicia un timer

GameLoop
Lee estado del teclado
si esta apretada
{
if(timer > 80) //el numero es en MS
{
Ejecuta la animacion
ReseteaTimer
}
}

no se... se me ocurrio eso por asi decirlo, esto lo que te va a hacer es tirarte cada 80 MiliSegundos una bola de fuego.

pero me gustaria que comentes como lo resolviste, ya que estoy seguro que a mas de uno nos interesa jajaja.
lucesita
 
Mensajes: 57
Registrado: Mié Mar 12, 2008 2:49 pm

Notapor thepoi » Sab Jun 07, 2008 1:19 pm

Mmm no hice nada demasiado especial, simplemente capturar los eventos, ver si se trataba de una pulsacion de tecla, y si era asi ver que tecla era. Luego simplemente actuar en consecuencia con la tecla pulsada. Muy parecido a lo que proponia Alex_13_estu

Algo asi


Código: Seleccionar todo
SDL_Event event;

while(SDL_PollEvent(&event))
{
    if(event.type == SDL_KEYDOWN)
    {
        if(event.key.keysym.sym == SDLK_a)
        {
             //disparar
         }
        if(event.key.keysym.sym == SDLK_UP)
        {
             //saltar
         }
    }
}


y asi sucesivamente para todas las acciones que uno quiera.
thepoi
 
Mensajes: 17
Registrado: Sab May 31, 2008 9:41 pm

Notapor lucesita » Sab Jun 07, 2008 6:13 pm

jajaja yo te decia que pongas el codigo entero... o sea, que presentes lo que llevas hecho xD

Por lo menos a mi me gusta curiosear, ademas si esta relacionado con tu otro post abierto se ve muy interesante.
Saludos Lucesita

EDIT: te invito a que te animes tambien a pasar por el canal de jabberes, busca en los otros post la forma de conectarte, yo se que casi nunca hay nadie, pero es una herramienta muy interesante
lucesita
 
Mensajes: 57
Registrado: Mié Mar 12, 2008 2:49 pm

Notapor thepoi » Sab Jun 07, 2008 7:13 pm

Lo que pasa es que el "juego" para el que use los eventos estos era mi primera toma de contacto con la SDL, iba copiando cosas de libros y tutoriales para irme familiarizando.

LLegado un momento me aburrí de él y lo dejé aparcado con cosas a medio hacer y el codigo muy sucio.

El juego del otro post mio no tiene nada que ver con este, el del otro post es en el q estoy trabajando ahora mismo y se podria decir que es el primer juego que estoy haciendo, ya que el otro es mas bien un aborto xdd.

En cuanto tengo algo potable no dudaré en enseñarlo
thepoi
 
Mensajes: 17
Registrado: Sab May 31, 2008 9:41 pm


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron