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).


#18 Agosto 14, 2015, 02:48:28 PM Ultima modificación: Agosto 14, 2015, 08:11:52 PM por Marth
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.


#23 Agosto 18, 2015, 02:03:23 PM Ultima modificación: Agosto 20, 2015, 04:27:01 PM por Marth
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.