Julio 01, 2013, 05:11:10 AM Ultima modificación: Noviembre 29, 2014, 06:15:33 PM por Zela
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:


Saludos
Fracasar no significa un fin sino un comienzo