Hola saludos a todos, les cuento que estaba desarrollando un videojuego en RPG maker pero me limitaba en algunas ideas que tengo para mi proyecto así que decidí pasarme al game maker (aun sabiendo muy poco sobre como usarlo, porque soy masoquista supongo) y me he encontrado la primer piedra, nada mas al inicio...

he estado viendo varios sistemas de movimiento pero ninguno me convence del todo porque da errores (tipo que el personaje haga el "moonwalker" o se vuelva medio loco si aprietas izquierda y derecha a la vez, por ejemplo) y los que si se veían mas pulidos, me da error a la hora de escribir algunos códigos (no se si sera por la versión, uso la 1.4).

así que les agradecería si me pudieran dar ideas de como hacer o me pasaran sistemas de movimiento en 4 direcciones, si es en código, también agradecería que me explicaran el funcionamiento ya que como digo soy muy novato aun con este motor. gracias desde ya!

[gml]
///CREATE
velocidad=4
mover_vertical=true
mover_horizontal=true
[/gml]
[gml]
///STEP
///esta primera parte previene que se mueva en diagonal y no mezclar ambos ejes
if keyboard_check_pressed(vk_right) or keyboard_check_pressed(vk_left)
   {
    mover_horizontal=true
    mover_vertical=false
   }
if keyboard_check_pressed(vk_down) or keyboard_check_pressed(vk_up)
   {
    mover_horizontal=false
    mover_vertical=true
   }
 
///esta parte para evitar que el jugador se detenga cuando se presiona, por ejm., derecha e izquierda al mismo tiempo
if keyboard_check_pressed(vk_right) {keyboard_clear(vk_left)}
if keyboard_check_pressed(vk_left) {keyboard_clear(vk_right)}
if keyboard_check_pressed(vk_down) {keyboard_clear(vk_up)}
if keyboard_check_pressed(vk_up) {keyboard_clear(vk_down)}

///aqui solo se mueve; por ejm si se presiona derecha solo se movera si no se esta presionando arriba o abajo
if keyboard_check(vk_right) {x+=mover_horizontal*velocidad}
if keyboard_check(vk_left)  {x-=mover_horizontal*velocidad}
if keyboard_check(vk_down)  {y+=mover_vertical*velocidad}
if keyboard_check(vk_up)    {y-=mover_vertical*velocidad}
[/gml]

Cita de: 3dgeminis en Mayo 01, 2019, 10:06:40 PM
[gml]


///aqui solo se mueve; por ejm si se presiona derecha solo se movera si no se esta presionando arriba o abajo
if keyboard_check(vk_right) {x+=mover_horizontal*velocidad}
if keyboard_check(vk_left)  {x-=mover_horizontal*velocidad}
if keyboard_check(vk_down)  {y+=mover_vertical*velocidad}
if keyboard_check(vk_up)    {y-=mover_vertical*velocidad}
[/gml]

en esa ultima parte del codigo, es inecesario multiplicar por la velocidad, ya que si las variables "mover_..." son true, GML las interpreta como 1, por lo tanto, la multiplicacion esta hacienda un proceso que no se necesita pues el valor siempre sera la velocidad.


siguiendo con las respuestas hay muchas maneras de hacer las cosas, inclusive para mover solo en una direccion a la vez puedes utilizar if-else anidados o estructura switch, por ejemplo:

//usando IF
if(move_up){ y-=3;}
else if( move_down){y+=3;}
else if( move_left){x-=3;}
else if( move_right){x+=3}

//usando switch

switch(move_direction)
{
case 1:
x-=3;
break;
case 2:
x+=3;
break;
case 3:
y-=3;
break;
case 4:
4+=3;
break;
}


Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala

Si es necesario, ya que si no se multiplica el jugador puede moverse en diagonal, que es lo que se quiere evitar.

Cita de: 3dgeminis en Mayo 02, 2019, 02:54:13 AM
Si es necesario, ya que si no se multiplica el jugador puede moverse en diagonal, que es lo que se quiere evitar.

la multiplicacion? como, solamente si la condicion es verdadera se mueve el personaje segun la cordenada X e Y, en que momento si no se multiplica se mueve en diagonal?
Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala

Trata de hacerlo sin usar mover_horizontal y mover_vertical y veras que se puede mover en diagonal.
Si la ultima tecla presionada es arriba o abajo se deshabilita el eje horizontal evitando que se puedan mover en ambos ejes al mismo tiempo.

Cita de: 3dgeminis en Mayo 01, 2019, 10:06:40 PM
[gml]
///CREATE
velocidad=4
mover_vertical=true
mover_horizontal=true
[/gml]
[gml]
///STEP
///esta primera parte previene que se mueva en diagonal y no mezclar ambos ejes
if keyboard_check_pressed(vk_right) or keyboard_check_pressed(vk_left)
   {
    mover_horizontal=true
    mover_vertical=false
   }
if keyboard_check_pressed(vk_down) or keyboard_check_pressed(vk_up)
   {
    mover_horizontal=false
    mover_vertical=true
   }
 
///esta parte para evitar que el jugador se detenga cuando se presiona, por ejm., derecha e izquierda al mismo tiempo
if keyboard_check_pressed(vk_right) {keyboard_clear(vk_left)}
if keyboard_check_pressed(vk_left) {keyboard_clear(vk_right)}
if keyboard_check_pressed(vk_down) {keyboard_clear(vk_up)}
if keyboard_check_pressed(vk_up) {keyboard_clear(vk_down)}

///aqui solo se mueve; por ejm si se presiona derecha solo se movera si no se esta presionando arriba o abajo
if keyboard_check(vk_right) {x+=mover_horizontal*velocidad}
if keyboard_check(vk_left)  {x-=mover_horizontal*velocidad}
if keyboard_check(vk_down)  {y+=mover_vertical*velocidad}
if keyboard_check(vk_up)    {y-=mover_vertical*velocidad}
[/gml]

mil gracias!! estoy aprendiendo gml de a poco  :)

Cita de: 3dgeminis en Mayo 01, 2019, 10:06:40 PM
[gml]
///CREATE
velocidad=4
mover_vertical=true
mover_horizontal=true
[/gml]
[gml]
///STEP
///esta primera parte previene que se mueva en diagonal y no mezclar ambos ejes
if keyboard_check_pressed(vk_right) or keyboard_check_pressed(vk_left)
   {
    mover_horizontal=true
    mover_vertical=false
   }
if keyboard_check_pressed(vk_down) or keyboard_check_pressed(vk_up)
   {
    mover_horizontal=false
    mover_vertical=true
   }
 
///esta parte para evitar que el jugador se detenga cuando se presiona, por ejm., derecha e izquierda al mismo tiempo
if keyboard_check_pressed(vk_right) {keyboard_clear(vk_left)}
if keyboard_check_pressed(vk_left) {keyboard_clear(vk_right)}
if keyboard_check_pressed(vk_down) {keyboard_clear(vk_up)}
if keyboard_check_pressed(vk_up) {keyboard_clear(vk_down)}

///aqui solo se mueve; por ejm si se presiona derecha solo se movera si no se esta presionando arriba o abajo
if keyboard_check(vk_right) {x+=mover_horizontal*velocidad}
if keyboard_check(vk_left)  {x-=mover_horizontal*velocidad}
if keyboard_check(vk_down)  {y+=mover_vertical*velocidad}
if keyboard_check(vk_up)    {y-=mover_vertical*velocidad}
[/gml]

Hola disculpen se que este tema lo dejaron hace tiempo pero al igual que rick136 soy nuevo y quisiera saber si el sistema de 3dgeminis se puede usar en una maquina de estados)))

Si sabes como hacer una maquina de estados lo puedes, se puede usar sin problemas.

Cita de: 3dgeminis en Septiembre 04, 2019, 02:42:07 AM
Si sabes como hacer una maquina de estados lo puedes, se puede usar sin problemas.
si tengo una maquina de estados pero con mi codigo de movimiento se mueve en todas direcciones si me pudieras dar una idea de como modificar mi codigo de movimiento
vh = (-keyboard_check(vk_left) + keyboard_check(vk_right)) * v;
vv = (-keyboard_check(vk_up) + keyboard_check(vk_down)) * v;

de verdad me funciona muy bn solo que quiero q mi rpg se mueva en 4 direcciones

Una forma de hacerlo:
[gml]
///CREATE
vel=4
direccion=0 ///0=derecha ; 1=izquierda ; 2=abajo ; 3=arriba

///STEP
if keyboard_check_pressed(vk_right) {direccion=0}
if keyboard_check_pressed(vk_left)  {direccion=1}
if keyboard_check_pressed(vk_down)  {direccion=2}
if keyboard_check_pressed(vk_up)    {direccion=3}

switch(direccion)
  {
   case 0: if keyboard_check(vk_right) {x+=vel} break;
   case 1: if keyboard_check(vk_left)  {x-=vel} break;
   case 2: if keyboard_check(vk_down)  {y+=vel} break;
   case 3: if keyboard_check(vk_up)    {y-=vel} break;
  }
[/gml]

asumo que se esta hablando meramente sobre una plataforma de PC, sin embargo al codigo anterior le falta algun soporte para gamepads que es algo diferente, aunque sigue la misma logica, nada mas para que lo contemplen, pues se habla en mayor manera de control en 4 direcciones, por tanto se aplica para gamepads.
Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala