Wochen saßen wir vor dem Problem und hatte mehrere komplizierte Versuche mit Knoten und Pathfinding, mit 6 versch. Bacon um jeden Gegner, die die Umgebung abscannen, oder 6 versch. Bacon um den Spieler, die als Anlaufstelle für Nahkampfgegner dienten, ....
.... am Ende war es die simpelste Idee, die den Erfolg brachte:
2 kleine Positionen neben jedem Gegner, die vom Gegner angetraced wurden. Liegt was dazwischen, dreht er sich weg - das ist alles. Schon rennen die Gegner schön um Hindernisse und positionieren sich damit total selbständig um den Spieler
function gegner_checkt_Umwelt()...manchmal ist die einfachste Lösung die beste!
{
VECTOR content_left;
VECTOR content_right;
int content_range = 120;
vec_set(content_left.x, vector(content_range, -content_range/2, 20));
vec_rotate(content_left.x, vector(my.pan,0,0));
vec_add(content_left.x, my.x);
draw_point3d(content_left, vector(0,0,255), 100, 10); // debugzwecke
vec_set(content_right.x, vector(content_range, content_range/2, 20));
vec_rotate(content_right.x, vector(my.pan,0,0));
vec_add(content_right.x, my.x);
draw_point3d(content_right, vector(0,0,255), 100, 10); // debugzwecke
if( c_trace(my.x, content_left.x, IGNORE_ME | IGNORE_PASSABLE) > 0)
my.pan += 5 * time_step;
if(c_trace(my.x, content_right.x, IGNORE_ME | IGNORE_PASSABLE) > 0)
my.pan -= 5 * time_step;
if((c_trace(my.x,content_left.x, IGNORE_ME | IGNORE_PASSABLE) + c_trace(my.x,content_right.x, IGNORE_ME | IGNORE_PASSABLE)) <= 0)
{
you = enet_ent_locpointer(my.ziel_pointer); // wenn nichts dazwischen, dreh dich zum Ziel
VECTOR vTarget_Angle;
vec_to_angle(vTarget_Angle, vec_sub(vec_set(temp, you.x),my.x));
var diff = ang(vTarget_Angle.x - my.pan + 360);
my.pan += diff * 0.125 * time_step;
}
}
Keine Kommentare:
Kommentar veröffentlichen