Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

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: Limitacion en modo de movimiento diagonal  (Leído 718 veces)

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

Desconectado Marcusmaniacus

en: Mayo 25, 2019, 09:40:54 am
Mi código es el sigente
create
Código: [Seleccionar]
Vv=0
Vh=0
velocidad=4
Steep
Código: [Seleccionar]
Vv=((keyboard_check(vk_down)-keyboard_check(vk_up))*Velocidad);
Vh=((keyboard_check(vk_right)-keyboard_check(vk_left))*Velocidad);

x+=Vh;
y+=Vv;

y el problema que tengo es el sigente cuando va en diagonal el protagonista va mas rápido que los bots que tambein tienen una velocidad de 4  y quiero que sea parejo como limito ello?

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado NiuWeb

  • Flota de Justicia Particular.
  • Moderadores globales
  • Okupa
  • *
  • Puntos: 2825
  • Mensajes: 1.697
  • Agradecido: 141 veces
  • Sexo: Masculino
  • Rock anthem for saving the world.
    • Ver Perfil
Respuesta #1 en: Mayo 25, 2019, 08:10:00 pm
Eso sucede porque cuando el movimiento es diagonal, las componentes de movimiento vertical y horizontal valen (ambas) 4, que al sumarse dan como resultado un número mayor (4√2).

Para corregir esto, deberías hacer lo siguiente:
///EVENTO STEP

//Primero, consigues las componentes del movimiento como lo haces normalmente:
var hmove = keyboard_check(vk_right) - keyboard_check(vk_left);
var vmove = keyboard_check(vk_down)  - keyboard_check(vk_up);

//Segundo, calculas el ángulo que forman ambas componentes entre sí
var angle = point_direction(0, 0, hmove, vmove);

//Tercero, multiplicas el valor de la velocidad por las componentes del ángulo.
var hvel = abs(hmove) * vel * dcos(angle);
var vvel = abs(vmove) * vel * dsin(angle);
//(se multiplica también por "abs(hmove)" para evitar que haya movimiento cuando no se está presionando la tecla)

//Cuarto, mueves el objeto
x += hvel;
y -= vvel;
« última modificación: Mayo 25, 2019, 08:13:47 pm por NiuWeb »

El tiempo era tu aliado, humano, pero te ha abandonado.
Los Forerunners han regresado, esta tumba ahora es tuya.

-Ur-Didacta.


BA:STFW&RTFM
 
Los siguientes usuarios dieron las gracias a este tema: Johann, Marcusmaniacus


Desconectado Marcusmaniacus

Respuesta #2 en: Mayo 26, 2019, 08:54:19 pm
que buena explicación bro esta perfecta