| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
GrayFox
Registrado: 28 Ene 2007 Mensajes: 47
| Publicado: 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
| Publicado: 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 ):
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
| Publicado: 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
| Publicado: 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
| | | Volver arriba | |  | _Martin_

Registrado: 03 Ago 2006 Mensajes: 165
| Publicado: 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
| Publicado: 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
| Publicado: 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?  |
| | Volver arriba | |  | _Martin_

Registrado: 03 Ago 2006 Mensajes: 165
| Publicado: 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
| Publicado: 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...  _________________ Nod Kopfnickend. |
| | Volver arriba | |  | GrayFox
Registrado: 28 Ene 2007 Mensajes: 47
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |