Foros - Stratos

Stratos => General => Mensaje iniciado por: Vivael13h en 21 de Marzo de 2005, 02:00:57 PM

Título: Detectar Varias Teclas Simultaneas
Publicado por: Vivael13h en 21 de Marzo de 2005, 02:00:57 PM
 Hola a todos.

Me he puesto a revisar un juego de naves que hice hace tiempo con DirectX 8, porque le quería hacer funcionar con un joystick, como ya comenté en otro post. El caso es que me he dado cuenta de un curioso efecto del que no me había dado cuenta hasta ahora, y que me pasa también en otros juegos, y es que hay una diagonal que no me funciona. Me explico:

El código que tengo para manejar el teclado es muy sencillo: hago una llamada a GetKeyboarState, y copio el estado de las 256 teclas de windows en un array BYTE teclado[256]. Y luego compruebo si están pulsadas las teclas del juego: si está pulsada la flecha abajo, aumento la coordenada Y de la nave, si se pulsa espacio creo un disparo, etc. Funciona siempre, menos con la diagonal abajo-izquierda, y esto ya me supera.

En todos los demás casos funciona, que es lo que me extraña. Si pulso a la vez las flechas arriba y derecha (o cualquier otra diagonal) y el disparo, la nave se mueve en esa dirección y dispara a la vez. Pero si pulso flecha abajo y flecha izquierda y disparo, la nave se mueve, pero no dispara.

No se, igual es una chorrada, pero se me ha ocurrido que tal vez justo esta diagonal se lea de una manera distinta. ¿Por qué pasa esto?
Título: Detectar Varias Teclas Simultaneas
Publicado por: Lord Trancos 2 en 21 de Marzo de 2005, 02:18:00 PM
 Me temo que lo que te pasa es..... "normal".

Usa otra tecla que no se espacio. (Control por ejemplo)
Título: Detectar Varias Teclas Simultaneas
Publicado por: fiero en 21 de Marzo de 2005, 02:30:35 PM
 Puedes usar esta macro para detectar las pulsaciones, y utilizar las constantes VK_ para detectar cualquier tecla:

#define TeclaPulsada(key) (GetAsyncKeyState(key) & 0x8000)

luego en el bucle del juego pones:

if(TeclaPulsada(VK_LEFT)) ...

if(TeclaPulsada(VK_UP))...


un saludo

PD: bueno, igual es lo mismo que tienes tu...
Título: Detectar Varias Teclas Simultaneas
Publicado por: samsaga2 en 21 de Marzo de 2005, 02:35:25 PM
 Pero esto ya pasaba desde mis timpos de MSX :-P creo que es mas un problema de hardware que no del sistema operativo. Tal y como funcionan los teclados (no soy ningun experto en el tema) hay ciertas combinaciones de teclas que no se pueden detectar. Ocurre sobretodo cuando las teclas estan en la misma fila.

Un ejemplo cutre:

- Pulso la A y la S a la vez: as
- Pulso la A, S y D a la vez: asd
- Pulso A, S, D y F a la vez: no sale nada :)
Título: Detectar Varias Teclas Simultaneas
Publicado por: Vivael13h en 21 de Marzo de 2005, 05:40:45 PM
 fiero, efectivamente así es como lo hago.

He hecho pruebas y funciona al cambiar la tecla de disparo. Poniendo por ejemplo el tabulador, dispara que se mata.

En fin, qué cosas tiene la ciencia...

Y ya por curiosidad, ¿Por qué se supone que pasa esto?.
Título: Detectar Varias Teclas Simultaneas
Publicado por: sés en 21 de Marzo de 2005, 05:47:20 PM
 Eso siempre ha ocurrido.
Lamentablemente cada teclado es diferente y la única solución es dejar que el usuario redefina las teclas con una combinación que no le dé problemas.

Yo siempre he jugado a lso juegos de lucha con teclas y... claro, en algunos hay que pulsar varias a la vez. Con algunas combinaciones simplemente no puedes estar cubriéndote agachado e intentar dar una patada. O das patadas o te cubres, elige :P

Con el X-Arcade no hay ese problema. El que no lo conozca dirá "pero si es un joystick". Pues... tiene razón ^_^, pero no es un joystick normal.
Este joystick (por defecto) se conecta al teclado y cada botón se limita a simular la pulsación de la tecla que se elija (sistema "simple" donde los haya que lo convierten en un joystick multisistema). Si solo simula pulsaciones de teclas, es de suponer que debería tener el mismo problema, pero no es así.

Esto me hace preguntarme algo: ¿por qué no hay teclados que eviten ese problema como hace el X-Arcade? A saber. ¿Algún electrónico en la sala? ^_^
Título: Detectar Varias Teclas Simultaneas
Publicado por: _Grey en 21 de Marzo de 2005, 05:59:47 PM
 
CitarEsto me hace preguntarme algo: ¿por qué no hay teclados que eviten ese problema como hace el X-Arcade? A saber. ¿Algún electrónico en la sala?

Buena pregunta, hace no mucho que pensaba en esto, y digo yo que si el problema es irresoluble con los teclados "normales" podrian hacer teclados USB como con los ratones y punto.

CitarPero esto ya pasaba desde mis timpos de MSX :-P creo que es mas un problema de hardware que no del sistema operativo

Que yo recuerde en el MSX no tenia interferencia ninguna con la barra espaciadora y los cursores, me di cuenta del problema cuando pase al PC, despues de un tiempo sospechando del porque usar CTRL en lugar de SPACE.

Saludos.
Título: Detectar Varias Teclas Simultaneas
Publicado por: samsaga2 en 21 de Marzo de 2005, 06:05:59 PM
Cita de: "_Grey"
CitarEsto me hace preguntarme algo: ¿por qué no hay teclados que eviten ese problema como hace el X-Arcade? A saber. ¿Algún electrónico en la sala?

Buena pregunta, hace no mucho que pensaba en esto, y digo yo que si el problema es irresoluble con los teclados "normales" podrian hacer teclados USB como con los ratones y punto.

CitarPero esto ya pasaba desde mis timpos de MSX :-P creo que es mas un problema de hardware que no del sistema operativo

Que yo recuerde en el MSX no tenia interferencia ninguna con la barra espaciadora y los cursores, me di cuenta del problema cuando pase al PC, despues de un tiempo sospechando del porque usar CTRL en lugar de SPACE.

Saludos.
A mi me pasaba en el MSX jugando a dobles con el salamander, dos tios jugando en un mismo teclado son MUCHAS teclas a la vez.
Título: Detectar Varias Teclas Simultaneas
Publicado por: egf en 21 de Marzo de 2005, 06:17:32 PM
 el orden en el que pones los if para detectar la presion de las teclas es lo que marca esos problemas
Título: Detectar Varias Teclas Simultaneas
Publicado por: Sacrifai en 21 de Marzo de 2005, 06:40:12 PM
Cita de: "egf"el orden en el que pones los if para detectar la presion de las teclas es lo que marca esos problemas
Generalmente cualquier combinación da problemas.

La verdad es que a mi no me mola nada el metodo del ansykey o como se escriba  :rolleyes: . Si estás usando alguna libreria de juegos casi seguro trae algo para keys. Si no tambien puedes usar ( http://www.n-son.com/scripts/keyLib/ - no la he probado pero tiene buena pinta ). Recuerda usar arrays para esta ardua tarea  :) .
Título: Detectar Varias Teclas Simultaneas
Publicado por: sés en 21 de Marzo de 2005, 09:31:17 PM
Cita de: "egf"el orden en el que pones los if para detectar la presion de las teclas es lo que marca esos problemas
(ses) ¿ein?
Eso no tiene nada que ver.
Título: Detectar Varias Teclas Simultaneas
Publicado por: ShAq en 21 de Marzo de 2005, 10:12:30 PM
Cita de: "Sacrifai"Si estás usando alguna libreria de juegos casi seguro trae algo para keys. Si no tambien puedes usar ( http://www.n-son.com/scripts/keyLib/ - no la he probado pero tiene buena pinta ). Recuerda usar arrays para esta ardua tarea  :) .
pero esa libreria no es para javascript  (uoh)  
Título: Detectar Varias Teclas Simultaneas
Publicado por: Sacrifai en 21 de Marzo de 2005, 10:28:31 PM
Cita de: "ShAq"
Cita de: "Sacrifai"Si estás usando alguna libreria de juegos casi seguro trae algo para keys. Si no tambien puedes usar ( http://www.n-son.com/scripts/keyLib/ - no la he probado pero tiene buena pinta ). Recuerda usar arrays para esta ardua tarea  :) .
pero esa libreria no es para javascript  (uoh)
No se, vi la pagina tan bonita  :rolleyes:  .


PD: Era un simple ejemplo  :lol:  .



(rules)     <_<  
Título: Detectar Varias Teclas Simultaneas
Publicado por: [EX3] en 21 de Marzo de 2005, 10:54:34 PM
 Ahora que comentais el tema me estoy acordando de cuando jugabamos 4 personas en el mismo teclado (si si, 4 personas  (uoh) ) a una version del juego de motos de luz de la mitica pelicula Tron, el juego en cuestion GL_Tron, el player 1 si pulsaba 4 teclas simultaneas, las que fuese, bloqueaba al resto de jugadores impidiendo que estos pudiesen controlar sus motos, era toda una cabronada (twist)

Salu2...
Título: Detectar Varias Teclas Simultaneas
Publicado por: egf en 22 de Marzo de 2005, 12:13:37 AM
 el orden en que esta escrito un codigo puede variar el resultado  
Título: Detectar Varias Teclas Simultaneas
Publicado por: senior wapo en 22 de Marzo de 2005, 12:39:25 AM
 Es un problema de hard, creo.

Por lo que sé, mas bien, creo recordar que creo haber leido que creo que decian en una revista que creian que era por esto:

Los teclados no tienen 102 interruptores que detectar individualmente porque sería muy costoso. Lo que hacen es que tienen un circuito por fila y otro por columna, como una malla. Cuando pulsas una tecla cierras el circuito y pasa corriente por su fila y columna, y así detectan la pulsación si es 1 tecla.

¿ Pero que pasa si pulsas 4 teclas que forman un cuadrado ? ¿ Has pulsado 4 o has pulsado 2 esquinas opuestas?

Algo asi era... que conteste algún experto  :)  
Título: Detectar Varias Teclas Simultaneas
Publicado por: Sacrifai en 22 de Marzo de 2005, 12:54:00 AM
Cita de: "[EX3"] Ahora que comentais el tema me estoy acordando de cuando jugabamos 4 personas en el mismo teclado (si si, 4 personas  (uoh) ) a una version del juego de motos de luz de la mitica pelicula Tron, el juego en cuestion GL_Tron, el player 1 si pulsaba 4 teclas simultaneas, las que fuese, bloqueaba al resto de jugadores impidiendo que estos pudiesen controlar sus motos, era toda una cabronada (twist)

Salu2...
Y ese magico sonido del speaker ( o como se llame ) :lol:  
Título: Detectar Varias Teclas Simultaneas
Publicado por: sés en 22 de Marzo de 2005, 08:57:48 AM
 
Cita de: "egf"el orden en que esta escrito un codigo puede variar el resultado
Pero si una tecla está o no pulsada no depende para nada del orden en que tú preguntes. Si está pulsada, lo está.

Cita de: "senior wapo"¿ Pero que pasa si pulsas 4 teclas que forman un cuadrado ? ¿ Has pulsado 4 o has pulsado 2 esquinas opuestas?
En el viejo Spectrum, si pulsabas ciertas teclas era equivalente a pulsar otra distinta.
Como dices, tiene que ver con la matriz que forma el teclado. Un ejemplo imaginario:
Pulsas Q, W y S. Como has pulsado 3 de las 4 esquinas de un cuadrado (Q,W,S,A), el ordenador cree que se ha pulsado la A.

En Spectrum era así. En PC (por lo que he comprobado), si pulsas varias teclas, dependiendo de las que sean y del teclado, simplemente no se detectan:
Pulsas A... ok, pulsas S... ok, pulsas D... ok, pulsas J... y de esta ya no se entera. Sin embargo puede que sí se entere si pulsas la O o la Y. A saber.

En los viejos ordenadores (Spectrum, Amstrad, MSX...) "no se daba ese problema" porque todos los teclados ERAN IGUALES. Los programadores buscaban combinaciones de teclas que no dieran problemas y listos. Además... ni de coña se utilizaban tantas teclas en los juegos :P
Título: Detectar Varias Teclas Simultaneas
Publicado por: BeRSeRKeR en 22 de Marzo de 2005, 09:42:25 AM
 Efectivamente hay combinaciones que no detecta. Para probar, he abierto el ejemplo de la SDK de DX que muestra el funcionamiento del teclado a través de DInput y por ejemplo me deja pulsar A,S,D,F,J,K,L,Ñ o Q,W,E,R,J,K,L,Ñ pero no A,S,D,F,Q,W,E,R o J,K,L,Ñ,U,I,O,P ni tampoco A,S,D,W.

Saludos.
Título: Detectar Varias Teclas Simultaneas
Publicado por: sés en 22 de Marzo de 2005, 10:06:16 AM
 Sí, pero como ya he dicho: depende del teclado.

Para los juegos de lucha, en mi teclado uso G,J,Y,N (o F,H,T,B) para las direcciones y 1,2,3,Q,W,E para los golpes. Sin embargo esas teclas no funcionan bien en otros teclados.
Por ejemplo: Me ocubro agachado (G+N) y ya no me reconoce la E (patada fuerte)

En casa de un amigo tuve que buscar una combinación que funcionara en el suyo... que asco.