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?
http://www.comunidadgm.org/preguntas-y-respuestas/compatibilidad-con-gamepad/msg113539/#msg113539
http://www.x360ce.com/default.aspx
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
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.
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...
¿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.
¿Sería posible ver el código con el cual lees el joystick? ¿Mapeas el joystick a las teclas correspondientes?
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
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.
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.
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.
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.
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.
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.
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).
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?
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
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).
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.
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.
He reportado el bug a yoyogames.
A ver si lo tienen en cuenta para la próxima actualización.
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.
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.
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.