Motion p(l)anning...

  • GM 8
  • Motion p(l)anning...

    Moin und Hallo,

    Ich habe eben auf einem USB-Stick mein damals angefangenes Projekt "El Banco" wiedergefunden.
    Da ich mich damals nicht richtig hingesetzt habe, dachte Ich nun: "Man, das kannst du inzwischen besser".

    Es geht um ein TopDown-"Spiel". Eher Simulation (lasst euch überraschen).
    Und ich habe einen Wachmann, der einen Routine-Pfad abläuft. (Eingangsbereich sichern, Kaffe kochen, WC)
    Nun soll er mir folgen können und dabei gegenständen ausweichen.

    Der Code den ich bisher habe bringts nicht. Klappt manchmal super, aber dann beim nächsten versuch meint der Wachmann an einer Wand für seine Balettauftritte üben zu müssen. Er dreht Pirouetten.

    Nun mein Code:

    GML-Quellcode

    1. //Statusübersicht
    2. // 0 =normal
    3. // 1 =alamiert
    4. // 2 =aggressiv
    5. //normaler Status 0
    6. if global.status =0 {
    7. if distance_to_object(obj_bullet)< 300 {
    8. global.status=1}
    9. }
    10. //alamierter Status
    11. if global.status =1{
    12. path_end()
    13. if distance_to_point(obj_Player1.x,obj_Player1.y) > 50 {
    14. mp_potential_step(obj_Player1.x,obj_Player1.y,1,true)
    15. }else{
    16. speed=0}
    17. }
    Alles anzeigen


    Kann mir jemand sagen was man verbessern kann? Bzw wo ich anfangen sollte? :D

    Danke :)
  • Ersetze deinen Code mal mit diesem hier:

    GML-Quellcode

    1. var nearest_player, nearest_bullet;
    2. if (global.status != 1) {
    3. nearest_bullet = instance_nearest(x, y, obj_bullet);
    4. if (instance_exists(nearest_bullet)) {
    5. if (distance_to_point(nearest_bullet.x, nearest_bullet.y) < 300) {
    6. global.status = 1;
    7. path_end();
    8. }
    9. }
    10. }
    11. if (global.status == 1) {
    12. nearest_player = instance_nearest(x, y, obj_Player1);
    13. if (distance_to_point(nearest_player.x, nearest_player.y) > 50)
    14. mp_potential_step(nearest_player.x, nearest_player.y, 1, true);
    15. }
    Alles anzeigen


    Sonst kann es eigentlich nur an mp_potential_step liegen.

    Edit: Hab den Fehler im Code beseitigt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von cafaxo ()

  • Statt mp_potential_step solltest du lieber ein Grid erstellen und den integrierten A* Pathfinding Algorithmus nutzen.

    Was daran liegt, dass die mp_potential_step Funktion am Ausweichen von komplexeren Strukturen scheitert.
    mp_potential_step macht immer nur einen Schritt auf den Pfad zum Ziel.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Nein henrik, offensichtlich verwechselst du hier etwas:

    mp_potential_step(x,y,stepsize,checkall)
    Like the previous function, this function lets the instance take a step towards
    a particular position. But in this case it tries to avoid obstacles. When the
    instance would run into a solid instance (or any instance when checkall is true)
    it will change the direction of motion to try to avoid the instance and move
    around it. The approach is not guaranteed to work but in most easy cases it
    will effectively move the instance towards the goal. The function returns
    whether or not the goal was reached.


    @BaZZ: Du könntest auch noch versuchen mit mp_potential_settings (siehe Hilfe) herumzuspielen.
  • henrik1235 schrieb:

    Statt mp_potential_step solltest du lieber ein Grid erstellen und den integrierten A* Pathfinding Algorithmus nutzen.

    Was daran liegt, dass die mp_potential_step Funktion am Ausweichen von komplexeren Strukturen scheitert.
    mp_potential_step macht immer nur einen Schritt auf den Pfad zum Ziel.

    Wenn er senkrechte Wände hat, muss er wohl oder über die Pfadfindungs-alrgorythmen verwenden. Sonst ist das schon von der Logik her nicht möglich. Die _potential Funktion schaut sich sozusagen um was so vor dem Spieler liegt und entscheidet dann in welche Richtung er den Schritt tun soll.
    Man könnte das mit dem Vergleichen was ein Mensch im Dunkeln tut: Sich mit ausgestreckten Armen herumtasten. In einem Labyrith kommt man so auch nicht weit :D

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Also..ich habe mich mal an die Grid Sache gewagt.
    Das ist relativ neu für mich. ICh habe sonst nur das D&D :action_ifgrid: benutzt.
    Im Anhang ist ein Versuch, in dem der Gegner zum Player laufen sollte. Und natürlich um die Hinternisse rum gehen sollte.
    Aber irgendwie versteh ich das nicht :whistling:
    Kann da mal ein Meister drüber schauen? :rolleyes:
    Dateien
    • example.rar

      (10,04 kB, 125 mal heruntergeladen, zuletzt: )
  • Benutzer online 1

    1 Besucher