Motion Planning sich bewegende Objekte umgehen (Ehemals: Motion Planning - Größere Objekte)

  • GM 8
  • Motion Planning sich bewegende Objekte umgehen (Ehemals: Motion Planning - Größere Objekte)

    Erster Post zum Thema "Motion Planning sich bewegende Objekte umgehen" hier.

    Hi!
    Ich hab mich in der letzten Zeit mal ein bisschen mit den ganzen mp-Funktionen vertraut gemacht. Jetzt habe ich ein Problem: Ich brauche eine Möglichkeit um Objekte den Weg finden zu lassen, die größer sind, als die einzelnen Zellen (16x16). Die Größe der Objekte ist aber immer duch eine Zellengröße teilbar, falls das von Nutzen ist.

    ~Shiza

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

  • Ähm. Ich bin mir nicht sicher, ob ich das verstanden habe. Wie lasse ich denn mehrere Zellen belegen? Ich meine ich lasse bei einem normalen Objekt na nichtmal eine zelle belegen, sondern sage ihm nur sowas wie "mp_grid_path(global.gird,path,x,y,mouse_x,mouse_y,0);" (und dann halt, dass er den Path startet).
  • Wie schon Chaos Creator vorgeschlagen hat, würde ich es auch mit einem zweiten Grid lösen. Im Anhang siehst du ein Beispiel wie ich vorgehen würde. Der rote Bereich soll das Objekt darstellen, die dunkelgrauen Felder die Kollisionen im Raum und die hellgrauen Felder sollen im mp-Grid für das rote Objekt zusätzlich als Kollisionen markiert werden. Wenn du nun in diesem Grid einen Pfad berechnest, dann lässt sich das rote Objekt mit dem oberen linken Feld problemlos auf diesem Pfad entlang bewegen. Es sollte auch kein Problem darstellen den hellgrauen Bereich automatisch generieren zu lassen nur anhand der Kollisionen und der Größe des Objekts.
    Bilder
    • mp.PNG

      2,91 kB, 240×240, 116 mal angesehen
  • Daran hab ich auch schon gedacht, aber wenn ich für ein größeres Objekt auch ein größeres Gird nehme, dann kann sich dieses Objekt auch nur mit größeren Schritten bewegen. Genau diese grauen stellen sind dabei mein Problem.

    Könnte sich der Ball auch mit 16er Schritten bewegen, würde er hier z.B. noch durchpassen.
    Furchtbar verzwickt.
  • Ich glaube da hast du mich missverstanden. Ich habe nichts von einem größeren Grid gesagt. Die Zellen sollen genauso groß sein wie beim ersten Grid und nicht etwa so groß wie das Objekt. Es sollen lediglich zusätzliche Felder als Kollision markiert werden, nämlich die in meinem Beispiel hellgrauen Felder. Denn dann ist es egal auf welchem weißen Feld sich das obere linke Feld des roten Objekts befindet, das rote Objekt wird nie eine Kollision mit den dunkelgrauen Feldern verursachen. Um das zu verdeutlichen habe ich in mein Beispiel mal noch einen blauen Pfad eingezeichnet. Ich hoffe jetzt ist es verständlicher.
    Bilder
    • mp.PNG

      2,95 kB, 240×240, 102 mal angesehen
  • Aaaaah! Ich glaube, das ist genial! Ich probiers mal und edite meinen Erfolg (ggf. Misserfolg) hier rein.
    Danke! Ich glaube so hätte ich das selbst nie betrachtet. :)

    ~

    Edit:Okaaay... Ich habe theoretisch verstanden was zu tun ist, kann es aber praktisch nicht umsetzen. Theoreitsch kreire ich ein zweites Gird, dass ersteinmal identisch zu dem ersten ist. Ich lege auch die Obstacles genau so fest. Anschließend müsste ich dann nur noch über, links neben und links oben neben den blockierten zellen auch alle zellen blockieren. Aber ich kann ja nicht abfragen welche zellen schon blockiert sind, oder? Bei noch größeren objekten müsste der Vorgang einfach nochmals wiederholt werden.
    (ich benutze mehrere girds, damit sich die keineren objekte immernoch frei bewegen können, und ich nicht ihren weg auch blockiere)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Shizaso ()

  • Du kannst zwar keine schon blockierten Zellen abfragen, aber du kannst ja das Grid mit der Rechtecksfunktion blockieren lassen, also ausgehend von jeder Instanz, die es blockieren soll.

    GML-Quellcode

    1. with (obj_wall)
    2. mp_grid_add_rectangle(grid,x-16,y-16,x+16,y+16) // Ausgehend davon dass deine Mauerobjekte den Ursprung 0,0 haben und 16 Pixel hoch und breit sind.

    © 2008 by Teamgrill Productions
  • Okay... So leid es mir tut, aber es will nochimmer nicht. Allerdings aus einem mir vollkommen unersichtlichen Grund. Er sagt, er kenne die Variable "gird" nicht. Dabei hab ich sie drei Zeilen vorher definiert und auch global gesetzt, damit mein obj_wall damit etwas anzufangen weiß. Trotzdem gibts die Fehlermeldung.
    O.o !?
    Ich häng mal ne winzige Demo vom Problem an.
    ~
    Dateien
    • Problem.rar

      (11,14 kB, 100 mal heruntergeladen, zuletzt: )
  • Motion Planning sich bewegende Objekte umgehen

    Okay. ich eröffne mal kein neues Thema, weil dieses hier praktisch vorwissen für mein jetziges problem ist.

    Ich möchte, dass sich die objekte, die ich mit mp bewege gegenseitig umgehen, oder sich wenigstens nicht berühren/überlagern.
    Ich habe es selbst versucht, indem ich jeweils ein objekt angehalten hab, wenn es einem anderen zu nahe kam (immer das mit der kleineren id), aber das hat nicht richtig funktioniert.
    Hat jemand ne andere Idee dazu?

    ~
  • Ich denke die einfachste Lösung wäre, bei jedem Objekt die jeweils anderen zum Grid hinzuzufügen, Pfad berechnen, ausführen und dann die anderen Objekte wieder vom Grid zu entfernen. Man müsste den Pfad deshalb direkt ausführen, da den anderen Objekten die neue Position ja sonst noch nicht bekannt ist und sie so letztendlich doch kollidieren könnten.
    Da es keine Funktion zum sofortigem ausführen des Pfades gibt, musst du dich wahrscheinlich mit

    GML-Quellcode

    1. path_get_x(path_id,path_get_lenght(path_id)/10)
    oder ähnlichem zufriedengeben - damit sollten sich die Objekte mit gleicher Geschwindigkeit fortbewegen - für die müsste man das /10 halt anpassen.

    Das ist nicht getestet, sollte aber eigentlich klappen und währe auch das einzige, was mir als Lösung einfällt.