Pathfinding AI (Nach einem GRID) geht durch Ecken

    Pathfinding AI (Nach einem GRID) geht durch Ecken

    Abend,

    Ich habe heute mal versucht eine Pathfinding KI zu erstellen, mithilfe eines Grids.
    Wenn der Gegner den Weg also zu meinem Spieler finden soll, geht er durch die Ecken der Wände.
    Er umgeht sie zwar, aber kollidiert trotzdem.

    Quellcode

    1. //Gegner Step
    2. //Create path and move to player
    3. var px = obj_player.x;
    4. var py = obj_player.y;
    5. if(mp_grid_path(global.grid, path_add(), x, y, px, py, 1)){
    6. path_start(path, 3, path_action_stop, false);
    7. }


    Quellcode

    1. //Grid Objekt
    2. //Create a grid
    3. cell_width = 32;
    4. cell_height = 32;
    5. hcells = room_width div cell_width;
    6. vcells = room_height div cell_height;
    7. global.grid = mp_grid_create(0, 0, hcells, vcells, cell_width, cell_height);
    8. mp_grid_add_instances(global.grid, obj_wall, false);



    Wenn das Problem unklar ist, einfach folgendes Video angucken:



    MLG, SuspecT
    :thumbsup:
    Versuche mal bei der Funktion mp_grid_path hinten die 1 mit einer 0 oder false zu ändern. Dann geht der nicht mehr schräg und streift wahrscheinlich die Wände nicht mehr so.
    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
    Ich hätte vielleicht 'nen Lösungsansatz gefunden.
    Wenn ich den "path" nur beim create Event des Gegners erstelle, passt alles.
    Dadurch, dass ich das jeden Step ausführe, geht er durch die Ecken und wackelt immer so komisch.
    Kann ich vielleicht etwas anderes, als das Step Event nehmen? Vielleicht, dass es nur erneut ausgeführt wird,
    wenn der Spieler seine Position ändert?


    EDIT: Jetzt habe ich es getestet, dass der Pfad nur neu erstellt wird, wenn sich der Spieler bewegt.
    Solange sich der Spieler also nicht bewegt funktioniert alles gut, aber sobald er sich wieder bewegt, entsteht das Problem wieder.

    :?:
    :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SuspecT“ ()

    Jeden Step den Weg zu berechnen ist recht leistungsintensiv.

    Der Path sieht nach "smooth curve" aus. Vllt kann man ihn iwie aus "straight lines" umstellen.
    • Bluetooth Multiplayer
    • Wasser App: play.google.com/store/apps/details?id=com.gaming_apps.water_physics_simulation
    • :shifty: :motz:
    Also das liegt wohl dran, dass du den neu berechnet, wenn der Gegner nicht in der Mitte von dem Gang ist.
    Nehme mal statt x und y gesnappte Koordinaten also
    x = floor(x / cell_width) * cell_width
    Und das selbe bei y
    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

    glim888 schrieb:

    Jeden Step den Weg zu berechnen ist recht leistungsintensiv.

    Der Path sieht nach "smooth curve" aus. Vllt kann man ihn iwie aus "straight lines" umstellen.


    Ich habe davon irgendwie nichts verstanden. Kannst du es erklären?

    Also das liegt wohl dran, dass du den neu berechnet, wenn der Gegner nicht in der Mitte von dem Gang ist.
    Nehme mal statt x und y gesnappte Koordinaten also
    x = floor(x / cell_width) * cell_width
    Und das selbe bei y


    Wenn ich das mit dem x und y vom Gegner mache, spinnt der rum und wenn ich das mit dem Spieler x und y mache, hält der kurz vor dem Spieler an (da er ja nur zum gerundeten Punkt geht).
    :thumbsup:
    d2r5da613aq50s.cloudfront.net/…uploads/438623.image0.jpg (unten links die Radio Buttons)

    nur eine Vermutung. Husis Antwort klingt logischer.
    • Bluetooth Multiplayer
    • Wasser App: play.google.com/store/apps/details?id=com.gaming_apps.water_physics_simulation
    • :shifty: :motz:
    Du musst das ausführen im Stepevent auf jeden Fall irgendwie triggern, so das du nich in jedem Step neu berechnest.

    Du könntest das mit Hilfe deines Spielers machen.
    Z.B. löst der Spieler den Trigger immer dann aus, wenn er während der Bewegung die nächste Zelle im Grid erreicht hat.
    Damit würde die Neuberechnung nicht in jedem Step stattfinden. Des Weiteren hättest du immer einen fixen Bezugspunkt bezogen auf dein Grid.

    Das Triggern machst du einfach über eine Variable
    Spieler: -> Spielerbewegung -> in neuer Zelle angekommen -> gegner.trigger= 1
    Gegner: -> Path berechnung wenn trigger = 1 -> Path berechnung abgeschlossen trigger = 0

    Alternativ kannst du noch versuchen dein mp_Grid zu verkleinern um so um die Wände herrum noch nichtbegehbare Felder zu erschaffen.
    Dazu müsste aber aus einer mp_Gridzelle mindestens 9 werden.
    Mein aktuelles Projekt: Twiggels Tower Defence :para: :shifty:
    Mittlerweile: Green and Gray