:D
Aqui varios codigo fuente para mover cantidad de Personajes
al tiempo.
program mi_programa;
/*
AI Example by Colombian Developers
y
^ z
! /
! /
*------->x
switch with Integers
*/
local
ExecuteCont=0;
const
mode8_width=640; //res. Limit is 640x480 max.
mode8_height=480;
MaxGrupos=3;
MaxSoldiers=5;
Incremento=1;//cada cuanto cambia
global
salida;
GrupoActual=0;
i,j=0;
process Soldier(grupo, SoldierID)
begin
loop
if (ExecuteCont < father.ExecuteCont)
say("ejecutando AI Grupo: "+itoa(grupo)+" Soldier:"+itoa(SoldierID));
//AI code Here
// ..
ExecuteCont= father.ExecuteCont;
end;
frame;
end;
end;
process Escuadron(grupo) //controla un grupo de Soldiers
local
TimeeGroup;
begin
for (j=1;j<MaxSoldiers;j++) //carga Soldiers del escuadron
Soldier(grupo,j);
end;
loop
if (grupo == GrupoActual) //coordina la ejecucion de los Soldiers
say("Update Group: "+itoa(grupo));
ExecuteCont++; //actualiza los hijos
end;
frame;
end;
end;
begin
set_mode (mode8_width,mode8_height,16);
WRITE_INT(0,430,20,0,offset GrupoActual);
WRITE_INT(0,430,50,0,offset j);
for (i=0;i<=MaxGrupos;i++)
Escuadron(i);
end;
while ( !key(_esc) )
GrupoActual= (j>>Incremento)&MaxGrupos;
j++;
frame;
end;
let_me_alone();
end
program mi_programa;
/*
AI Example by Colombian Developers
- Time Slicing Example-
y
^ z
! /
! /
*------->x
switch with Time
Nota: Este codigo se puede mejorar para que se ejecuten todos los Soldiers
de una forma mas conveniente (es solo un borrador de un motor de IA)
Este seudocodigo explica la tecnica de partir tiempos(time slicing), para
evitar que se sobrecargue el procesador con todos los procesos al tiempo,
asi logramos mayor velocidad cuando tenemos mas de 400 procesos activos .
*/
local
ExecuteCont=0;
const
mode8_width=640; //res. is 640x480 .
mode8_height=480;
MaxGroups=3;
MaxSoldiers=5;
SplitTimeGlobal=100;
global
TimeeGlobal;
i,j=0;
process Soldier(Group, SoldierID)
begin
loop
if (ExecuteCont < father.ExecuteCont) //evita ejecutar bloques de codigo sino es necesario
say("Run AI Group: "+itoa(Group)+" Soldier:"+itoa(SoldierID));
// --- AI Code here
// ---
ExecuteCont= father.ExecuteCont;//evita que se repita en este ciclo
end;
frame;
end;
end;
process Escuadron(Group, splitTime) //controla un Group de Soldiers
local
TimeeGroup;
begin
for (j=1;j<MaxSoldiers;j++) //carga Soldiers del escuadron
Soldier(Group,j);
end;
TimeeGroup= TimeeGlobal + splitTime;//se sincroniza
loop
if (TimeeGroup < TimeeGlobal) //coordina la ejecucion de los Soldiers
say("Update Group: "+itoa(Group));
TimeeGroup= TimeeGlobal + splitTime; //se sincroniza
ExecuteCont++; //actualiza los hijos
end;
frame;
end;
end;
begin
set_mode (mode8_width,mode8_height,16);
WRITE_INT(0,430,20,0,offset TimeeGlobal);
// WRITE_INT(0,430,50,0,offset EjecutarFlag);
TimeeGlobal= GET_TIMER(); //init timer
Escuadron(0,SplitTimeGlobal); //each 100ms by example
Escuadron(1,SplitTimeGlobal+100); //each 200ms
Escuadron(2,SplitTimeGlobal+200); //each 300ms
Escuadron(3,SplitTimeGlobal+300); // etc etc
while ( !key(_esc) )
TimeeGlobal= GET_TIMER();
frame;
end;
let_me_alone();
end
Es buena idea l1nk, pero hace falta limitar un número de frames máximos en los que no se ejecuta la IA. Por ejemplo, en mi juego de Droides hay momentos en los que un droide termina de matar a un enemigo y tiene otro en frente de sus narices, y es "extraño" ver cómo se queda buscando objetivo durante "demasiados" frames.
También había pensado en otra solución que no sé si ya conté... Si un droide con rango de visión N está adyacente a otro droide con radio de visión N+1 o superior, entonces toma el objetivo de ese droide y no se preocupa de buscar. Aplicado a escuadrones los de mayor rango son los que usan la IA mientras que el resto sólo esperan a que éstos obtengan objetivo.
Seguiremos investigando este tema... Esta semana no he programado apenas, he estado ocupado pero lo retomaré con ganas.
Un codigo mas optimizado para busqueda de caminos por Windgate
http://rapidshare.com/files/337226921/Victor_IA_0.3.rar.html
Solo bastaria adicionarle un flag , a cada personaje que indique cual debe ejecutarse
mas ...
3000 personajes a 10fps, con pathfind.
Estoy mirando como termino el pathfind con (dll)
Bravo l1nk, cualquier novedad será bienvenida, tengo pensado asociar a un mapa de terreno un mapa de durezas para que path_find pueda buscar caminos y evitar montañas... De momento no tengo nada al respecto, pero la idea me tortura tanto que cualquiera de estos la probaré.
Lo dicho, si sacas alguna .dll mejorada o cualquier otra cosa no dudes en ponernos aquí la descarguita :D