Hola Comunidad!
Hace Algún Tiempo Uso Un Script Que Cree Sobre De Seguir Un Objeto Con Vectores, Se Los Comparto
•Nombre del creador : Zela
•Breve descripción de la función :
Seguir un Punto Especifico del Plano 2D Con Vectores, Usando Velocidad Y Capacidad De Angulo (Cuanto Rota Al Momento De Acercarse Al Punto)
•Versión GM utilizada : :GM8:
•Código del Script :
> Evento Inicialización "sc_seguir_init"
[gml]/* argumentos
0 = vector velocidad x
1 = vector velocidad y
*/
__Vel[0] = argument0
__Vel[1] = argument1
var cte;
cte = sqrt(__Vel[0]*__Vel[0] + __Vel[1]*__Vel[1])
// Vector Unitario
__Vel[0] /= cte
__Vel[1] /= cte[/gml]
> Evento Step "sc_seguir_step"
[gml]/* Argumentos
0 = pos x del objetivo
1 = pos_y del objetivo
2 = capacidad de angulo a rotar
3 = velocidad
*/
var __Vp,__Vs,__Cte,__Ang,__S;
// Vector De La Direccion Hacia El Objetivo
__Vp[0] = argument0 - x
__Vp[1] = argument1 - y
__Cte = sqrt(__Vp[0]*__Vp[0] + __Vp[1]*__Vp[1])
// Vector Unitario
__Vp[0] /= __Cte
__Vp[1] /= __Cte
// Angulo De Alejamiento
__Ang = __Vel[0]*__Vp[0] + __Vel[1]*__Vp[1]
// Si El Angulo De Rotacion Es Menor al Angulo De Alejamiento
// La Funcion cos() Es La Inversa
if (cos(argument2) > __Ang){
__S = sign(__Vel[0]*__Vp[1] - __Vp[0]*__Vel[1]) // 1 = Derecha, -1 = Izquierda
if (__S =0) { __S = choose(-1,1); }
//Dos Interpretaciones a esta condicion if
// Si Sobrepaso El Objetivo Y Continua (No Hay Colicion) Elejimos Aleatoriamente La Orientacion A Girar
// Si El Objetivo Esta En La Direccion Opuesta A La Velocidad Del Objeto Elijo Aleatoriamente La Orientacion A girar
__Vs[0] = __Vel[0]
__Vs[1] = __Vel[1]
__Vel[0] = __Vs[0]*cos(argument2) - __S*__Vs[1]*sin(argument2)
__Vel[1] = __Vs[1]*cos(argument2) + __S*__Vs[0]*sin(argument2)
} else {
// Si Ya No Es Necesario Rotar Mas, Se Dirije Directamente Al Objetivo
__Vel[0] = __Vp[0]
__Vel[1] = __Vp[1]
}
// Mover Objeto
x += argument3*__Vel[0]
y += argument3*__Vel[1]
// Direccion del objeto
direction = point_direction(0,0,__Vel[0],__Vel[1])[/gml]
> Adicional "sc_cambi_dir"
[gml]// Cambio de la direccion a la fuerza
/* Argumentos
0 = id del objeto a cambiar la variable
1 = direccion de velocidad x
2 = direccion de velocidad y
*/
var __cte;
__cte = sqrt(argument1*argument1 + argument2*argument2)
argument0.__Vel[0] = argument1/__cte;
argument0.__Vel[1] = argument2/__cte;[/gml]
•Comentarios :
El GameMaker Tiene Variables Por Defecto, Pero Aquí Recree Según Yo Los Estimo Conveniente, Si Sienten Cambiarlos Están En Su Libre Albedrio. :)
•Imágenes Del Ejemplo:
(https://scontent-b-mia.xx.fbcdn.net/hphotos-frc3/v/t1.0-9/1044725_134344583439958_353013000_n.jpg?oh=826874cf53d47a93991d23c40a701e83&oe=5509B027) (https://scontent-b-mia.xx.fbcdn.net/hphotos-xfa1/v/t1.0-9/1003436_134344536773296_825288999_n.jpg?oh=cb5b56fca7c2901029a80e91d97c0b54&oe=550729C2)
Saludos