/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema con captura de teclado en windows

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
GrayFox



Registrado: 28 Ene 2007
Mensajes: 47

MensajePublicado: 26/10/2007 11:41 am
Título: Problema con captura de teclado en windows

Hola

Tengo el siguiente problema, un juego, dos jugadores cada jugador maneja una nave. Cada nave puede ejecutar 5 acciones: Acelerar, desacelerar, girar a la deracha, girar a la izquierda y disparar.
Para el control de treclado hice esto:
Código:

bool bActivar;
bActivar=false;

...

case WM_KEYDOWN:
      if(wParam==VK_ESCAPE)
      {
         if(MessageBox(NULL,"¿Estas seguro de que deseas salir?","Salir",MB_YESNO)==IDYES)
         {
            PostQuitMessage(0);
         }
      }
      bActivar=true;


   case WM_KEYUP:
      switch(wParam)
      {
      //Jugador 1
      case VK_NUMPAD0:
         Juego.ActivaTecla(JUGADOR_2,KEY_SHOT,bActivar);
         break;
      case VK_NUMPAD6:
         Juego.ActivaTecla(JUGADOR_2,KEY_RIGHT,bActivar);
         break;
      case VK_NUMPAD4:
         Juego.ActivaTecla(JUGADOR_2,KEY_LEFT,bActivar);
         break;
      case VK_NUMPAD8:
         Juego.ActivaTecla(JUGADOR_2,KEY_UP,bActivar);
         break;
      case VK_NUMPAD5:
         Juego.ActivaTecla(JUGADOR_2,KEY_DOWN,bActivar);
         break;
      //Jugador 2
      case VK_SPACE:
         Juego.ActivaTecla(JUGADOR_1,KEY_SHOT,bActivar);
         break;
      case (int)'D':
         Juego.ActivaTecla(JUGADOR_1,KEY_RIGHT,bActivar);
         break;
      case (int)'A':
         Juego.ActivaTecla(JUGADOR_1,KEY_LEFT,bActivar);
         break;
      case (int)'W':
         Juego.ActivaTecla(JUGADOR_1,KEY_UP,bActivar);
         break;
      case (int)'S':
         Juego.ActivaTecla(JUGADOR_1,KEY_DOWN,bActivar);
         break;
      }

Juego es un objeto del tipo game:
Código:

//Teclado:
#define   KEY_SHOT         0
#define KEY_RIGHT         1
#define KEY_LEFT         2
#define KEY_UP            3
#define KEY_DOWN         4
//Jugadores
#define JUGADOR_1         0
#define JUGADOR_2         1
//Clase Game
class Game : public Singleton<Game>
{
   //Propiedades
   GLWMC m_glwVentana;         //La ventana
   bool m_bKeys[2][5];         //Control de teclado
   Circulo   m_cirNave[2];      //La nave (Logica)
   Textura m_texNave[2][2];   //La nave (Textura)
   DisplayList m_dlNave;      //La nave (Grafica)
   Vector m_vMov[2];         //El movimiento de la nave
   Rectangulo m_recVida[2];   //La vida de las naves
   DisplayList m_dlBarras[2];   //Las barras de vida
   DWORD m_dwTiempo;         //Para regular los frames
   //Metodos internos
   void Mover();
   void Mostrar();
   void ChkCol();
public:
   //Interfaz
   void Frame();
   //Metodos mutadores
   void ActivaTecla(int iJugador,int iTecla,bool bValor){m_bKeys[iJugador][iTecla]=bValor;};
   //Constructor
   Game();
   //Clases amigas
   friend class Singleton<Game>;
};


El problema es que algunas teclas como que se molestan entre si.
Por ej: Si el jugador 1 esta doblando (hacia cualquier lado) no puede desacelerar y disparar a la vez. Si el juegador dos esta desacelerando y acelerando a la vez(un poco bobo) no puede doblar.
Osea []=Mantener presionada

Si ([6]o[4])y[5]=>No funciona 0
Si ([6]o[4])y[0]=>No funciona 5
Si [W]y[S]=>No funcionan A y D

Y asi hay mas conbinaciones. Algunas inculso afectan los controles de ambas naves. Si ambas giran en cualquier direccion mientras disparan, solo una de ellas puede acelerar. Estas interferencias son DE LAS TECLAS porque a probe que se acelere con con el espacio que se dispare con la A, etc y sigue dando los mismos problemas. Los problemas que tiene una nave tambien los tiene la otra. Tiene algo que ver con la cantidad de teclas pulsadas al mismo tiempo? Si es asi como puedo evitarlo?

Desde ya gracias
Salu2
GrayFox
Volver arriba
jonan_1988



Registrado: 12 Abr 2005
Mensajes: 55

MensajePublicado: 27/10/2007 3:49 am
Título:

Eso pasa por hacer control de eventos directo.

SDL tiene el mismo problema y la solución fácil es la siguiente (en SDL, luego tu amoldalo como quieras Wink ):

1) Crear un array tan grande como teclas hay en el teclado y lo inicializas a 0 (o false si es un bool). En SDL ese array es de 323.

2) Cargas el ultimo evento de teclado. Si han presionado una tecla, pones su correspondiente variable del array a 1 o true, si se ha soltado una tecla, la pones a 0 o false.
Código:
if (event.type == SDL_KEYDOWN) {
   keys[event.key.keysym.sym] = true;
}
else if (event.type == SDL_KEYUP) {
   keys[event.key.keysym.sym] = false;
}


3) Preguntas por la variable dentro del array.
Código:
if (key[SDLK_ESCAPE]) { ... }

_________________
Diario de un pre-informático
Volver arriba
_Martin_



Registrado: 03 Ago 2006
Mensajes: 165

MensajePublicado: 27/10/2007 6:13 am
Título:

Hola, la verdad es que nunca probe la solucion de jonan, asi que no puedo hablar mucho del tema.
A mi me sucedia lo mismo y el por que se debe a la estructura interna del hardware del teclado. No tiene que ver con la cantidad de teclas presionadas a la vez, sino mas bien con "que teclas tengo presionadas a la vez".
Con esto me refiero que una determinada combinacion de teclas (supongamos 7 teclas) se pueden presionar conjuntamente sin ningun problema (se escriben las 7 letras) No obstante uno puede elejir otra combinacion de letras (supongamos 7) y el resultado difiere del anterior (solo se imprimen 5)
Para darte un ejemplo sencillo intenta escribir "qwerty" (6 letras) presionado todas las teclas a la vez. En mi caso particular solo logro escribir "rewq" (4 letras).
Ahora prueba con qweruiop (8 letras). Uno podria pensar que si con 6 letras el resultado fue 4, entonces con 8, seguramente seria menor. Para sorpresa de todos, en mi caso logro escribir roqeupwi (8 letras).

Saludos

PD: jonas, podrias postear un mini ejemplo de los que propones?
Volver arriba
GrayFox



Registrado: 28 Ene 2007
Mensajes: 47

MensajePublicado: 27/10/2007 10:23 am
Título:

Bueno hice un par de pruebas en el bloc de nots y no me funcionan la mismas convinaciones que en el juego. Le pedi a alguna gente por msn que hiciera la prueba y tampoco le funcionan la teclas. Por lo tanto el problema es del teclado. Si el problema es del teclado, no hay nada que yo como programador pueda hacer no? Entonces la unica solucion es configurar los controles para que no se interfieran. Cambie las teclas de disparar y ahora todo funciona perfecto, Se dispara con shift y control (cualquiera podria hacer disparar a la nave contraria pero bue).
Y ahora que lo pienso, en ningun juego se usan tantas teclas (3 al mismo tiempo a lo sumo). Esto significa que todos los juegos, incluso los de las grandes companias, subordinan sus controles a estas reglas? No existe alguna manera de cambiar la configuracion del teclado para que se pueda escribir D mientras se mantienen WyS?

Gracias por las respuestas

Salu2
GrayFox
Volver arriba
jonan_1988



Registrado: 12 Abr 2005
Mensajes: 55

MensajePublicado: 27/10/2007 11:52 am
Título:

_Martin_ escribió:
PD: jonas, podrias postear un mini ejemplo de los que propones?


Claro Wink

Código:
SDL_Event teclado;

bool keys[323];
bool done=false;

for (int i=0; i < 323; i++)
   keys[i] = 0;

while (!done) {
   if ( SDL_PollEvent(&teclado) ) {
      if (teclado.type == SDL_KEYDOWN)
         keys[teclado.key.keysym.sym] = true;
      else if (teclado.type == SDL_KEYUP)
         keys[teclado.key.keysym.sym] = false;
   }

   if ( keys[SDLK_ESCAPE] ) done=true;
   if ( keys[SDLK_a] ) { // La tecla "a" esta presionada }
   if ( keys[SDLK_z] ) { // La tecla "z" esta presionada }
}


Lógicamente está en SDL Laughing

SDL guarda todos los eventos en una pila y con SDL_PollEvent() se van sacando y procesando, así no se queda ninguna tecla por procesar.

Entre esto y lo que he dicho antes no creo que haya mayor problema.
_________________
Diario de un pre-informático
Volver arriba
_Martin_



Registrado: 03 Ago 2006
Mensajes: 165

MensajePublicado: 27/10/2007 7:49 pm
Título:

Hola, probe tu codigo y el resultado es el mismo. Por supuesto que en vez de probar las teclas A y Z, probe con mas teclas como QWERTY (y en mi caso obtuve el resultado QWER ) Yo tambien pense en un momento que era problema de SDL pero descubri que tiene que ver con la arquitectura del hardware del teclado.

Saludos
Volver arriba
jonan_1988



Registrado: 12 Abr 2005
Mensajes: 55

MensajePublicado: 28/10/2007 1:32 am
Título:

_Martin_ escribió:
Hola, probe tu codigo y el resultado es el mismo. Por supuesto que en vez de probar las teclas A y Z, probe con mas teclas como QWERTY (y en mi caso obtuve el resultado QWER ) Yo tambien pense en un momento que era problema de SDL pero descubri que tiene que ver con la arquitectura del hardware del teclado.

Saludos


Ya se que el problema es del hardware, pero en un juego aunque tengas que tener presionadas 5 teclas a la vez, estas no las presionas juntas. Tienes una presionada y luego presionas otra, luego igual dos y así. Con el código que he puesto, recuerdas que teclas estan presionadas y no da ningún error. Por lo menos a mi.
_________________
Diario de un pre-informático
Volver arriba
GrayFox



Registrado: 28 Ene 2007
Mensajes: 47

MensajePublicado: 29/10/2007 10:33 am
Título:

En mi caso particular, el problema no es que tenga las teclas presionadas al mismo tiempo. Si presiono S luego W y luego D la D no responde. De hecho cuando S y W estan presionadas no funcionan Q, A, E y D (Aunque presione y suelte la tecla 50 veces) Osea, es el teclado el que no manda el mensaje. Como las teclas que se bloquean son las que estan al lado de las que mantengo, supongo que debe tener algo que ver con el circuito electronico interno del teclado. Todavia me falta hacer la prueba con un juego enserio como el counter, pero como tengo un problema en la placa de video no me corren.
Eso si hice la prueba con el emulador de Play Station Conectix Virtual Game Station y el me da mismo problema. Si me pasa lo mismo con el CS ya esta, es el teclado y no hay nada que se pueda hacer.

Salu2
GrayFox

PD: ¿Que botones deberia usar para lanzar los misiles sin que se interfieran? Confused
Volver arriba
_Martin_



Registrado: 03 Ago 2006
Mensajes: 165

MensajePublicado: 29/10/2007 2:54 pm
Título:

Bueno como bien dijiste es altamente probable que el problema sea del hardware y dado que hay mucha variedad de teclados distinto, es posible que una determinada combinacion de teclas funcionen en una maquina mientras que en otra no.
Supongo que lo mas acertado seria poder darle una opcion al usuario para que pueda cambiar las teclas a utilizar.

Saludos

PD: para Jonas, lo que escribio Grayfox en el post anterior al mio ejemplifica tambien mi problema con las teclas presionadas.

PD: Grayfox, cuando pruebes el counter, postea los resultados
Volver arriba
nod



Registrado: 09 Nov 2007
Mensajes: 10
Ubicación: Argentina, Buenos Aires

MensajePublicado: 09/11/2007 6:15 am
Título:

Hola, me sumo a la discucion, si me lo permiten, el problema del teclado lo tube hace mucho, con mi primer video juego, en si, todos tienen razon a la vez, es problema del harware y tambien la estructura del algoritmo esta mal, siempre es mejor hacer un vector bool de x elementos, etc... etc...

El problema no tiene solucion, se podria optimizar cambiando el codigo fuente... pero no se solucionaria en un %100. Yo no pude solucionarlo.

Mis saludos... Very Happy
_________________
Nod Kopfnickend.
Volver arriba
GrayFox



Registrado: 28 Ene 2007
Mensajes: 47

MensajePublicado: 09/11/2007 10:06 am
Título:

Hola
Disculpen por no haber posteado. Probé con el counter y pasa exactamente lo mismo, y todavia no encuentro una PC que no tenga este problema, aunque solo hice la prueba en cuatro.

Bueno nuevamente disculpen por abandonar el post. Es el pánico que produce un examen de historia.

Salu2
GrayFox
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com