Bievnenidos sean a este post, esto que veremos a continuacion es completamente opcional por el hecho de que no todos tienen un gamepad para la PC pero seguramente alguien si.
Si bien hoy existen aplicaciones que nos permiten mapear las teclas que usamos en un gamepad, tales como JoyToKey o Xpadder, es mucho mejor que el juego tenga su soporte directo por lo tanto hoy veremos como implementarlo, para esto GameMaker solia tener dos formas de hacerlo:
- Heredado, es un soporte que utiliza Dinput
- Actualizado, es un soporte mejorado pero utiliza a Xinput
El primer tipo de soporte era el mas generico y esta pensado para cualquier tipo de joystick, esto gracias a que utiliza Dinput, en cambio el segundo esta pensado para los controladores de Xbox, aunque los ultimos gamepads de xbox tienen mas funcionalidades con el soporte heredado que el actualizado, por esta razon nos centraremos en ver mas el heredado, para trabajar con el gamepad vamos a tomar el proyecto anterior y nos enfocaremos en el proyecto del cliente sino lo tienen les dejo dos enlaces para descargar ambos archivos:
Nota: Les recomiendo compilar y activar el servidor para poder acceder al cliente y manejarlo, en caso de necesitar saber como les recomiendo visitar el post anterior.
Procederemos a abrir nuestro proyecto llamado multipepe, una vez dentro iremos al objeto obj_Jugador, luego pasaremos al evento Step y dentro agregaremos el siguiente bloque al comienzo del mismo:
if (gamepad_is_connected(4))
{
gp_conectado = true;
}
else
{
gp_conectado = false;
}
Este condicional verifica si tenemos un gamepad heredado conectado, en un rato explicaremos porque la posicion 4, esta funcion devuelve un estado booleano de true o false si esta conectado o no respectivamente, en caso de ser verdadero establecemos a gp_conectado como true de lo contrario lo establecemos como false, pasemos a explicar el motivo del indice.
Nota: En este caso no lo hemos hecho en Create porque al ser una aplicacion sencilla y chica no afecta a la operacion de nuestro juego y haria al codigo mas complejo innecesariamente pero tengan esto en cuenta a la hora de trabajar en codigos mas complejos.
En versiones anteriores de GameMaker se utilizaban dos funciones para trabajar con el gamepad de Xbox o con un gamepad o joystick generico, para el caso del Xbox se utilzaba la funcion gamepad y para el generico joystick pero a partir de la version 2 se elimino la funcion joystick y se utiliza directamente a gamepad y aqui entra en accion los indices, los gamepads de Xbox tendran reservados los indices del 0 al 3 y para los genericos tendremos del 4 al 11, este dato tengan en cuenta que es para un entorno de Windows y puede variar con respecto a otros, como por ejemplo Android, donde ademas de la conectividad por cable tambien entra en juego el tema del bluetooth, aunque esto afecta al Windows tambien, por esta razon debimos utilizar el indice 4 dado que no poseo un controlador de Xbox sino que utilizo uno de Playstation 4, con esto comentado continuemos con el proyecto.
Nota: Si poseen un gamepad de Xbox recuerden modificar el indice del condicional de 4 a 0 porque no lo detectara.
Sabiendo si tenemos conectado o no un gamepad nuestro siguiente paso sera utilizarlo y para ello busquen el siguiente condicional:
if (keyboard_check_pressed(vk_space))
{
vel_vrt = -15;
}
Y lo modificaremos de la siguiente manera:
if (keyboard_check_pressed(vk_space) ||
gp_conectado &&
gamepad_button_check_pressed(4,gp_face1))
{
vel_vrt = -15;
}
Este condicional verifica si presionamos la barra espaciadora, tal como antes pero ahora tambien verificamos si gp_conectado es igual a true, es decir que tenemos un gamepad conectado, y si presionamos un boton del gamepad, en este caso usamos la funcion gamepad_button_check_pressed para esto, el primer atributo que pasamos es el indice del gamepad, recuerden que el 4 es para uno generico y si tienen uno de Xbox deben pasar 0, y el siguiente es el identificador del boton presionado, para este caso es el boton X del mando de la PS y para el caso de Xbox equivale a A pero de esto hablaremos luego, como pueden darse cuenta este condicional activara el salto ya sea porque presionamos la barra espaciadora o el boton de nuestro gamepad conectado, despues debemos agregar el siguiente bloque entre el condicional que modificamos anteriormente y las condicionales encargadas de verificar si presionamos las flechas de cursor:
usando_controlador = false;
if (gp_conectado)
{
vel_hor = 5 * gamepad_axis_value(4, gp_axislh);
if (vel_hor != 0) usando_controlador = true;
}
Primero estableceremos una variable con un estado de false, despues chequearemos si gp_conectado es verdadero estableceremos a vel_hor por medio del valor obtenido de gamepad_axis_value, para esto debemos indicarle que controlador es y cual eje estamos moviendo, multiplicado por cinco, por ultimo tenemos un condicional donde verifica que si vel_hor es distinto de 0 establece a usando_controlador como verdadero, nuestro siguiente paso sera utilizar a la variable usando_controlador y para ello iremos al siguiente condicional:
if (keyboard_check(vk_left) && keyboard_check(vk_right))
{
image_speed = 0;
vel_hor = 0;
}
Al cual lo modificaremos de la siguiente manera:
if (keyboard_check(vk_left) && keyboard_check(vk_right) ||
keyboard_check(vk_left) && usando_controlador ||
keyboard_check(vk_right) && usando_controlador)
{
image_speed = 0;
vel_hor = 0;
}
El condicional trabajaba cuando se presionaban los dos botones de direccion al mismo ocasionando que se detenga nuestro jugador, en este caso agregamos la opcion de que al presionar algunas de las teclas (tanto de la derecha como de la izquierda) y a su vez pulsamos alguna de las direcciones en el mando, para ello usaremos a usando_controlador donde verificamos si es verdad con alguna de las teclas (recuerden que le pusimos true mientras estemos desplazandonos), con esto cubrimos la posibilidad de cuando las personas toquen varias teclas al mismo tiempo, el bloque es exactamente a como lo vimos antes, con todo esto podemos probar nuestro juego mediante el siguiente video
En el video podemos ver como nuestro juego detecta la conexion de un mando de PS4, vemos como trabaja perfectamente para despues finalmente desconectarlo y ver como no afecta su jugabilidad, si lograron lo mismo que el video acaban de lograr algo muy importante y de una manera muy sencilla, antes de de terminar vamos a ver las constantes que podemos usar para detectar cual boton o palanca esta siendo utilizada mediante el siguiente cuadro
Constante | Descripcion |
gp_face1 | Equivale al boton A de la Xbox o la cruz de la PS |
gp_face2 | Equivale al boton B de la Xbox o el circulo de la PS |
gp_face3 | Equivale al boton X de la Xbox o el cuadrado de la PS |
gp_face4 | Equivale al boton Y de la Xbox o el triangulo de la PS |
gp_shoulderl | Equivale a LB en Xbox y L1 en PS |
gp_shoulderlb | Equivale a LT en Xbox y L2 en PS |
gp_shoulderr | Equivale a RB en Xbox y R1 en PS |
gp_shoulderrb | Equivale a RT en Xbox y R2 en PS |
gp_select | Equivale al Select de Xbox y el boton PS de la PS |
gp_start | Equivale al Start de Xbox y al Options de la PS |
gp_stickl | Equivale a presionar el stick izquierdo |
gp_stickr | Equivale a presionar el stick derecho |
gp_padu | Equivale a la flecha arriba del D-Pad |
gp_padd | Equivale a la flecha abajo del D-Pad |
gp_padl | Equivale a la flecha izquierda del D-Pad |
gp_padr | Equivale a la flecha derecha del D-Pad |
gp_axislh | Eje horizontal del stick izquierdo (analogico) |
gp_axislv | Eje vertical del stick izquierdo (analogico) |
gp_axisrh | Eje horizontal del stick derecho (analogico) |
gp_axisrv | Eje vertical del stick derecho (analogico) |
Como pueden ver salvo las del principio, por un tema de que son distintas asignaciones para cada boton de los mandos, el resto son iguales para los posibles mandos que podamos encontrar, lo interesante de trabajar en la forma actual es que nos ahorra mucho codigo evitando tener redundancias para verificar si tal o cual mando esta conectado, algunas de las funciones utiles que podemos utilizar son las siguientes:
- gamepad_get_device_count, nos informa la cantidad de dispositivos conectados
- gamepad_get_description, nos devuelve la descripcion del mando conectado
- gamepad_button_count, nos devuelve la cantidad de botones en el dispositivo
Como pueden ver estos son algunos de los mas interesantes que vi pero hay muchisimos mas, inclusive uno para controlar el color del mando de PS4, mas adelante ahondaremos un poco mas de como trabajar con nuestros mandos, les dejo el nuevo codigo que puede o no reemplazar al anterior
En resumen, hoy hemos visto como implementar de una manera sencilla los mandos o gamepads a nuestros juegos, hemos visto algunos de las funciones que nos permiten detectarlo, saber que tecla estamos presionando, hemos visto como implementarlo en nuestro juego, tambien hemos visto un video de como nuestro juego detecta la conexion del mando y la desconexion del mismo sin alterar nuestra jugabilidad, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.00
