Pathfinding mit Physik Objekten?

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

  • Pathfinding mit Physik Objekten?

    Ja, ein neuer Tag, ein neues Problem.
    Die Physics Funktion bei GM ist ein klasse Sache. Nur wenns dann ans Pathfinding geht, wirds nervtötend. Die Gegner bleiben auf der Map laufend an Sträuchern, Wänden u.Ä. hängen. Ich habe einige Codes mit Pathfinding Funktionen gefunden, wie etwa diesen hier:

    GML-Quellcode

    1. grid = mp_grid_create(0, 0, room_width/8, room_height/8, 8, 8);
    2. path = path_add();
    3. mp_grid_add_instances(path, obj_wall, 1);
    4. mp_grid_path(grid, path, x, y, hspd, vspd,1);
    5. path_start(path, spd, path_action_stop, false);


    Wenn ich die Physik des Objekts abschalte, funktioniert alles wunderprächtig. Aber mit rührt sich das Ding nicht.
    Kennt jemand einen Weg um Pathfinding mit Physik möglich zu machen? Oder evtl. eine alternative Methode mit Physik-Gedöns?

    Ich habe eine Weile gesucht und diesen Code hier gefunden.

    [/gml]

    GML-Quellcode

    1. /// EXECUTE ONCE, create event works well, but an if-statement works too.
    2. path = new path;
    3. mp_grid_path(path, ... ); // assumed path points to the goal
    4. points = path_get_points(path); // get the number of nodes of that path
    5. point = 0;// path to the first node first... firstly.
    6. mag = 10;
    7. done = 0;
    8. /// EXECUTE IN STEP-EVENT OR SIMILAR!!
    9. if(!done) {
    10. var dir = degtorad(point_direction(x,y,path_get_point_x(path,point),path_get_point_y(path,point))); // direction of vector, and in RADIANS; degrees 4 noobs
    11. physics_apply_force(x,y,mag*cos(dir),mag*sin(dir));
    12. // apply a force, on yourself, centered on you, in the direction to the next point on the path...
    13. if(point_distance(x,y,path_get_point_x(path,point),path_get_point_y(path,point) < 64 /* Change this if necessary */ ) {
    14. point++;
    15. if(point > path_get_number()) {
    16. done = true;
    17. }
    18. }
    19. }
    Alles anzeigen

    Leider kapier ich ihn nicht und außerdem scheint er fehlerhaft zu sein.
    Wäre also echt dankbar wenn jemand weiterhelfen könnte.
  • Ja, du musst dir in dem Fall die funktionen selber schreiben. Mit den infos aus dem mpgrid kannst du dir wegpunkte berechnen und die dann mit den physics funktionen versuchen zu erreichen.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Im Code solltest du diese Zeile herauslöschen:

    GML-Quellcode

    1. ​points = path_get_points(path); // get the number of nodes of that path


    Erklärung:

    GML-Quellcode

    1. ​path = new path;
    2. mp_grid_path(path, ... ); // assumed path points to the goal

    Pfad wird über die eingebaute Pathfindingfunktion generiert und in path gespeichert.
    points bekommt die Anzahl der Punkte im Path.

    GML-Quellcode

    1. ​point = 0;// path to the first node first... firstly.
    2. mag = 10;
    3. done = 0;

    Der Code soll später bezwecken, dass sich das Objekt an jedem Punkt entlang hangelt.
    Die Variable point soll angeben, auf welchen Punkt das Obj aktuell zu steuert.
    mag ist die Kraft/Geschwindigkeit.
    done ist einfach erst mal auf 0 bzw. auf false. Wenn der Path durchlaufen ist, wird done später auf true gesetzt.

    GML-Quellcode

    1. ​if(!done) {
    2. var dir = degtorad(point_direction(x,y,path_get_point_x(path,point),path_get_point_y(path,point))); // direction of vector, and in RADIANS; degrees 4 noobs
    3. physics_apply_force(x,y,mag*cos(dir),mag*sin(dir));
    4. // apply a force, on yourself, centered on you, in the direction to the next point on the path...
    5. if(point_distance(x,y,path_get_point_x(path,point),path_get_point_y(path,point) < 64 /* Change this if necessary */ ) {
    6. point++;
    7. if(point > path_get_number()) {
    8. done = true;
    9. }
    10. }
    11. }
    Alles anzeigen

    Wenn noch nicht fertig (if(!done))
    bekomme die Richtung über point_direction, bei dem die Richtung von x,y, zu dem nächsten Path-Punkt berechnet wird.
    Diese Richtung (in Grad) wird in Radiant umgewandelt, da sin und cos mit Radiant arbeiten (möglich ist es direkt mit dsin und dcos zu arbeiten). Diesen Wert bekommt anschließlich die lokale Variable dir.
    Im nächsten Schritt wird über die Funktion physics_apply_force wird dann eine Kraft auf das Objekt ausgeübt um zum Ziel zu gelangen.
    Wenn das Objekt fast am Ziel angelangt ist (fast, da es nicht auf einem Punkt herumzappeln soll), wird point +1 gerechnet um den nächsten Punkt anzusteuern.
    Wenn alle Punkte abgearbeitet wurden, wird done auf true gesetzt.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe