Agosto 27, 2009, 02:41:47 AM Ultima modificación: Agosto 27, 2009, 02:49:50 AM por Fenris78
Autor: Fenris78

Version GM utilizada:  :GM6: Probablemente compatible con :GM7: (por verificar)

Descripcion: Hoy mientras trabajaba en Cell Fusion, me di cuenta de que me vendria bien algun tipo de Script para mejorar la seleccion automatica de enemigos a la hora de dispararles. No me bastaba con que se eligiera al mas cercano, me resultaba mas util elegir primero al enemigo mas cercano ubicado dentro de un rango de vision definido por un angulo y una distancia maximas. En el caso de que no existiera ningun objeto que cumpliera esas condiciones, entonces dar luz verde a elegir el objeto mas cercano aunque estuviera fuera del rango de vision.

Este script tambien puede ser util para hacer peque?as IAs. No he tenido tiempo de hacerlo, pero se me ocurrio que para el ejemplo podria haber puesto un par de nidos de ametralladoras disparando a una multitud de atacantes. Estos nidos solo dispararian a los enemigos que tuvieran dentro de su rango de tiro, priorizandolos segun la distancia a la que se encontrasen de su posicion. Eventualmente, cuando todo estuviera tranquilo, alguien podria atacar desde atras... si no tuvieran activado el 4 argumento, las posiciones serian tomadas, caso contrario, podrian "oir" al enemigo y darse la vuelta.

He de darle las gracias a Darth por darme la idea de por donde podria tirar para hacer el Script y a Killer por ayudarme a localizar y solucionar un bug importante en el script. El post original lo teneis aqui.

Codigo del Script:

/*----------------------------------------------------------------------------
Script de seleccion de objetivos cercanos a traves de visibilidad.

Esta funcion devuelve el id del enemigo mas cercano dentro del rango
de vision. Si esta demasiado lejos, da la opcion de escoger al mas
cercano, este o no dentro de la vista (argument4 puesto a true). Si
el argumento 4 no esta inicializado, el script retorna "false" cuando
no detecta objetos en el rango de vision.

// argument0 objeto a chequear
// argument1 objeto referencia
// argument2 distancia maxima antes de buscar objetivo fuera del encaramiento
// argument3 maxima apertura (por cada lado)
// argument4 si no ve nada, devuelve ids de objeto mas cercano fuera de vista.

Ejemplo de uso:  sc_cercacara(o_hostil,o_scalpel,400,120,true);
----------------------------------------------------------------------------*/

var nen, cen, den, iden, mien, ten;

nen=instance_number(argument0);

cen=ds_priority_create();

for(i=0; i<nen; i+=1)
{
   iden=instance_find(argument0,i);
   
   den=point_direction(argument1.x,argument1.y,iden.x,iden.y);
   
   if (argument1.direction < argument3) && (den > 360-argument3) den -= 360;
   else if (argument1.direction > 360-argument3) && (den<  argument3) den += 360;
   
   if ( den > argument1.direction - argument3 && den < argument1.direction + argument3 )
   {
       if(point_distance(iden.x,iden.y,argument1.x,argument1.y)<argument2)
       {
           ds_priority_add(cen,iden,point_distance(iden.x,iden.y,argument1.x,argument1.y) );
       }
   }
}

if  ( ! ds_priority_empty(cen) ) { mien=ds_priority_find_min(cen); }
else if(argument4=true) { mien=instance_nearest(argument1.x,argument1.y,argument0); }
else {ds_priority_destroy(cen); return false; }

ds_priority_destroy(cen);
return mien;



Como siempre, estais invitados a crear ejemplos, optimizar o ampliar el script. Eso si, si vais a poner algo, procurad que no implique perder la flexibilidad del script.

me llamo la atencio el script...cuando se publico no pense que lo nesesitaria pero ahora que estoy haciendo un juego de naves esta perfecto para buscar enemigos en el campo de vision,obtener su ID y dispararles con un misil dirigido :P
El unico problema es que voy a tener que hacer yo mismo la parte de ver si tambien esta en la vision de la cordenada y la direccion z

salu2, gracias por el script y perdon si estubo mal responder al tema tan viejo xd

Orgulloso veterano de CGM
El poder de hacer un buen juego esta en tus manos.