Nicht vollständige Transparenz einen Objekts

  • Nicht vollständige Transparenz einen Objekts

    Also:
    Ich habe ein Spiel aus der isometrischen Perspektive.
    Wenn meine Spielfigur hinter einer Wand (oder einem anderen Hindernis) steht, soll dieses Objekt in einem bestimmten Umkreis um die Spielfigur transparent werden. D.h. dass nicht das gesamte Wand-Objekt verschwindet, sondern nur ein kleiner Bereich.

    Wie in diesem Bild aus Fallout 2.

    Wie kriege ich so etwas hin?
  • Surfaces und Blendmodes, wie genau weiss ich nicht aber Schau mal im Tutorial Archiv, da gibt es ne Lightengine, auf dieser Basis könnte man es rein theoretisch machen.

    Ich denke das Funktioniert irgendwie so, indem du die vordere Ebene auf eine Surface bannst und dann einen sprite mit Alpha-Kanal (Weiss zu Schwarz-Farbverlauf) auf diese Surface mit bm_subtract malst... oda ähnlich.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Ich glaube man kann das mit depth lösen, so hatte ich es mal gemacht wenn meine Figur hinter einem Baum war
    im "step end event" muss erstmal stehn "depth=-y" somit ist das objekt was weiter oben(hinten) ist automatisch auch hinter dem gezeichentem objekt. Also wird es dahinter gezeichent. Wann jetzt eine Wand Transparent werden soll müstest du im "step ivent vollgendes schreiben

    GML-Quellcode

    1. //Objekt Wand step Event
    2. if depth>obj_player.depth then
    3. {
    4. draw_set_alpha(0.5)
    5. }
    6. else
    7. draw_set_alpah(1)
    8. //Das sagt aus wenn die wand da vor ist soll sie 50% Durchsichtig sein

    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • x-sascha schrieb:

    Ich glaube man kann das mit depth lösen, so hatte ich es mal gemacht wenn meine Figur hinter einem Baum war
    im "step end event" muss erstmal stehn "depth=-y" somit ist das objekt was weiter oben(hinten) ist automatisch auch hinter dem gezeichentem objekt. Also wird es dahinter gezeichent. Wann jetzt eine Wand Transparent werden soll müstest du im "step ivent vollgendes schreiben

    GML-Quellcode

    1. //Objekt Wand step Event
    2. if depth>obj_player.depth then
    3. {
    4. draw_set_alpha(0.5)
    5. }
    6. else
    7. draw_set_alpah(1)
    8. //Das sagt aus wenn die wand da vor ist soll sie 50% Durchsichtig sein

    Dazu müsste jede Wand ein Objekt sein und würde zudem komplett durchsichtig werden, nicht nur der Teil wo der Charakter hinter ist. Die Idee funktioniert sonst aber auch denke ich.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Davon geh ich aus (wand)

    da ich auch mal sowas gemacht habe geh ich davon aus das jede Wand ein objekt ist da Wänd per Tileset je keine bedeutung hätten für den player. Tileset ist ja nur der untergrund. Quasi wie in der Paralel iso Demo von Gamemaker.nl das ding mit der Blauen Kugel. Man setzt ja das level dann aus den objekten bzw Wänden zusammen.
    Da über den depth wert sowas gemacht wird kann man das ja als postitons bestimmung benutzten.
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • RE: Davon geh ich aus (wand)

    x-sascha schrieb:

    da ich auch mal sowas gemacht habe geh ich davon aus das jede Wand ein objekt ist da Wänd per Tileset je keine bedeutung hätten für den player. Tileset ist ja nur der untergrund. Quasi wie in der Paralel iso Demo von Gamemaker.nl das ding mit der Blauen Kugel. Man setzt ja das level dann aus den objekten bzw Wänden zusammen.
    Da über den depth wert sowas gemacht wird kann man das ja als postitons bestimmung benutzten.
    Da die Wände, ausser dem Tranzparent werden keinerlei Funktion für den Player haben sollen (man kann ja hinter ihnen lang), kann man es auch mit Background bzw eher Foreground und Tilesetzs mit negativ depth machen.

    Und halt mit surfaces, ich denke das geht ganz gut, ich bin nur selber nicht so bewandert mit surfaces.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Dürfte schon gehen.... nur wirst du vermutlich ne Weile verzweifelt an diesen Surfaces und Blend Modes rummurksen, bis du zu nem anständigen Resultat kommst... so gings zumindest mir und einigen anderen, als sie sich mit diesem Thema beschäftigt haben =O
    Viel Glück =)
    "das war meine letzte flamewar PM an dich ."
  • Dazu sollte mal jemand ein Tutorial schreiben. Das wär sicher sehr gefragt.

    Falls jetzt jemand kommen will und sagt "Mach du doch!" sag ich nur "Nein" denn 1. würde keiner meine Tutorials lesen, weil mein Schriftstil fürn Ar*** ist, 2. Schreibe ich ungerne längere Texte, 3. Wäre mir dieses Thema zu aufwendig (Ja ich bin faul.)

    Vielleicht liegt ja schon bei irgendwem ein Tut für dieses Thema, wäre nett wenn jemand der eins hat es vielleicht bekanntgeben würde.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Hab ne Idee:
    Wenn eine Sprite-Kollision mit dem Player stattfindet, dann wird wie schon oben beschrieben der depth-Wert dem z-Wert angepasst.
    Wenn dieser nun höher als der vom Player ist, also der Player hinter dem Objekt steht, dann wird das Objekt-Sprite 2mal gezeichnet:
    Einmal ganz normal, aber mit höherer depth als der des Players. Das zweite mal mit einem Alpha-Wert unter 1(zb 0.5), also transparent, diesmal aber mit niedrigerer depth, also überzeichnet das SPrite den Player. Resultat: Der Player ist hinter einem Objekt nur halb-sichtbar. Immerhin etwas und leicht umzusetzen ;)
    "das war meine letzte flamewar PM an dich ."
  • Danke blubberblub, so müsste es eigentlich funktionieren.
    Jetzt hab ich aber noch ein Problem: Wie prüfe ich, ob der player mit dem Sprite des Wand-Objekts kollidiert? Mit einem normalen Collision-Event funktioniert das nämlich nicht, weil meine Wand eine Mask hat, die kleiner als das sichtbare Sprite ist (der Boden der Wand).

    Edit: Mein eigentliches Problem ist ein anderes:
    Spoiler anzeigen

    Ich möchte, sobald mein Player ein Gebäude betritt, dass das Dach verschwindet und zusätzlich Mauern bis fast auf den Grundriss verschwinden, damit sie den Player dahinter nicht mehr verdecken können (wie zB in Sacred 1). Das kann man aber nur erreichen, wenn man für jedes Gebäude einen eigenen Sprite anfertigt. Mit einem Baukastensystem (mehrere Wand-Objekte, die man dann im Room-Editor zusammenstückelt) lässt sich sowas nicht lösen, da der Gamemaker ja nicht weiß, wann sich der Player innerhalb des Gebäudes befinden und wann nicht. Sowas wär nur mit einem sehr komplizierten Code machbar, der dann auch nicht universal anwendbar waäre... :rolleyes:
    Deshalb hab ich nach einer Alternativlösung gesucht, und fand, dass das ganze in Fallout (2) sehr gut gelöst wurde.

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

  • Mach einen extra Room für das Haus? ansonsten könntest du in jedes Haus ein Objekt setzen, was eine Mask entsprechend der Grundfläche des Hauses hat und die Wände verändern, wenn du damit eine Collision hast.

    Sollte so klappen denke ich ;)
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet