RPG in Gebäude gehen [Denkanstoß]

  • GM 8
  • RPG in Gebäude gehen [Denkanstoß]

    Hallo Leute,

    ich habe eine kleine Frage und hätte gerne lediglich Denkanstöße und keine kompletten Lösungen (Es sei denn jemand hätte die Lust dazu). Und zwar folgendes:
    Man nehme das Beispiel Pokemon: Man geht in ein Gebäude rein und was passiert? Ein neuer Raum wird geladen. Diese Lösung halte ich persönlich für unpraktisch, da dadurch irgendwie der komplette Spielfluss gestört wird. Aus dem Grund habe ich mir etwas anderes ausgedacht: Man geht in ein Gebäude und lediglich das Dach verschwindet (Alpha o.ä.).
    Natürlich hat das auch bestimmte Nachteile. Z.B. sind in Pokemon die Gebäude in der Spielewelt kleiner, als es im Raum tatsächlich ist. Aber das nehme ich gerne in Kauf.

    Nun zu meiner Frage: Wie setze ich das am besten um? Ich würde am Liebsten mit Tilesets arbeiten, anstatt Objekte zu benutzen. Gibt es einen einfachen Weg bestimmten Tiles einen anderen Alphawert zu verpassen, ohne im Raum zu schauen welche ID jedes einzelne Tile hat? Zu beachten ist natürlich, dass jeweils nur das Dach unsichtbar werden soll, in dessen Haus man eintritt, und nicht alle Dächer.

    Ich hoffe ihr könnt mir Denkanstöße geben. :)

    EDIT: Eine Idee, die ich hätte wäre zu prüfen, ob ich unter einem Dachtile stehe und allen Dachtiles, die mit diesem Verbunden sind einen anderen Alphawert zu verpassen. Was haltet ihr davon? Ist das möglich? (Ich finde keinen Befehl, der prüft, ob ein bestimmtes Tile an Position x,y existiert (Also vom Namen her))

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Stupe ()

  • ich würde es folgendermaßen machen

    Alle Dächer die du erstellt werden in einem anderen layer erstellt als alle anderen Tiles, ist ja auch logisch, da sie drüber liegen sollten

    mit der funktion

    GML-Quellcode

    1. tile_layer_find(depth,x,y) Gibt die ID des Tiles mit der gegebenen Tiefe an der Position (x,y) zurück. Wenn kein Tile an der Position existiert wir -1 zurückgegeben. Wenn mehrere Tiles mit der gegebenen Tiefe an der Position existieren wird der erste zurückgegeben.


    prüfst du beim betreten des Gebäudes welche Id das Dach hat!
    Und speicherst diese in einer Variablen

    Anschließen kannst du dann mit

    GML-Quellcode

    1. tile_set_alpha(id,alpha) Setzt den Alphawert des Tiles mit der angegebenen ID.


    dieses Tile, mit einem alpha wert versehen,...

    Ich hoffe mein Ansatz funktioniert und hilft dir weiter =9
    Ich würde schauen das du ein Komplettes Dach hast das aus 1nehm tile besteht, macht die sache einfacher =)

    Grüße Blayde
  • Die Lösung dafür ist relativ einfach. Gib jedem Dach eine andere Depth. Diese wird dazu benutzt jedes Dach zu identifizieren. Nun braucht man nur noch das Dach auszublenden wenn man das Haus betritt, durch die Funktion "tile_layer_hide(depth);" und wieder einzublenden wenn man es verlässt "tile_layer_show(depth);". Eine andere aber nicht so elegante Methode ist es mit zwei for Schleifen den ganzen Raum durchzugehen in so großen Schritten wie der Größe der Tiles und mit der Funktion "tile_layer_find(depth, x, y);" die jeweiligen ID's von den Tiles herausbekommen um den Alphawert zu setzten und so einen Fade zu realisieren. Könnte aber Umständen viel Leistung in Anspruch nehmen. Gegebenfalls sollte man nur den Bereich des Daches durchgehen.

    EDIT: Ich schreib zu langsam...
  • Blayde schrieb:

    ich würde es folgendermaßen machen

    mit der funktion


    GML
    1
    tile_layer_find(depth,x,y) Gibt die ID des Tiles mit der gegebenen Tiefe an der Position (x,y) zurück. Wenn kein Tile an der Position existiert wir -1 zurückgegeben. Wenn mehrere Tiles mit der gegebenen Tiefe an der Position existieren wird der erste zurückgegeben.


    prüfst du beim betreten des Gebäudes welche Id das Dach hat!
    Und speicherst diese in einer Variablen

    Anschließen kannst du dann mit


    GML
    1
    tile_set_alpha(id,alpha) Setzt den Alphawert des Tiles mit der angegebenen ID.


    dieses Tile, mit einem alpha wert versehen,...

    Ich hoffe mein Ansatz funktioniert und hilft dir weiter =9

    Grüße Blayde


    Vielen dank für deine Antwort. Das Problem ist, dass ein Dach aus mehreren Tiles besteht. Kann man irgendwie prüfen, ob neben dem Tile noch mehr mit dieser Depth sind? Und neben diesen auch?

    EDIT: Hab nun folgendes

    GML-Quellcode

    1. //prüft ob ein Dachteil an der stelle ist
    2. roofid = tile_layer_find(-100,x,y)
    3. //Höhe und breite der Tiles
    4. tile_width = 64;
    5. tile_height = 64;
    6. //Findet das linke obere Tile des Daches
    7. if (roofid != -1){
    8. for (i = 0; i <= 20; i+=1) {
    9. if (tile_layer_find(-100,x,y-(i*tile_height)) != -1) {
    10. roofid = tile_layer_find(-100,x,y-(i*tile_height));
    11. }
    12. else {break;}
    13. }
    14. for (j = 0; j <= 20; j+=1) {
    15. if (tile_layer_find(-100,x-(j*tile_width),tile_get_y(roofid)) != -1) {
    16. roofid = tile_layer_find(-100,x-(j*tile_width),tile_get_y(roofid));
    17. }
    18. else {break;}
    19. }
    20. }
    21. //Hier ein Code der Länge und Breite des Daches misst und alles tile_alpha = 0 setzt (Noch nicht gemacht
    Alles anzeigen

    Die for-Schleife finde ich nicht so effizient, weil es höchstens mit einem 20 Tile großen Dach funktioniert. Kann man das irgendwie anders lösen, also ohne einen festen Wert für "i<=20" und "j<=20"?

    EDIT 2: @unten

    Stimmt es bringt ja sowieso nichts, wenn alles außerhalb des Views unsichtbar ist. Vielen Dank ihr zwei für die Hilfe :)

    EDIT 3: Jetzt muss es nur noch irgendwie für nicht rechteckige Dächer klappen. Das versuche ich erstmal selbst und Frage bei Gelegenheit hier noch einmal um Rat. (Ich könnte auch einfach alle Dächer, die ich brauche als ein Tile erstellen aber naja... Denke ich eventuell drüber nach :P )

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

  • Klar geht das,

    wäre dann eher Chris987 seine Methode

    GML-Quellcode

    1. Eine andere aber nicht so elegante Methode ist es mit zwei for Schleifen den ganzen Raum durchzugehen
    2. in so großen Schritten wie der Größe der Tiles und mit der Funktion "tile_layer_find(depth, x, y);"
    3. die jeweiligen ID's von den Tiles herausbekommen um den Alphawert zu setzten und so einen Fade zu realisieren.


    Indem du mit 2 Forschleifen und der Funktion tile_layer_find, prüfst ob es sich bei den nebenliegenden tiles auch um ein Dach handelt. allerdings solltest du nur den Viewbereich durchgehen

    Methode 2
    oder eine weitere Methode du machst ein tile_boden in jedes Haus und wenn der Player dieses Berührt dann änderst du den alpha wert jedes Tiles in einem gewissen durchmesser und der richtigen depth, so hättest du um den bereich des Players immer ein sichtfenster, ist vielleicht net soo toll aber es funktioniert. Würde aber wieder auf Schleifen hinauslaufen