Efiizientere Methode?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Efiizientere Methode?

    Hallo,

    Ich mache gerade einen Top down shooter.
    Der Enemy soll nur sichtbar sein, wenn er nicht hinter einer wand versteckt ist.

    Dazu habe ich folgendes skript im enemy step event:

    mauer=0;

    for(i=0; i<=point_distance(x,y,Player.x,Player.y); i+=1)
    {
    if instance_place(x+lengthdir_x(i, point_direction(x,y,Player.x,Player.y)), y+lengthdir_y(i, point_direction(x,y,Player.x,Player.y)), wall)
    {
    mauer=1; i=100000;
    }
    }

    so kann ich den enemy abhängig davon ob zwischen Player und gegner eine wand ist sichtbar machen oder nicht.
    Problem ist jetzt, dass das relativ Rechenintensiv ist.
    Könnte man umgehen mit if point_distance<1000 usw

    Aber jetzt meine Frage:
    Fällt jemand etwas weniger rechenintensives ein?
  • Naja ich würde so vorgehen,....

    Du gehst vom Player aus,.... nimmst einen gewissen Sichtradius indem er die anderen Spieler überhaupt sehen kann,...
    dann prüfst du über das Parent ob sich ein Gegner im Sichtradius befindet und wenn ja ob er sich hinter einer Mauer befindet...

    GML-Quellcode

    1. with(Parent_Enemy)
    2. {
    3. if point_distance(Player.x,Player.y,Parent_Enemy.x,Parent_Enemy.y) < Sichtradius
    4. {
    5. if collision_line(Player.x,Player.y,Parent_Enemy.x,Parent_Enemy.y,wall,true,true) = false
    6. mauer = 1;
    7. }
    8. }



    Ich kann dir keine Garantie geben ob das so funktioniert,... habs nicht getestet, is nur mal grob runtergeschrieben

    Grüße Blayde
  • Nein ich weis nicht genau wie die Funktion intern funktioniert,...
    Ich gehe aber mal davon aus, das es über Vektorrechnung geschiet.
    Aber ich glaube, das sie deutlich weniger rechenintensiv ist, als deine methode.
    Die GameMaker funktionen sind normalerweise auf Leistung optimiert.

    Aber du könntest die ja mal die Zeit für einen durchlauf berechnen lassen wenn du das möchtest =)