GMS: Iso-Perspektive, Wände, Tiefen/Depht's, Transparenz und mein Problem dazu :)

  • GM 8

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

  • GMS: Iso-Perspektive, Wände, Tiefen/Depht's, Transparenz und mein Problem dazu :)

    So, da bin ich mal wieder.

    Ich habe nun mehrer Anläufe meines ersten Spiels hinter mir und bin nun bei meiner neuen "Version" (ging hauptsächlich um den Grafikstil).

    Ich habe mich nun für die Iso-Perspektive entschieden, da mir diese ziemlich zusagt und auch passend zu meinen Ideen ist. Beginnen tu ich immer mit einem Raum, in welchem ich ein paar Grundgrafiken, Platzhalter usw. einsetze. Dieser raum dient hauptsächlich um Dinge auszuprobieren, also eine Art Tech-Room :)

    Nun zum eigentlichen Problem:



    Das Bild zeigt den besagten Raum, nicht über die Grafik lästern... bin ein Grafik-Legasteniker :)
    Die Wände stehen, die Dephpts sind eingestellt, Collisionen eingebaut und sogar meine erste Tür ist drin. Da ich bei der Tür experimentiert habe ob mein transparentes Fensterchen der Tür vom png auch in den Sprite/Objekt übernommen wird, ist es mir direkt aufgefallen. Wie Ihr seht, der Player steht in einer Ecke. Die obere Wand passt soweit, aber der Player "steht" quasi vor der linken Wand, obwohl er dahinter sein sollte.

    Durch die SuFu habe ich gelesen das man die Tiefe des Players per Script ändern kann wenn er sich in Reichweite eines Objektes befindet und könnte somit tatsächlich hinter der Wand stehen. Mein Problem ist, das ich lieber eine Zwischenlösung hätte. Das er hinter der Wand steht ist in Ordnung aber der Spieler ist dadurch gar nicht mehr zu sehen. Gibt es eine Möglichkeit, die Transparenz von Objekten/Sprites direkt zu ändern wenn der Spieler in der nähe ist? Die Wände sollen nicht komplett verschwinden sondern, sagen wir zu 50% transparent sein. Man soll den Spieler sehen können aber auch wissen, das man hinter einer Wand steht.

    Wichtig zu erwähnen ist vieleicht noch, dass die Wände aus mehreren gleichen Objekten bestehen. Wenn also an einem Wandobjekt etwas geändert wird, ändern sich ca. 1/3 aller Wände des Raumes/Gebäudes.

    Ich bin für Ideen offen und Danke schon mal im vorraus für die Unterstützung. :)

    VG

    Knorke
  • Also die Transparenz bekommst du mit distance_to_object() hin. Wenn diese in einem bestimmten Bereich ist, dann draw_set_alpha = xy .

    zB

    GML-Quellcode

    1. if distance_to_object(obj_player) <= 64
    2. {
    3. draw_set_alpha = distance_to_objekt(obj_player)/64;//je näher er der Wand ist desto durchsichtiger wird diese
    4. }


    Das mit der Depth bekommst du so hin, das jedes relevante objekt eine depth von y bekommt und der Spieler von y-1, es kann sein, dass dann der Spieler auch unter die oberen Wände geht, aber das kommt auf den Origin an. Aber so steht er dann entweder hinter dem Tisch oder vor dem Tisch.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Danke für die schnelle Antwort.

    Ich habe nun erstmal das mit der Transparenz probiert und erhielt eine Fehlermeldung. Nach ein wenig rumprobieren habe ich nun folgenden Code in mein Wandobjekt gesetzt:

    GML-Quellcode

    1. if distance_to_object (obj_player) <= 64
    2. {
    3. draw_set_alpha (distance_to_object (obj_player)/64);
    4. }


    Das funktioniert soweit, allerdings etwas zu gut. Der ganze Raum wird transparent bis er im nichts verschwindet, samt Player :)
    Habe ich mit der Änderung irgendetwas ausgelöst?

    Das mit dem depth schaue ich mir nachher an, ich sollte vielleicht doch erstmal schlafen gehen und morgen frisch ans Werk gehen :)

    VG

    Knorke
  • Hoppla, ja ich bin auch müde XD ich hatte mich verschrieben, mit objekt statt object. Und vergessen zu erwähnen, dass alpha dann auch wieder auf 1 zurückgesetzt werden muss, damit der Rest der Sprites normal gezeichnet wird.
    Also du musst nur am Ende des Draw Events der Wand draw_set_alpha = 1, schreiben :)

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Du könntest auch alle Objekte welche sich transparent verhalten sollen auf ein Surface zwischenzeichnen lassen und auf diesem dann um den Spieler herum wie einen Lichtschein ein entsprechendes Sprite subtrahieren lassen. Somit würde nicht immer das ganze Objekt seine Transparentz verändern und es würde Professioneller aussehen.

    Aber das ist nur ein Gedankenanstos.

    MfG BoS
  • Ich bin scheinbar irgendwie zu blöd dafür. Ich habe jetzt mehrere Sachen probiert, YT-Videos angesehen und gefühlte 50 Foreneinträge aus verschiedenen Quellen durchgelesen aber der Knoten scheint bei mir einfach nicht zu platzen. Alle Versuche liefen schief, weder bekomme ich das mit der Transparenz hin noch die Tiefeneinstellung (was ja laut Videos und Forenbeiträge ganz einfach sein sollte aber bei mir nicht funktionieren will). Nachdem ich sogar in holländischen Foren gelesen habe (ich spreche diese Sprache nicht einmal) bin ich bereits soweit dass mir die Transparenz der Wände egal ist, mir würde die Tiefen-Einstellung bereits reichen.

    Falls jemand die Zeit hat sich meine Projekt-Datei mal anzusehen und diesen Codeschnipsel einfügen könnte, wäre das sehr hilfreich. Ich bin echt am verzweifeln und fühle mich doch schon recht dumm, dass ich mehrere Stunden brauche um ein paar Zeichen Code einzugeben und es am Ende doch nicht hinbekomme.
    Dateien
    • IsoClou.gmz

      (915,13 kB, 267 mal heruntergeladen, zuletzt: )
  • Hallo, ich habs mir mal angesehen und bin folgender maßen herran gegangen:

    Im echten leben verhält es sich ja so, dass wenn man vor einem Objekt steht(also die y Koordinate geringer ist als die vom Objekt), verdeckt man das Objekt, und umgekehrt. Ich habe versucht das im Game Maker umzusetzen.
    In den Create Events der Wände habe ich jetzt die Tiefe davon abhänig gemacht, an welcher Stelle sie im Raum stehen. Da sich die Wände nicht bewegen, steht das im Create Event und wird nichtmehr verändert. Die Tiefe des Players hängt jetzt ebenfalls davon ab, wo er sich im Raum befindet, da er sich jedoch bewegt wird dies im Step Event ausgeführt und immer aktualisiert.

    Es funktioniert nur in sofern nicht, dass an den übergängen zwischen den Wänden diese Methode nicht wie gewollt funktioniert, da die Wände zu lang sind.
    Ich denke wenn du die Wandsegmente drastisch verkürzen würdest, müsste die Methode von mir funktionieren. Nachteil ist jedoch, das du haufenweise mehr Wände im Raum platzieren müsstest.
    Vieleicht konnte ich ein wenig helfen.

    mfg Midrael
    Dateien
    • IsoClou_v2.gmz

      (905,06 kB, 291 mal heruntergeladen, zuletzt: )
  • Hier mal eine Idee:
    ich benutze bei meinem Spiel die zeile

    Quellcode

    1. depth=y*-1

    in jedem Object bei :event_create:
    und beim Player oder einer sich bewegenden Figur bei :event_step:

    ich benutze zwar keine iso Grafiken sondern einfache rpg Ansichten aber es sollte funktionieren
    dafür müsstest du den Boden und die Wände einzeln anlegen also den boden z.B. als Tileset im Raum Hintergrund und die Wände als Objekt
    wenn alle Wände eines raumes ein Sprite sind dann sollte die Origin der Sprite zentriert sein und die der Figur auch dann müste es mit dem "dahinter stehen" Funktionieren.
  • Dieses Problem hatte ich bei mehreren Isometrischen Spielen auch schon,

    die meiner Meinung nach einfachste und effektivste lösung ist mit Tiles zu arbeiten,...

    Sprich du erstellst dir 2 Tilesets mit unterschiedlichen farben und formen und unterschiedlichem Depth und platzierst diese hinter und vor dem object,... falls es dir im editor zu schwer geht kannst auch das jeweilige object diese erstellen lassen, is halt en bissle tüfftelei, funktioniert aber sehr gut.
    Anschließend fragst du mittels der Funktion

    GML-Quellcode

    1. if tile_layer_find(10000,x,y) //Das Tileset welches hinter der Mauer liegt
    2. depth = depth +100
    3. else if tile_layer_find(10001,x,y) //Das Tileset welches vor der Mauer liegt
    4. depth = depth -100
    5. if tile_layer_find(10002,x,y) //Das Tileset welches die Kollision mit der Mauer darstellt
    6. speed = 0


    Ab welches tileset sich unter der Position des Players befindet, und änderst jenachdem die depth,... außerdem kannst du so auch noch en Collisionstile erstellen welches unter dem sprite liegt und somit verhindert das der Spieler durch die Mauer laufen kann. Zudem könntest du dadurch auch dein Transparent problem lösen,... sprich wenn der Spieler auf dem Tile steht einfach die Transparent des nahesten objects ändern

    Die Tiles kannst du beim spielen dann einfach ausblenden somit sieht der Spieler sie net, zum DEBUGEN aber einfach einblenden, was sehr nützlich ist.

    Das ganze funktioniert mit Statischen Maps natürlich am besten weil man sich so einfach alle möglichen Formen die man braucht erstellen kann und sie anschließend im Lvl editor platziert. Bei dynamischen oder zufalls generierten Maps ist das ganze zwar auch möglich aber teilweise sehr aufwendig!!!

    Hab dir en Beispiel Bild angehängt damit du es besser sehen kannst,... hab das selbst in nehm Game von mir verwendet und es funktioniert ausgezeichnet

    Falls noch fragen hast, schreib mir einfach ne PN
    Grüßle Blayde
    Bilder
    • isometric Tilelayer.png

      27,36 kB, 596×500, 261 mal angesehen

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