Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Marth en Agosto 04, 2015, 09:35:20 PM

Título: Lio con los mandos. [Solucionado]
Publicado por: Marth en Agosto 04, 2015, 09:35:20 PM
Verán, me he encontrado con que GMS tiene 2 tipos de funciones para el uso de mandos en el juego: las funciones tipo "joystick_" y las tipo "gamepad_". Parece ser que las gamepad están pensadas para mandos de Xbox mientras que para otros tipos de mandos están las joystick.
Como yo utilizo para jugar en el PC un mando que es una imitación de los "dual shock" de las Play Station, utilizo funciones joystick y así puedo jugar a mis juegos usando ese mando sin ningún contratiempo, pero me estoy encontrando con algunos problemas respecto a gente que ha probado mis juegos...

Si el mando si es tipo "PS Control Pad" (el primer tipo de mando de las Play Station, las que aun no tenían palancas), el control da errores que hace que se este "pulsando" constantemente los botones "izquierda" y "arriba" de la cruceta.
Ademas, a algunos que si tienen mandos de xbox (360, concretamente) el juego no ha reconocido el movimiento del mando a pesar de haber añadido funciones tipo gamepad para que tambien pudiesen jugar.

Aparte de que yoyogames pula mejor las funciones, ¿que podría hacer para que la gente que tiene mando sin palancas analogicas o usen los mandos de las xbox puedan jugar sin problemas?
Título: Re:Lio con los mandos.
Publicado por: penumbra en Agosto 04, 2015, 10:18:14 PM
http://www.comunidadgm.org/preguntas-y-respuestas/compatibilidad-con-gamepad/msg113539/#msg113539

http://www.x360ce.com/default.aspx
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 04, 2015, 11:39:10 PM
Cita de: penumbra en Agosto 04, 2015, 10:18:14 PM
http://www.comunidadgm.org/preguntas-y-respuestas/compatibilidad-con-gamepad/msg113539/#msg113539

http://www.x360ce.com/default.aspx

Descargue el emulador, pero me dan varios errores cuando intento ejecutarlo. :-X

A parte, veo que me he metido en otra chapuza para solucionar un contratiempo: uso de emuladores para poder jugar utilizando mandos.
¡La próxima que necesite ayuda con Game Maker iré a pedírsela a Pepe Gotera y Otilio! XD
Título: Re:Lio con los mandos.
Publicado por: penumbra en Agosto 05, 2015, 12:04:10 AM
No sé a qué se deberá, a mi me funciona sin problemas. Más que chapuza, a mi me parece una solución el uso del emulador, incluso muchos usuarios que tienen controles de Playstation o genéricos lo usan con juegos AAA. Así que si sirve para juegos "de más categoría" no veo por qué no usarlo con GMS.

Sobre las funciones gamepad, yo las he probado con controles originales de xbox y con controles que no son de microsoft pero que soportan la conexión a xbox 360 y en ambos casos funcionan. También se puede implementar código en GML para detectar si el mando es un mando que soporte las funciones gamepad o si es un mando genérico y en tal caso decidir si se usan las funciones gamepad o las joystick.
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 05, 2015, 12:27:01 AM
Por cierto, ahora ha salido otro diciendo que puede jugar usando mandos de Xbox, ¡pero la cruceta siempre desviá hacia arriba-izquierda, como al del mando tipo Play Station sin palancas analógicas!
Por lo visto, a cada cual, los mandos le funciona de forma distinta...
Título: Re:Lio con los mandos.
Publicado por: Clamud en Agosto 05, 2015, 03:27:36 AM
¿Los ejes te devuelven -1 o es un valor pequeño?
Es un comportamiento muy extraño, también lo he encontrado al dejar desativadas las palancas analógicas en el mando.
Si las funciones de ejes te devuelven un valor pequeño, la solución es usar una zona muerta.
Título: Re:Lio con los mandos.
Publicado por: Guacusio en Agosto 05, 2015, 05:16:25 AM
¿Sería posible ver el código con el cual lees el joystick? ¿Mapeas el joystick a las teclas correspondientes?
Título: Re:Lio con los mandos.
Publicado por: empardopo en Agosto 05, 2015, 09:01:30 AM
No sé si le servirá a alguien pero hace tiempo programé el AllInOneFYC (http://arcadespain.info/Foro/index.php?board=76.0).
Se trata de un programita que sirve para remapear teclas/botones ademñas de muchas otras cosas como lanzar procesos, matarlos, subir el volumen del PC, bajarlo, etc, etc pulsando botones o teclas o combinaciones de ellas.

Saludos
Título: Re:Lio con los mandos.
Publicado por: canuto120 en Agosto 05, 2015, 09:43:22 AM
Es problema del emulador y su configuracion o del mando en si, por la sensibilidad del mismo, en su dia intente jugar con mando de ps3 al kingdom hearts de la ps2 emulador ps2 y el personaje se me iba todo el rato hacia un lado si no tocaba nada, me pasaba con todos los juegos al que intentaba jugar con el mando de ps3.
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 05, 2015, 11:31:33 AM
Adjunto un exportable en el cual se puede mover una nave con la palanca del mando xinput.
Con algo de Fortuna, hoy conseguiré que me presten uno de estos dichosos mandos y podre probar personalmente que ocurre con estos.
Título: Re:Lio con los mandos.
Publicado por: Guacusio en Agosto 05, 2015, 09:01:40 PM
El exportable que adjuntaste funciona bien con un mando Xbox360: se puede controlar la nave con la palanca. Sin embargo, ese código no te servirá para los mandos tipo "PS Control Pad" sin palanca. Si tu juego es de un solo jugador, para hacerlo compatible con ambos tipos de joystick te sugiero que primero compruebes que la función gamepad_is_connected(0) devuelve true; si es así, usa el código con las funciones gamepad que adjuntaste y en caso contrario usa las funciones joystick (no es tan engorroso como parece). Para dilucidar el asunto de por qué la nave se va hacia la izquierda habría que revisar el código que usas con las funciones joystick.

Cita de: canuto120 en Agosto 05, 2015, 09:43:22 AM
Es problema del emulador y su configuracion o del mando en si, por la sensibilidad del mismo, en su dia intente jugar con mando de ps3 al kingdom hearts de la ps2 emulador ps2 y el personaje se me iba todo el rato hacia un lado si no tocaba nada, me pasaba con todos los juegos al que intentaba jugar con el mando de ps3.

No creo que sea el caso. Probé el juego de Marth (http://www.comunidadgm.org/juegos-en-desarrollo/iliada-espacial/ (http://www.comunidadgm.org/juegos-en-desarrollo/iliada-espacial/)) con un joystick tipo PS Control Pad sin usar ningún emulador y la nave se va sola hacia la esquina de la pantalla; tampoco es problema de calibración del joystick porque lo probé en otros juegos y eso no me sucede.
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 05, 2015, 09:33:57 PM
Cita de: Guacusio en Agosto 05, 2015, 09:01:40 PM
El exportable que adjuntaste funciona bien con un mando Xbox360: se puede controlar la nave con la palanca. Sin embargo, ese código no te servirá para los mandos tipo "PS Control Pad" sin palanca. Si tu juego es de un solo jugador, para hacerlo compatible con ambos tipos de joystick te sugiero que primero compruebes que la función gamepad_is_connected(0) devuelve true; si es así, usa el código con las funciones gamepad que adjuntaste y en caso contrario usa las funciones joystick (no es tan engorroso como parece). Para dilucidar el asunto de por qué la nave se va hacia la izquierda habría que revisar el código que usas con las funciones joystick.

Cita de: canuto120 en Agosto 05, 2015, 09:43:22 AM
Es problema del emulador y su configuracion o del mando en si, por la sensibilidad del mismo, en su dia intente jugar con mando de ps3 al kingdom hearts de la ps2 emulador ps2 y el personaje se me iba todo el rato hacia un lado si no tocaba nada, me pasaba con todos los juegos al que intentaba jugar con el mando de ps3.

No creo que sea el caso. Probé el juego de Marth (http://www.comunidadgm.org/juegos-en-desarrollo/iliada-espacial/ (http://www.comunidadgm.org/juegos-en-desarrollo/iliada-espacial/)) con un joystick tipo PS Control Pad sin usar ningún emulador y la nave se va sola hacia la esquina de la pantalla; tampoco es problema de calibración del joystick porque lo probé en otros juegos y eso no me sucede.

En la ultima actualización he probado a hacer lo que sugieres de la función "is connected". Pruebalo y a ver si esta es la buena.
Probaste el exportable y funciono a la perfección.
Si en mi juego sigue habiendo ese contratiempo, iré subiendo en este chat versiones de este exportable a ver si así voy viendo como arreglar esto.
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 12, 2015, 10:59:56 PM
Al final, incluso con el sistema de checkeo sigue habiendo errores.
Subo el programa de la anterior vez pero con un añadido: ahora también es posible controlar la nave con un mando normal.
Que todo el que tenga algún tipo de mando lo pruebe y me diga si funciona perfectamente o el control es defectuoso.
Título: Re:Lio con los mandos.
Publicado por: Guacusio en Agosto 13, 2015, 09:08:25 PM
Cita de: Marth en Agosto 12, 2015, 10:59:56 PM
Al final, incluso con el sistema de checkeo sigue habiendo errores.
Subo el programa de la anterior vez pero con un añadido: ahora también es posible controlar la nave con un mando normal.
Que todo el que tenga algún tipo de mando lo pruebe y me diga si funciona perfectamente o el control es defectuoso.

El programa que adjuntaste funciona bien tanto para joystick tipo Xbox como para uno genérico (en el caso del joystick Xbox la nave se mueve con la palanca en vez de la cruceta).

Probé también tu juego y ahora reconoce ambos tipos de mando. Sin embargo, el problema de que la nave se tiende a ir a la esquina superior izquierda de la pantalla, aún sin presionar nada, sigue existiendo para el joystick genérico. Cuando el joystick Xbox está conectado, la nave nunca se queda quieta aún cuando se suelte el mando, y tiende a irse a distintas direcciones.
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 13, 2015, 09:24:31 PM
Cita de: Guacusio en Agosto 13, 2015, 09:08:25 PM
Cita de: Marth en Agosto 12, 2015, 10:59:56 PM
Al final, incluso con el sistema de checkeo sigue habiendo errores.
Subo el programa de la anterior vez pero con un añadido: ahora también es posible controlar la nave con un mando normal.
Que todo el que tenga algún tipo de mando lo pruebe y me diga si funciona perfectamente o el control es defectuoso.

El programa que adjuntaste funciona bien tanto para joystick tipo Xbox como para uno genérico (en el caso del joystick Xbox la nave se mueve con la palanca en vez de la cruceta).

Probé también tu juego y ahora reconoce ambos tipos de mando. Sin embargo, el problema de que la nave se tiende a ir a la esquina superior izquierda de la pantalla, aún sin presionar nada, sigue existiendo para el joystick genérico. Cuando el joystick Xbox está conectado, la nave nunca se queda quieta aún cuando se suelte el mando, y tiende a irse a distintas direcciones.

Pues con esta historia flipo en colores: según tu, a excepción de mandos sin palancas analógicas, se puede jugar perfectamente, pero una vez recibí un aviso de que con un mando de Xbox la nave se va a la esquina inferior derecha (la inversa del mando sin palancas).
Título: Re:Lio con los mandos.
Publicado por: Guacusio en Agosto 13, 2015, 09:29:21 PM
Si en tu juego estás usando el mismo código que el del programa que adjuntaste no veo de dónde puede existir esa diferencia tan grande de comportamientos. ¿Usas el mismo código para leer el joystick?
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 14, 2015, 12:17:00 AM
Cita de: Guacusio en Agosto 13, 2015, 09:29:21 PM
Si en tu juego estás usando el mismo código que el del programa que adjuntaste no veo de dónde puede existir esa diferencia tan grande de comportamientos. ¿Usas el mismo código para leer el joystick?

Puesto que también debo dar cabida al movimiento con teclado, no es exactamente el mismo código que en los exportables, aunque reconozco que se podría pulir un poco :-[:

if((keyboard_check(vk_left) || (joystick_exists(0) && joystick_xpos(0)<0) || (gamepad_is_connected(0) && gamepad_axis_value(0,gp_axislh)<0)) && x>view_xview[0]+sprite_xoffset) x-=desplazamiento
else if((keyboard_check(vk_right) || (joystick_exists(0) && joystick_xpos(0)>0) || (gamepad_is_connected(0) &&  gamepad_axis_value(0,gp_axislh)>0)) && x<view_xview[0]+view_wview[0]-sprite_width+sprite_xoffset) x+=desplazamiento
if((keyboard_check(vk_up) || (joystick_exists(0) && joystick_ypos(0)<0) || (gamepad_is_connected(0) &&  gamepad_axis_value(0,gp_axislv)<0)) && y>view_yview[0]+sprite_yoffset) y-=desplazamiento
else if((keyboard_check(vk_down) || (joystick_exists(0) && joystick_ypos(0)>0) || (gamepad_is_connected(0) &&  gamepad_axis_value(0,gp_axislv)>0)) && y<Escenario.y-sprite_height+sprite_yoffset) y+=desplazamiento
Título: Re:Lio con los mandos.
Publicado por: Guacusio en Agosto 14, 2015, 06:09:28 AM
CitarPuesto que también debo dar cabida al movimiento con teclado, no es exactamente el mismo código que en los exportables, aunque reconozco que se podría pulir un poco :-[:

if((keyboard_check(vk_left) || (joystick_exists(0) && joystick_xpos(0)<0) || (gamepad_is_connected(0) && gamepad_axis_value(0,gp_axislh)<0)) && x>view_xview[0]+sprite_xoffset) x-=desplazamiento
else if((keyboard_check(vk_right) || (joystick_exists(0) && joystick_xpos(0)>0) || (gamepad_is_connected(0) &&  gamepad_axis_value(0,gp_axislh)>0)) && x<view_xview[0]+view_wview[0]-sprite_width+sprite_xoffset) x+=desplazamiento
if((keyboard_check(vk_up) || (joystick_exists(0) && joystick_ypos(0)<0) || (gamepad_is_connected(0) &&  gamepad_axis_value(0,gp_axislv)<0)) && y>view_yview[0]+sprite_yoffset) y-=desplazamiento
else if((keyboard_check(vk_down) || (joystick_exists(0) && joystick_ypos(0)>0) || (gamepad_is_connected(0) &&  gamepad_axis_value(0,gp_axislv)>0)) && y<Escenario.y-sprite_height+sprite_yoffset) y+=desplazamiento

Sí, se podría pulir, sobre todo para hacerlo más legible y fácil de depurar. Copié tu código en GMS asumiendo lo siguiente:

-El código va en el evento step
-La variable desplazamiento la tomé como 1
-La variable Escenario.y la tomé como 0 (supongo que la usas para detectar cuándo la nave toca el borde superior de la pantalla)

Probé el código con el joystick genérico y el resultado fue que... la nave se dirige automáticamente hacia el borde superior izquierdo de la pantalla si no se toca el joystick; si se presiona hacia la derecha entonces la nave se va hacia la derecha pero si se suelta se vuelve a ir a la izquierda; si se presiona hacia abajo, la nave no sube ni baja.

Noté algo interesante al probar con la función joystick_xpos y joystick_ypos: cuando no se está presionando la dirección correspondiente, la función no retorna 0 sino que -0.01. No sé si es un problema con el joystick que uso o es un bug de GMS; sería genial si tú o alguien más pudiera hacer la prueba. Eso explica por qué la nave se va hacia la esquina superior izquierda cuando no se toca el joystick. Para el caso del joystick de Xbox, las funciones joystick_xpos y joystick_ypos siempre me devuelven 0 como si no leyeran el joystick. Como yo utilizo la función joystick_direction en vez de esas, no me he topado con este problema para leer el joystick genérico.

Personalmente lo que yo hago para incorporar el uso de joystick a un juego es primero crear todo en base a eventos de press o release de teclas y tengo un objeto dedicado al control del joystick que lo que hace es simular las presiones de las teclas en base al input del joystick, utilizando keyboard_key_press y keyboard_key_release (como mapear el joystick al teclado).
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 14, 2015, 02:48:28 PM
El objeto Escenario esta en el borde inferior de la pantalla.
Lo que si es ese curioso defecto de que al no pulsar ningún botón de movimiento marque como -0.01 en vez de 0.
Investigare a ver si a mi también me pasa y lo reportare a yoyogames para que lo corrijan.

Aviso: subo otra vez el programa y ahora aparece en que sentido pulsas los botones.
Yo lo he probado con mi joystic y no sale ningún bug, pero si alguien lo prueba con otro mando y me reporta error, avisare a yoyogames para que lo corrija.
Título: Re:Lio con los mandos.
Publicado por: Clamud en Agosto 15, 2015, 03:36:18 PM
Las funciones para leer los ejes también me devuelven -0.1, yo creo que es un error de GameMaker, o incompatibilidad con el controlador del mando.
Como mencioné en un mensaje previo, una solución es programar una zona muerta: hasta que se rebasa un umbral alrededor del centro de la palanca se detecta como desplazada.
He implementado dos formas diferentes para hacer la zona muerta, voy a mostrar la que parece más apropiada para tu caso:
[gml]
ejex = joystick_xpos(0); //leer ejex
ejey = joystick_ypos(0); //leer ejey
d = point_distance( 0,0, ejex, ejey ); //desplazamiento de la palanca

if( d < umbral ) { //si no se rebasa el umbral
ejex = 0; //es como si no
ejey = 0; // estuviera desplazada
}

if( d > 1 ) { //si el desplazamiento es mayor a 1
    ejex /= d; //reducir el desplazamiento para tener la
    ejey /= d; // misma velocidad en cualquier direccion
}
[/gml]

El movimiento de la nave se haría de esta forma (en Step):
[gml]
x += rapidez * ejex;
y += rapidez * ejey;
[/gml]

He notado que la función joystick_exists es lenta, no debería usarse en cada Step.
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 15, 2015, 06:03:59 PM
He reportado el bug a yoyogames.
A ver si lo tienen en cuenta para la próxima actualización.
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 17, 2015, 11:51:50 AM
Ya me han respondido los de yoyogames.
Probaron mi programa y en punto neutro les dio 0,03. El problema es del ssoo windows, no de Game Maker, siendo microsoft y no yoyogames quien tendria que corregirlo.
Título: Re:Lio con los mandos.
Publicado por: Guacusio en Agosto 18, 2015, 01:38:55 PM
Aún con ese error puedes usar las funciones joystick_xpos y joystick_ypos, pero en vez de revisar si entregan valores mayores o menores que cero, tendrías que revisar si entregan 1 o -1 respectivamente. Lo otro es recurrir a la función joystick_direction.
Título: Re:Lio con los mandos.
Publicado por: Marth en Agosto 18, 2015, 02:03:23 PM
la función joystick_direction la encuentro bastante compleja que el el uso de los joystic_pos.

Esto es lo que he hecho al final. Lo puse en el juego que me daba quebradero de cabeza y ya me han confirmado que la chapuza funciona:

if((keyboard_check(vk_left) || joystick_xpos(0)<-0.1 || gamepad_axis_value(0,gp_axislh)<-0.1) && bbox_left>view_xview[0]) x-=desplazamiento
else if((keyboard_check(vk_right) || joystick_xpos(0)>0.1 || gamepad_axis_value(0,gp_axislh)>0.1) && bbox_right<view_xview[0]+view_wview[0]-desplazamiento) x+=desplazamiento
if((keyboard_check(vk_up) || joystick_ypos(0)<-0.1 || gamepad_axis_value(0,gp_axislv)<-0.1) && bbox_top>view_yview[0]) y-=desplazamiento
else if((keyboard_check(vk_down) || joystick_ypos(0)>0.1 || gamepad_axis_value(0,gp_axislv)>0.1) && bbox_bottom<Escenario.y-desplazamiento) y+=desplazamiento


Aviso: Al final esto ha permitido que se pueda jugar tanto con mandos normales como con mandos de Xbox. Este tema voy a darlo por solucionado.