Dándole vida visual a nuestro personaje (parte 2)
Clase 7 de 14 • Curso de Game Maker Studio 2: Introducción a Creación de Videojuegos
Contenido del curso
Clase 7 de 14 • Curso de Game Maker Studio 2: Introducción a Creación de Videojuegos
Contenido del curso
Kevin Gabriel Gamboa
Kevin Gabriel Gamboa
David Leal
Francisco Contreras
Francisco Contreras
Francisco Contreras
Alan Mariño
Jonathan Mejorado López
Alan Mariño
Americo Bustamante
Cesar Payro
luis alejandro
Orlando Sánchez
Marcos Veron
Jose Luis Bedoya
Alan Arroyo Navarrete
Geimar Giovanny Delgado Fandiño
José María Villalba Coronel
Luis Steven Mora
Anaximandro Rodríguez
luis alejandro
Franklin Lucero
luis alejandro
Osvaldo Abdiel Juarez Ordaz
Juan Diego Mejia Maestre
Efrain Alejandro Salazar Cubillos
Jorge García
Para que la funcion keyboard_check utilize las teclas WASD es necesario cambiar el codigo un poco. La funcion se escribiria de la siguiente manera: if keyboard_check (ord ("D")) Es necesario que este en mayuscula. Tambien funciona de la siguiente manera: else if keyboard_check (ord ("D")) Aqui una muestra de mi codigo:
if keyboard_check (ord ("D")) { x = x+velocidad; sprite_index = Sprite_running; image_xscale = 1; }
else if keyboard_check (ord ("A")) { x = x-velocidad; sprite_index = Sprite_running; image_xscale = -1; }
else if keyboard_check (ord ("W")) { y = y-velocidad; sprite_index = Sprite_running; image_xscale = -1; }
else if keyboard_check (ord ("S")) { y = y+velocidad; sprite_index = Sprite_running; image_xscale = -1; }
gracias me preguntaba como seria para escoger las teclas
Btw si quieren que el personaje retome su posición Idle al dejar de moverse sólo deben agregar un par de líneas al final del código. El sprite_index debe apuntar al spr_idle
else { sprite_index = spr_bat_man_idle; }
Debe haber alguna manera de que al voltear de right-left no "pierda" un pequeño espacio de por medio. El xscale -1 hace que el movimiento a la izquierda sea muy abrupto
Me devuelvo de una clase porque ya descubrí que pasaba . Debes modificar el Collision Mask para que quede centrado . Se le llega por Objeto > Ícono de Collision Mask Con esto no deberías ver un salto abrupto cuando cambias de dirección izquierda o derecha Debes hacerlo también para el Sprite_Running
Me has ayudado con el mismo problema.
Una muestra de mi codigo, tambien agregue algo para que no se mantuviera corriendo cuando dejara de presionar alguna de las teclas de movimiento, y tambien agregue codigo para que puedan maniobrar su personaje con WASD y con las flechas de movimiento, tambien añadi una forma de hacer que el personaje corra, cuando presionemos shift, corra con una velocidad de 3 y si no lo presionemos camine o este estatico no es la mejor solución pero funciona
/// @description Este evento corre en cada frame.Si esta configurado a 60 fps , correra 60 veces en un segundo if(keyboard_check(vk_shift)){ spd = 3; sprite_index = spr_firstplayer_running; }else{ spd = 1; } if(keyboard_check(vk_right) || keyboard_check(ord("D"))){ x = x+spd; sprite_index = spr_walk; image_xscale = 1; }else if(keyboard_check(vk_left)|| keyboard_check(ord("A"))){ x = x-spd; sprite_index = spr_walk; image_xscale = -1; }else if(keyboard_check(vk_up) || keyboard_check(ord("W"))){ y = y-spd; sprite_index = spr_walk; image_xscale = -1; }else if(keyboard_check(vk_down) || keyboard_check(ord("S"))){ y = y+spd; sprite_index = spr_walk; image_xscale = -1; }else{ sprite_index = spr_firstplayer; image_xscale = 1; }
Los ejes de gamemaker, asi como los del canvas de javascript por ejemplo, están invertidos.
Tomen esto en cuenta al programar
else { sprite_index = spr_bat_man_idle; }
Esto es para que despues de iniciar la animacion de correr se vuelva a la animacion de parado
wow que padre que el codigo es muy parecido a javascript.. no se ve tan complicado!!
el profe explica bien pero no se de quien es la culpa de que siempre falta partes de la explicación en este caso como demonios se hace para que el personaje deje de correr cuando esta quieto se supone que no sabes y vienes acá para que te expliquen en el video de las colisiones fue lo mismo contenido por haya perdido eso esta muy mal
Saludos, para evitar que el personaje siga caminando mientras está parado, agreguen un else al final del if, indicando el sprite_index al idle, acá un ejemplo:
else{ sprite_index = spr_bat_man_idle; }
if(keyboard_check(vk_right) || keyboard_check(ord ("D"))){ x= x+spd ; sprite_index= spr_bat_man_running; image_xscale = 1; } else if(keyboard_check(vk_left) || keyboard_check(ord ("A"))){ x= x-spd ; sprite_index= spr_bat_man_running; image_xscale = -1; }else if(keyboard_check(vk_up) || keyboard_check(ord ("W"))){ y= y-spd ; sprite_index= spr_bat_man_running; image_xscale = -1; }else if(keyboard_check(vk_down) || keyboard_check(ord ("S"))){ y= y+spd; sprite_index= spr_bat_man_running; }else { sprite_index = spr_bat_man_idle; }
if(keyboard_check(vk_right)){ x= x+spd; sprite_index=spr_jugador_run; image_xscale=1; } else if (keyboard_check(vk_left)){ x=x-spd; sprite_index=spr_jugador_run; image_xscale=-1; } else if (keyboard_check(vk_down)){ y=y+spd; sprite_index=spr_jugador_run; image_xscale=-1; }else if (keyboard_check(vk_up)){ y=y-spd; sprite_index=spr_jugador_run; image_xscale=-1; }else { sprite_index = spr_jugador_idle; }
Sigo los mismos pasos pero la rotación es extraña y las flechas de arriba y abajo no funcionan…
// Hola. Quisas tiene (Vk_up) y el (Vk_down) (x) y no (y)
if (keyboard_check(vk_right)){ x = x+spd; sprite_index = Spr_Bat_Man_Running; image_xscale = 1; } else if (keyboard_check(vk_left)){ x = x-spd; sprite_index = Spr_Bat_Man_Running; image_xscale = -1; } else if (keyboard_check(vk_up)){ y = y-spd; sprite_index = Spr_Bat_Man_Running;
} else if (keyboard_check(vk_down)){ y = y+spd; sprite_index = Spr_Bat_Man_Running; }
Este código agrega la posibilidad al personaje de correr con shift, además nos ahorramos tener que cambiar el spitre_index cada veces que presionamos una tecla. Podemos movernos tanto con las flechas como con "WASD". 👾
/// @description Este evento corre en cada frame if keyboard_check(vk_shift){ // Comprueba si la tecla shift es presionada y ejecuta lo sig: player_speed = 3; // Cambia la velocidad a 3 sprite_index = spr_bat_man_running; // Cambia la animación a la de correr } else{ // si no es presionada: player_speed = 1; // Cambia la velocidad a 1 sprite_index = spr_bat_man_walk; // Cambia la animación a la de caminar } if keyboard_check(vk_right) || keyboard_check(ord ("D")){ x = x + player_speed; image_xscale = 1; } else if keyboard_check(vk_left) || keyboard_check(ord ("A")){ x = x - player_speed; image_xscale = -1; // gira la imagen a la izquierda } else if keyboard_check(vk_up) || keyboard_check(ord ("W")){ y = y - player_speed; } else if keyboard_check(vk_down) || keyboard_check(ord ("S")){ y = y + player_speed; } else { sprite_index = spr_bat_man_idle; }
Buenas, vengo a poner mi aporte para tener una mejor y mas completa animacion de la movilidad del personaje:
Poner el else() al final de cada if, limita el movimiento del personaje en una direccion a la vez. Por eso puse cada if separado.
Con respecto al uso del OR (||) les comparto este link de la documentacion: https://manual.yoyogames.com/#t=GameMaker_Language%2FGML_Overview%2FExpressions_And_Operators.htm
Aqui dejo un ejemplo de lo que se puede hacer en gamemaker, es bueno usar maquinas de estado usando el “Switch” o el “enum” por si tu personaje usa muchos sprites.
https://drive.google.com/file/d/10eC5KUBA7OqHa5P7Qjck3hRfZuRuLYK9/view?usp=sharing
pero solo hace la animación corriendo y cuando ya se queda quieto debería hacer la de quieto no???????????
al final de los if le agrege
else { sprite_index = spr_bat_man_idle; }
para que el personaje se quede sin la animacion de correr!
ami me da error
Esta vez pude resolver mi duda. El código esta bien. Solo hay que tener cuidado con los signos, con los ejes y los nombres de los sprites. Por eso no me estaba quedando.
// --- EVENTO STEP DE OBJ_PLAYER --- // 1. Configurar velocidad dinámica (Normal vs Sprint) var _vel_actual = player_speed; if (keyboard_check(vk_shift)) { _vel_actual = player_speed * 1.8; // Batman corre más rápido al presionar Shift } // 2. Capturar dirección de movimiento // Esto devuelve 1 (derecha/abajo), -1 (izquierda/arriba) o 0 (quieto) var _hmove = (keyboard_check(vk_right) || keyboard_check(ord("D"))) - (keyboard_check(vk_left) || keyboard_check(ord("A"))); var _vmove = (keyboard_check(vk_down) || keyboard_check(ord("S"))) - (keyboard_check(vk_up) || keyboard_check(ord("W"))); // 3. Movimiento Horizontal con Colisión if (_hmove != 0) { if (!place_meeting(x + (_hmove * _vel_actual), y, obj_muro)) { x += _hmove * _vel_actual; } image_xscale = _hmove; // Voltea el sprite hacia la dirección del movimiento } // 4. Movimiento Vertical con Colisión if (_vmove != 0) { if (!place_meeting(x, y + (_vmove * _vel_actual), obj_muro)) { y += _vmove * _vel_actual; } } // 5. Control de Animaciones y Sprites if (_hmove != 0 || _vmove != 0) { // Si se está moviendo en cualquier eje sprite_index = spr_bat_man_run; // Si está corriendo con Shift, la animación se acelera if (keyboard_check(vk_shift)) { image_speed = 1.5; } else { image_speed = 1; } } else { // Si está quieto sprite_index = spr_bat_man; // Nombre corregido según tu asset image_speed = 1; }
Para que creamos en clases pasadas los eventos Key down right y left si en esta los eliminamos? sirven de algo o solo era un ejemplo?
Solo era como ejemplo para saber que podemos utilizar también los eventos del teclado (: