Anuncios

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.

Anuncios

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
Anuncios

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:

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

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;
}
Anuncios

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.

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

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.

Anuncios
Nota: Si poseen un gamepad de Xbox recuerden modificar el indice del condicional de 4 a 0 porque no lo detectara.
Anuncios

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;	
}
Anuncios

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;	
}
Anuncios
Anuncios

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;
}
Anuncios

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;
}
Anuncios

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;
}
Anuncios

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

Anuncios

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

ConstanteDescripcion
gp_face1Equivale al boton A de la Xbox o la cruz de la PS
gp_face2Equivale al boton B de la Xbox o el circulo de la PS
gp_face3Equivale al boton X de la Xbox o el cuadrado de la PS
gp_face4Equivale al boton Y de la Xbox o el triangulo de la PS
gp_shoulderlEquivale a LB en Xbox y L1 en PS
gp_shoulderlbEquivale a LT en Xbox y L2 en PS
gp_shoulderrEquivale a RB en Xbox y R1 en PS
gp_shoulderrbEquivale a RT en Xbox y R2 en PS
gp_selectEquivale al Select de Xbox y el boton PS de la PS
gp_startEquivale al Start de Xbox y al Options de la PS
gp_sticklEquivale a presionar el stick izquierdo
gp_stickrEquivale a presionar el stick derecho
gp_paduEquivale a la flecha arriba del D-Pad
gp_paddEquivale a la flecha abajo del D-Pad
gp_padlEquivale a la flecha izquierda del D-Pad
gp_padrEquivale a la flecha derecha del D-Pad
gp_axislhEje horizontal del stick izquierdo (analogico)
gp_axislvEje vertical del stick izquierdo (analogico)
gp_axisrhEje horizontal del stick derecho (analogico)
gp_axisrvEje vertical del stick derecho (analogico)
Anuncios

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
Anuncios

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

Anuncios

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.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.00