Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Clase Para Teclado

Iniciado por tiutiu, 17 de Julio de 2003, 10:20:59 AM

« anterior - próximo »

tiutiu

 Bueno, me estoy rompiendo la cabeza sobre como hacer una clase para controlar el teclado. Vosotros como lo haceis? desde el WndProc cogiendo el WM_KEYDOWN y WM_KEYUP?

Mi problema es el siguiente: quiero que aguante una tecla, es decir, que no haga repeticiones. Por ejemplo si tengo q desactivar/activar una luz y dejo la tecla pulsada pues empezaria a parpadear por la repeticion d teclas, y pq en cada frame simplemente miro si esta abajo la tecla. Pues quiero evitar eso. Habia pensado en recoger el estado anterior d la tecla en un array bool keyStates[256], pero no se dnd llenarlo.
A ver q consejos me podeis dar pq toy bloqueao xD
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

tiutiu

 Vale, he encontrado una solucion, aunq no me gusta por el tamaño d los arrays y to eso.

Tengo 2 arrays:
bool keyStates[256];
bool keyPressed[256];

En el WM_KEYDOWN pongo el keyState[wParam] a true y en el WM_KEYUP a false, hasta ahi bien.
Cuando entro a la funcion del teclado, para comprobar si una tecla esta pulsada pues miro el keystate, y para q haga el efecto q yo quiero, usea q haga algo solo una vez por pulsacion (por mucho q deje la tecla pulsada) es mirar si keyPressed[tecla] esta a false, entonces entra y lo pongo a true, asi ya no vuelve a entrar mas. Fuera de este if miro si keyState[tecla] esta a false y entonces pongo el keyPressed a false tb.

Pues bien, no se porque pero no lo veo muy optimizao, asi q si a alguien se le ocurre algo mejor pues q lo diga ;)
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

sés

 WM_KEYDOWN/UP no tienen en cuenta la autorepetición de la tecla... bueno.. o sí, según lo mires ^_^


Si te llega la tecla 13, por ejemplo, pones  keyPressed[13] = 1
Si esa tecla la mantienes pulsada,  keyPressed[13] siempre valdrá 1

Puedes querer usar la autorepetición del teclado y, si no recuerdo mal, sólo tienes que poner  keyPressed[13] = 0 cada vez que quieras:

Con esto no tendrías repetición:
switch( mensaje ) {
 case WM_KEYUP:
   tecla = LOQUESEAQUENORECUERDOAHORA; // ^_^
   keyPressed[tecla] = 0;
   break;
 case WM_KEYDOWN:
   tecla = LOQUESEAQUENORECUERDOAHORA; // ^_^
   keyPressed[tecla] = 1;
   break;
}

...

// procesar teclado
if( keyPressed[mitecla] ) {
 //hacer algo
}




Con esto SÍ tendrías repetición:
switch( mensaje ) {
 case WM_KEYUP:
   tecla = LOQUESEAQUENORECUERDOAHORA; // ^_^
   keyPressed[tecla] = 0;
   break;
 case WM_KEYDOWN:
   tecla = LOQUESEAQUENORECUERDOAHORA; // ^_^
   keyPressed[tecla] = 1;
   break;
}

...

// procesar teclado
if( keyPressed[mitecla] ) {
 //hacer algo
 keyPressed[mitecla] = 0;  // <<---- esto provoca la autorepetición
}



Bueno... creo que era así, pero hace tiempo que no lo toco.


Citar...no me gusta por el tamaño d los arrays y to eso.
(ses) ¿Tanto te parece un array de 256? ... De todas formas te sirve con uno de 128, no hay tantas teclas.
Soy indeciso... ¿o no?

ethernet

 como se borra un mensaje? He escrito una cosa pero no tenía nada que ver ;) sorryx

   

BeRSeRKeR

 Una opción sería comprobar si ha transcurrido un cierto tiempo desde la última pulsación de la tecla. Al fin y al cabo, si haces un juego es posible que lo tengas que programar. Por ejemplo cada arma en un FPS tendrá una cadencia de disparo (la ametralladora tiene una cadencia mucho mayor que una recortada :D)...

Saludos
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






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.