Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Movimiento preciso  (Leído 4582 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fab62

  • Asiduo
  • *
  • Puntos: 119
  • Mensajes: 118
  • Sexo: Masculino
    • Ver Perfil
en: Diciembre 28, 2014, 02:33:00 am
Hola! saludos a todos los makeros que estan en la comunidad, hoy les vengo a dejar un script muy util para mover un objeto de forma precisa solo definiendo 3 argumentos, velocidad horizontal, velocidad vertical, y obstaculo del movimiento, lo he testeado y funciona la 100 %  ;)

Creador: Fab62

Version de GM:  :GMS:

Descripción: Mueve un objeto de forma precisa, sin estancarse en el objeto obstaculo que se define en el 3er argumento, las velocidades horizontal y vertical son independientes, es decir, que si el objeto se detiene de forma vertical, puede seguir moviendose de forma horizontal y viceversa, como tambien puede doblar libremente en las esquinas, este script funciona a cualquier velocidad. Su uso sirve en cualquier evento, pero es mas util utilizarlo en el evento step.

Script: Consta de un solo script, y se utiliza de la misma manera que la funcion motion_add()

precise_movement(velocidad horizontal, velocidad vertical, obstaculo)
Código: [Seleccionar]
/****************************************************************************************************************************
    precise_movement(xspeed,yspeed,obstacle)
-----------------------------------------------------------------------------------------------------------------------------
    movimiento preciso con movimientos horizontal y vertical separados
****************************************************************************************************************************/

// obstaculo del movimiento
var obstacle = argument2;

// obtenemos direcciones: vertical y horizontal
var dirh = sign(argument0);
var dirv = sign(argument1);

// para la velocidad de precision
var pspeed = 0;

// loop horizontal
while (pspeed*dirh < argument0*dirh)
{
    // si se encuentra un obstaculo en la velocidad_precision actual, se sale del while
    if place_meeting(x+pspeed+dirh,y,obstacle) break;
    else
    {
        // si se encuentra en una esquina, se puede doblar
        if !place_meeting(x+pspeed+dirh,y+dirv,obstacle)
        && place_meeting(x,y+dirv,obstacle)
            y += dirv;

        // en este caso, velocidad_precision cambia
        pspeed += dirh;
    }
}

// movemos en x
x += pspeed;

// reseteamos la velocidad de precision obtenida
pspeed = 0;

// velocidad de precision en y
while (pspeed*dirv < argument1*dirv)
{
    // si se encuentra un obstaculo en la velocidad_precision actual, se sale del while
    if place_meeting(x,y+pspeed+dirv,obstacle) break;
    else
    {
        // si se encuentra en una esquina, se puede doblar
        if !place_meeting(x+dirh,y+pspeed+dirv,obstacle)
        && place_meeting(x+dirh,y,obstacle)
            x += dirh;

        // en este caso, velocidad_precision cambia
        pspeed += dirv;
    }
}

// movemos en y
y += pspeed;

Espero que les sea de utilidad en sus juegos para que no ocurran esas molestas ocasiones en donde los objetos quedan pegados... un ejemplo sencillo en la siguiente linea.

Ejemplo: Movimiento en 8 direcciones

Evento Create
Código: [Seleccionar]
velocidad = 5
Evento Step
Código: [Seleccionar]
obstaculo = obj_solido;

//---------------------------------------------------------------------------------------------------------------------------
// ACTUALIZAR CONTROLES DE DIRECCION
//---------------------------------------------------------------------------------------------------------------------------

key_left  = keyboard_check(vk_left)
key_right = keyboard_check(vk_right)
key_up    = keyboard_check(vk_up)
key_down  = keyboard_check(vk_down)

//---------------------------------------------------------------------------------------------------------------------------
// ENCONTRAR LAS DIRECCIONES
//---------------------------------------------------------------------------------------------------------------------------

// direccion horizontal
vel_h = velocidad*(key_right - key_left)

// direccion vertical
vel_v = velocidad*(key_down - key_up)

// movemos
precise_movement(vel_h,vel_v,obstaculo);

El obstaculo debe ser un objeto creado con anterioridad y debe representar el objeto solido, que tengan un buen dia y saludos!

El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D
 


No Tienes Permisos Para Dar Puntos
point 10 Puntos

Usuarios que puntuaron el tema » Clamud (5 Pts) » Yoo (5 Pts) 


Desconectado Clamud

Respuesta #1 en: Diciembre 28, 2014, 03:12:46 am
Buen script, no lo he probado pero parece funcional. Solo un pequeño comentario, no es muy importante, pero creo que la función debería llamarse move_precise, para que se parezca a las funciones predefinidas de GM. :D

 


Desconectado KamiViews

  • Visitante
  • *
  • Puntos: 8
  • Mensajes: 2
    • Ver Perfil
Respuesta #2 en: Marzo 21, 2018, 07:24:27 pm
No se si me leerás, ya que he visto este script bastante tarde. Verás he comprobado que funciona muy bien, pero como estoy empezando en esto de la programación, hay una cosa que no entiendo como funciona y te pido si me podrías hacer el favor de explicarme su funcionamiento.
Me refiero a esta función vel_h = velocidad*(key_right - key_left)
Gracias de antemano

 


Desconectado Clamud

Respuesta #3 en: Marzo 22, 2018, 05:51:28 am
key_left y key_right pueden tomar los valores 0 o 1.

Si ninguno se presiona, entonces se realiza esta operación
  vel_h = velocidad*(0-0) = 0

Si se presiona izuierda, el resultado es diferente
  vel_h = velocidad*(0-1) = -velocidad

Si se presionan los dos botones, el resultado también es cero
  vel_h = velocidad*(1-1) = 0

 


Desconectado KamiViews

  • Visitante
  • *
  • Puntos: 8
  • Mensajes: 2
    • Ver Perfil
Respuesta #4 en: Abril 02, 2018, 05:28:49 pm
Muchísimas gracias estoy empezando y tengo que ir aprendiendo.