Bewegungsbereich festlegen

  • GM 8

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

  • Bewegungsbereich festlegen

    Hey Leute ich versuch grad ein Game zu entwickeln bei dem sich die Spielfigur nur auf einem von mir bestimmten Bereich bewegen darf, sprich ich habe Tiles die einen Weg bilden und ich möchte das sich die Person wenn ich auf einen Bereich klicke zu diesem Bewegt allerdings darf sie dafür nur den Bewegungsbereich nutzen sonst nix.

    Mein einzigstes Problem ist grad wie ich es hinbekomme das sie wirklich nur in dem Bereich läuft, ich würde ungern den Bereich mit unsichtbaren Objekten festlegen, zu Performance intensiv.

    Ich benutzen einen Pathfinding Algorithmus der Objekte unterstütz sprich sie umgeht

    gibts au ne möglichkeit des ganze mit Tiles zu machen? Ich hab leider noch keinen gefunden

    Hat jemand ne idee oder en vorschlag?

    Hier ist noch mein Pathfinding Code

    GML-Quellcode

    1. if(mouse_check_button(mb_left)){
    2. global.next_x=mouse_x;
    3. global.next_y=mouse_y;
    4. walk=true
    5. run=false
    6. }
    7. if(mouse_check_button(mb_right)){
    8. global.next_x=mouse_x;
    9. global.next_y=mouse_y;
    10. walk=false
    11. run=true;
    12. }
    13. if distance_to_point(global.next_x,global.next_y)<3
    14. {speed=0}
    15. //Pathfinding
    16. dir = direction
    17. grid = mp_grid_create(0,0,room_width/32,room_height/32,32,32)
    18. path = path_add()
    19. //Collisionsobjekte
    20. mp_grid_add_instances(grid,obj,1)
    21. mp_potential_settings(45,45,3,0);
    22. mp_grid_path(grid,path,x,y,global.next_x,global.next_y,1)
    23. path_start(path,4,"",1)
    Alles anzeigen
  • Optimal ist:

    Wenn du dein Spielfeld in Kacheln unterteilst (sieht so aus als hättest du das bereits und macht ja auch Sinn mit Tiles) und dann eine Datenstruktur verwendest, um die Begehbarkeit zu speichern.
    Hier bietet sich natürlich ein 2D-Array an (bzw. Grid) und es reichen binäre Werte.
    Dies ließe sich dann auch leicht erweitern, z.B. wenn du Wege haben möchtest, die nur in eine Richtung begehbar sein sollen, etwa wie Stufen bei Pokémon. Hier könnte man dann einfach weitere Werte einführen.

    Am besten eignet sich dann der A*-Algorithmus (de.wikipedia.org/wiki/A-Stern-Algorithmus).
    Wenn das ganze größer wird, merkt man schnell dass die GM-Wegfindung nicht die schnellste ist (aber man kann sie schon sehr gut einstellen).

    Wenn du diese binäre Map (2D-Array) direkt aus deinen Tiles generieren möchtest musst du dir etwas entsprechendes überlegen. Lädst du diese eh aus eigenen Leveldateien, ist es ja kein Problem beim Erstellen der Tiles die Kollisions-Map anzupassen.
    Hast du aber die Tiles direkt im GM Editor gesetzt, ist es etwas aufwändiger. Hier kann aber ein primitiver Ansatz ausreichen, der nur beim Spielstart ein paar Millisekunden frisst. Z.B. kannst du deine Tiles erst mal in 2 Layer aufteilen, so dass Tiles mit Kollision eine andere Tiefe haben, als solche ohne. Dann kannst du z.B. beim Levelstart alle Kacheln auf dem Spielfeld (also etwa alle x, y-Koordinaten in 32er Schritten) prüfen und wenn dort ein solches Tile ist, mit dem du kollidieren können möchtest, setzt du das entsprechende Feld der Kollisions-Map...

    tile_layer_find(depth,x,y) Returns the id of the tile with the given depth at position (x,y). When no tile exists at the position -1 is returned. When multiple tiles with the given depth exist at the position the first one is returned.

    Reicht dir dieser Vorschlag und die Erklärung?
  • Verständnis mäßig verstehe ich voll und ganz was du sagst, ich hab mir auch schon sowas in der Art überlegt
    nur die Umsetzung fällt mir schwer, is ne weile her das ich richtig programmiert hab, bin deswegen bissle eingerostet :P

    Mein Problem ist, ich möchte ein Isometrische Labyrinth erstellen, so das der Player nicht durch die Wände hindurchlaufen kann, bis jetzt habe ich nur das Problem mit dem depth hinbekommen, ich habe über 2 Verschiedene Tiles definiert wann sich der Player vor und wann hinter der Mauer befindet, da dies ja mit Tiles nicht so einfach ist wie mit Objekten.
    Außerdem kann man mit Tiles einfach viel besser ein Lvl aufbauen, wenn man 1000 Objekte hat dauert das ewig, und nur 1 Objekt mit 1000 Sprites wird auch kompliziert weil man ja immer nur das erste Sprite im Lvl-Editor sieht :/

    Ich würde Ungern meine ganzen Mauern zu Objekten machen, weil das schnell dazu führen würde das der GM langsam auf schlechteren PC läuft.

    Trotzdem danke für deine schnelle Antwort, ich werd mal schauen was sich machen lässt

    Gruß Blayde
  • Vermutlich kommst du nicht drumrum dir eine Formel zu überlegen oder zu suchen, die die isometrischen Koordinaten auf ein 2D-Array abbildet, das ist auch nicht so ganz trivial...

    Und hättest du vielleicht noch einen Screenshot von dem, was du bereits hast, damit man sich das ganze besser vorstellen kann?

    Viel Erfolg!
  • Einen Screenshot würde ich nur ungern hochstellen, des das mir nachher noch jemand die Idee klaut :P

    Ne spass, also ich hab das Problem jetzt doch recht simpel gelöst, ich habs jetzt Objekte benutzt allerdings hab ich einfach nur über die Mauertiles, RechteckObj gelegt, damit wir die Mauer als Kollisionsobjekt erkannt, mal schauen wie das ganze sich auswirkt wenn ich das lvl vollgestopft mit obj hab, möglicherweise muss ich dann doch noch in die Trickkiste greifen bzw mir was kompliziertes ausdenken ^^

    Trotzdem danke BadToxic

    =)