Path kreuzung (Weiche)

  • GM 8
  • Path kreuzung (Weiche)

    Hey Community,
    ich bin zurzeit dabei ein Eisenbahngame zu machen, und habe folgendes Problem.

    Der Zug folgt der Strecke mittels einem von mir gelegten Pfad, was auch super funktioniert.
    Jetzt möchte ich allerdings das der Spieler kurz vor einer Weiche die Richtung die der Zug fahren soll bestimmen kann,....
    aber ich hab keine Ahnung wie ich das ganze umsetzen soll

    irgendwie müsste ich es ja hinbekommen das der Zug je nachdem wie die Weiche steht, den alten Pfad verlässt und durch einen neunen erstetzt und anschließend nach der Weiche wieder auf den Normalen Pfad zurückkehrt....


    Sozusagen wird vor der Weiche der auf einen Pfad der Weiche gewechselt und dannach wieder auf den vordefinierten Pfad,....
    aber je nachdem halt welchen Weg er jetzt nimmt


    Ums besser verständlich zu machen, hier nochmal 2 bilder im Anhang

    Hat jemand ne idee wie das ganze relativ einfach umsetzbar ist?


    EDIT:

    Ich weis das man mit path_assign(ind,path) paths aneinanderreihen kann, allerdings muss der pfad dann neu gestartet werden, ich möchte allerdings das die Lok einfach weiterfahren kann ohne wieder von vorn anzufangen,....



    Grüßle Blayde
    Bilder
    • Weiche.PNG

      61,09 kB, 882×372, 136 mal angesehen
    • Weiche2.PNG

      60,93 kB, 907×241, 125 mal angesehen

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

  • Du könntest dafür eine eigene Datenstruktur verwenden (am einfachsten Objekte):

    obj_PathObject:
    x, y sind die Punktposition im Path
    NextA gibt den nächsten Punkt an (noone wenn keinen oder so)
    NextB gibt den nächsten Punkt an

    NextA dabei die normale Verbindung zum nächsten Punkt
    NextB stellt dabei die Weiche da (du kannst z.B. zufällig zwischen A und B wählen)


    Mit dieser Datenstruktur könntest du nun direkt deine Paths bauen oder eine von den eingebauten Paths generien (path_-Funktionen).

    Dein Zug brauch nun eine Information zwischen welchen zwei Punkten er gerade ist:

    GML-Quellcode

    1. PathPointStart = noone;
    2. PathPointEnd = noone;
    3. PathPosition = 0; //Position auf dem Path in Werten von 0 bis 1
    4. PathSpeed = 0; // Speed in Room Einheiten (Pixel whatever)


    Der Code fürs bewegen:

    GML-Quellcode

    1. if (PathPointStart == noone || PathPointEnd == noone) { //kein nächster Punkt? nichts tun.
    2. exit;
    3. }
    4. var dist;
    5. dist = point_distance(PathPointStart.x, PathPointStart.y, PathPointEnd.x, PathPointEnd.y); // man kann den Wert in den Punkten cachen, für Performance
    6. PathPosition = min(1, PathPosition + PathSpeed / dist); // auf Path bewegen
    7. //// Position auf Path interpolieren (linear, man kann auch andere Methoden nutzen, je nach Anwendung)
    8. // Vektor bauen
    9. var dirx, diry;
    10. dirx = (PathPointEnd.x - PathPointStart.x);
    11. diry = (PathPointEnd.y - PathPointStart.y);
    12. // Position setzen
    13. x = PathPointStart.x + dirx * PathPosition;
    14. y = PathPointStart.y + diry * PathPosition;
    15. if (PathPosition >= 1) { // schon bei Zielpunkt?
    16. PathPosition = 0;
    17. PathPointStart = PathPointEnd; //Ziel Punkt auf Start Punkt setzen
    18. if (PathPointEnd.NextA == noone) { // hat keinen nächsten Punkt
    19. PathPointEnd = noone; //kein Ziel setzen
    20. }
    21. else if (PathPointEnd.NextB == noone) { // keinen alternativen Punkt
    22. PathPointEnd = PathPointEnd.NextA;
    23. }
    24. else {
    25. PathPointEnd = choose(PathPointEnd.NextA, PathPointEnd.NextB); // Zufällig Weiche setzen
    26. }
    27. }
    Alles anzeigen


    Ich hab das ganze jetzt mal schnell im GameMaker Script Editor zusammen geschrieben, ich weiß nicht ob der Code überhaupt funktioniert und ob die Lösung zu komplex für ein eigentlich einfaches Problem ist. Du musst jetzt nur noch die Punkte vom Path in diese Objekte bringen und Path-Punkte die auf dem selben Punkt sind linken.

    Vielleicht kann ich auf die schnelle noch ein Beispiel zusammenhauen.

    #edit:
    Hab schnell ein Beispiel zusammen gehauen wie so was funktionieren könnte.
    Dateien
    • pathTest.gmk

      (11,31 kB, 79 mal heruntergeladen, zuletzt: )
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%

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

  • Alternativ könntest du deine Pfade auch einfach unterteilen. Dann verlaufen sie nicht mehr von Bahnhof zu Bahnhof, sondern von "Knotenpunkt" zu "Knotenpunkt", und ein Knotenpunkt kann dann entweder ein Bahnhof oder eine Weiche sein.
    Im End of Path event prüfst du dann, wo du gerade angekommen bist: Bist du bei einem Bahnhof angekommen, machst du das, was dein Zug dort tun soll; bist du bei einer Weiche angekommen, schaust du dir an, wie sie gerade gestellt ist (d.h. welcher Pfad von ihr vorgegeben wird) und folgst dann dem Entsprechenden Pfad.
    So sparst du dir das Umrechnen von Positionen, hast dann aber auch ein paar Pfade mehr.
  • @CAS & henrik1235

    Danke für eure schnelle und ausführliche Hilfe,
    vorallem dir henrik1235 danke ich für dein example, es funktioniert echt gut, jetzt muss ich es nurnoch verstehen damit ichs auf mich zuschneiden kann =)

    Ich denke das Problem ist damit gelöst, sollte ich noch fragen haben melde ich mich nochmal =)


    EDIT:
    So ich muss das Thema doch wieder ausgraben, weil es leider noch nicht so klappt wie ich mir das Denke,

    @hentrik1235 deine Idee ist zwar gut, allerdings arbeitest du ganz ohne Pfade, was dazuführt das ich dein Code nur mit rießigem aufwand benutzen könnte, was ich vermeiden möchte


    Zudem ist das Problem das ich dem Spieler unter umständen auch die Möglichkeit lassen möchte mit dem Zug rückwärts zu fahren, dadurch ergibt sich ein ganz neues Problem, wenn ich per Weiche den pfad ändere und mich auf dem neuen befinde dann kann ich nichtmehr rückwärts bzw wenn ich zurück auf dem alten pfad bin, dann stehe ich ja am Anfang und nicht am Ende,....

    Am liebsten wäres es wenn ich den Pfad mergen könnte, dazu hab ich hier im Forum auch schon etwas gefunden Hier

    Aber das Problem ist sobald ich 2 Pfade miteinander verbinde, springt die Lok wieder zurück an den Anfang,....
    Das Ganze scheint nicht so einfach zu sein :/

    Die Beste Lösung halte ich bis jetzt für die, jedes gleisstück als eigenes Objekt zu machen und diesem einen eigenen Pfad zuzuordnen der Relativ versetzt wird um dann mit der Lok von Pfad zu Pfad zu springen. Mal schauen ob ich das hinbekomme ^^

    Fals jemand noch ne bessere Idee hat, oder weis wo ich hilfe herkriegen könnte, immer her damit ^^




    Grüße Blayde

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Blayde ()