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: Crear proyectil con movimiento parabólico que intercepte objetivo  (Leído 415 veces)

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

Desconectado CuervoNegro

Creador: CuervoN(yo)
Descripción: crear un objeto con una velocidad en X y Y  determinadas para conseguir un movimiento parabólico que termine por interceptar un objetivo especifico
Versión de GM:  Game maker Studio 2

Script:
////////////////////////////////////////////////////// createproy  /////////////////////////////////////////////////
/////////// Crear proyectil con velocidad en X y Y especificos para dar en un objetivo determinado by CuervoN/////////////
/*
argument0 = coordenada x del punto inicial
argument1 = coordenada y del punto inicial
argument2 = coordenada x del punto final
argument3 = coordenada y del punto final
argument4 = Velocidad minima 300(ejemplo)
argument5 = Velocidad maxima 600(ejemplo)
*/


///Coordenadas del punto inicial y del punto final(target)
var xi= argument0*room_speed
var yi= argument1*room_speed
var xf= argument2*room_speed
var yf= argument3*room_speed

var potmin=argument4 //Velocidad minima = 300(ejemplo)
var potmax=argument5 //Velocidad maxima = 600(ejemplo)
var grav=global.grav //Gravedad global.grav=9.8(ejemplo)

xdir=sign(xf-xi) //Guardar direccion
xf=xi+abs(xf-xi) //manejar xf-xi como positivo, para evitar algunos errores
if xi==xf{xf=xi+1} //Evitar que xf y xi sean iguales, porque da uno que otro error...
var c= (grav/(2*power(potmin,2)))*(power(xf-xi,2)) //Calcular un valor(c) con ecuacion extraña( :D ) para reducir codigo

while(((power(xf-xi,2)-4*(c*(c-yf+yi))))<0){ //Evitar algunos errores que pueden surgir si el target es imposible de alcanzar
potmin+=5
if xi==xf{xf=xi+1}
c= (grav/(2*power(potmin,2)))*(power(xf-xi,2))
}

var res=(-(xf-xi)-sqrt(power(xf-xi,2)-4*(c*(c-yf+yi))))/(-2*c) //Ecuacion extraña :D

ang=radtodeg(arctan(res)) //tranformacion de resultado
if xdir=-1{ang+=2*abs(ang-90)} //modificar angulo si es necesario

//ang es el angulo o direccion a la cual lanzar el proyectil

ins=instance_create_depth(x,y,depth,proy) //Crear el objeto que funciona como proyectil ("proy" es el objeto)
var pot=min(potmin,potmax) //acotar velocidad de acuerdo a la velocidad maxima
ins.hspeed=lengthdir_x(pot,ang)/room_speed //darle velocidad en x al proyectil
ins.vspeed=lengthdir_y(pot,ang)/room_speed //darle velocidad en y al proyectil


Se debe cambiar el objeto "proy" por el objeto proyectil que desee utilizar.


En el evento step del objeto proyectil debe estar la siguiente linea:
vspeed+=global.grav/room_speed  //Gravedad

Notas:
Hay que tener una variable global llamada "global.grav" para la gravedad. valor recomendado: 9.8

Ejemplo:
createproy(x,y,mouse_x,mouse_y,300,600)  //crea un proyectil en las coordenadas X y Y que intentara interceptar las coordenadas del mouse con una velocidad minima de 300 y maxima de 600

Video de ejemplo:








 


No Tienes Permisos Para Dar Puntos
point 19 Puntos

Usuarios que puntuaron el tema » Clamud (9 Pts) » somnus (10 Pts) 


Desconectado somnus

Respuesta #1 en: Julio 29, 2019, 02:51:14 am
muy interesante este script, se me ajusta para algunas mecanicas deseadas, por cierto en caso de tener alguna flecha, como obtener el angulo del proyectil?

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
 


Desconectado CuervoNegro

Respuesta #2 en: Julio 30, 2019, 05:27:51 am
muy interesante este script, se me ajusta para algunas mecanicas deseadas, por cierto en caso de tener alguna flecha, como obtener el angulo del proyectil?

Hola, si te refieres al angulo de la flecha cuando esta en movimiento puedes girarla de esta forma:

var angulo=point_direction(x,y,x+hspeed*2,y+vspeed*2);
image_angle=angulo;

Si te refieres al angulo de lanzamiento, lo puedes obtener de la variable "ang" que se encuentra en el script, solo asegúrate leerla ya que se hayan hecho todos los cálculos correspondientes.
« última modificación: Julio 30, 2019, 05:35:01 am por CuervoNegro »

 


Desconectado somnus

Respuesta #3 en: Agosto 06, 2019, 05:36:28 pm
Va, gracias, voy a checar

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