Tile basierte Kollisions-Abfrage

    Tile basierte Kollisions-Abfrage

    Ich versuche ja seit einer knappen Woche, Stardew Valley, nach zu programmieren(als Lernbeispiel) und da mich dort
    die Pixelweise Bewegung nervt(man steht meist nicht richtig, um eine Handlung auszuführen), dachte ich an eine
    "ganzes Feld" Bewegung, a´la Pokemon.
    Natürlich habe ich mir die unterschiedlichen Ansätze, auf Youtube angesehen und die meisten machen eben eine Pixel-
    genaue Abfrage, wobei hier schon die erste Frage auftaucht:

    Warum gibt es kein "place_meeting_tile()" oder überseh ich etwas?

    Hier mein Ansatz dazu:

    Quellcode

    1. // Kollisions Tile-Map auslesen
    2. var lay_id = layer_get_id("Layer_Kollision")
    3. var map_id = layer_tilemap_get_id(lay_id)
    4. var single_Tile
    5. mapdata = ds_grid_create(tilemap_get_width(map_id), tilemap_get_height(map_id))
    6. for (var _y = 0; _y < tilemap_get_height(map_id); _y++) {
    7. for (var _x = 0; _x < tilemap_get_width(map_id); _x++) {
    8. single_Tile = tilemap_get(map_id, _x, _y)
    9. ds_grid_add(mapdata, _x, _y, single_Tile)
    10. }
    11. }


    Die Daten werden aus dem Kollisions-Layer in eine Map eingelesen, dabei kommt zu gute, dass GM bereits eine Null,
    für ein leeres Feld und eine 1, für ein belegtes Feld, zurück gibt.
    Bei der Bewegungsabfrage, frage ich dann einfach die angrenzenden Felder ab, ob in der Map eine 1 hinterlegt ist,
    das Feld also nicht betreten werden darf. Da ich diese Methode allerdings nirgends gefunden habe, frage ich mich,
    ob ich etwas übersehen habe, da ich denke, dass diese Methode sehr schnell sein müßte und wenn man noch etwas
    herum probiert, auch für Pixelweise Bewegung anzuwenden wäre. Befinde ich mich damit auf dem Holzweg?

    Miradur

    PS.: GM hat so seine Macken, daher warte ich jetzt immer sehr lange ab, bevor ich etwas poste, da manches Fehlverhalten
    sich mit einem Neustart wieder beheben läßt(z.B. Layer die angezeigt werden, obwohl sie ausgeschalten sind und Absturz,
    wenn ich ein anderes Projekt öffne und dergleichen).

    PPS.: kleinen Fehler im Code ausgebessert und bei der Gelegenheit ein kleines Gedanken Update, man könnte es auch mit
    Objekten lösen, da man sie ausschalten kann, sobald man die Daten in der Map abgelegt hat.
    Weiterer Vorteil, die Tiles werden von GM durchnummeriert(also 0, 1, 2, 3 .. usw.), dadurch kann man folgendes tun:

    0 = Feld kann betreten werden
    1 = Feld kann betreten werden, akzeptiert aber keine Veränderungen
    2 = Feld kann bearbeitet werden
    3 = Hier können per random Bäume und Pflanzen generiert werden
    4 = Spezial Zone, um z.B. den Raum zu wechseln
    usw.
    Angenommen ein Baum hat den Wert 5 und darf nur auf die Felder mit der 3 gesetzt werden, dann wählt man per
    random ein Feld aus, fragt ab, ob es eine 3 enthält und wenn ja wird per 3 | 5 der Baum gesetzt(2 OR 5), Ergebnis 7.
    Hacke ich dann den Baum um, dann wird der Baum mit 7 & 3 wieder aus dem Feld entfernt(7 AND 3), Ergebnis 3.

    Für viele von Euch sicher kalter Kaffee, aber ich wollte es doch als Ergänzung hier hinterlegen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Miradur“ ()