Halli-Hallöchen liebe Gm-D Community,
nach drei Jahren bin ich wieder hier aktive, nachdem ich GameMaker-Studio doch tatsächlich bei Steam entdeckt habe. Leider bin ich etwas eingerostet und muss erstmal meine alten Hirnzellen aus den Kühlfach hohlen die mein gesamtes GML-Wissen beinhalten.
Der Stand der Dinge:
Ich habe ein Charakter, der aus einzelnen Sprites besteht (Körper, Arme, Kopf...), damit ich diese einzel animieren kann. Das klappt im Draw-Event auch super, aber ich habe vor auf diesen Charakter 'pseudo Shader' anzuwenden, sprich mal ist er fast durchsichtig, Farben werden negiert, Schatten, usw. Darum wollte ich diesen in ein Surface im Step-Event zeichnen.
Das Problem:
Die Sprites sind an den Kanten geglättet, sprich der Alpha wert nimmt ab. Zeichne ich jetzt zwei Sprites übereinander, so gibt es hässliche Kanten:

Achtet auf die weißen Linien übern den Beinen. Das Bild ist an dieser Stelle Transparent und zeigt lediglich den Hintergrund.
Warum passiert das:
Der GameMaker legt die Bilder übereinander, indem er Pixel für Pixel des Surfaces mit den überlappenden Bild ersetzt. Allerdings wird auch der Alpha-Wert ersetzt, auch wenn der neue Wert wesentlich kleiner ist als der alte. So ist die Unterlage auf 100% Alpha und das überlappende Bild an dieser Stelle nur 10%, weil es zum Beispiel eine Kante ist. Jetzt ist das Surface selbst an dieser Stelle auch auf 10% Alpha, statt diesen Wert zu 'addieren' und auf 100% Alpha zu bleiben.
Der Hauptlayer (im Draw-Event) besitzt kein Alpha-Kanal und jeder Pixel hat eine 100%tigen Alpha-Wert, darum klappt es ohne Surface problemlos. Den Alpha Kanal brauch ich aber, da ein schwarzer Kasten um den Spieler ziemlich witzlos ist.
Was ist die Lösung?
Man muss sicher den BlendMode einstellen, so dass er Farben ersetzt (bm_normal), aber den Alpha wert addiert, oder zumindest immer das Maximum nimmt. Leider hab ich damit nicht wirklich Erfahrung und stumpfsinniges herumprobieren bringt mich nicht zum Ziel. Hier im Forum und in der GMC hab ich nur Lösungen gefunden, die ein Problem mit draw_set_alpha() betreffen, diese haben leider nicht funktioniert.
Die Bilder haben wirklich an den Ecken einen Alpha-Wert und sind auch richtig importiert. Das ist ja seit GM-8 auch endlich möglich.
Ich benutze Studio Pro mit dem Windows-Exporter.
Neulich im Step-Event:
Spoiler anzeigen
Alles anzeigen
*Ich zeig ganz bewusst nur die Füße, weil das Gesicht momentan so hässlich aussieht, dass der Spieler absichtlich sterben würde um den Charakter zu erlösen.
nach drei Jahren bin ich wieder hier aktive, nachdem ich GameMaker-Studio doch tatsächlich bei Steam entdeckt habe. Leider bin ich etwas eingerostet und muss erstmal meine alten Hirnzellen aus den Kühlfach hohlen die mein gesamtes GML-Wissen beinhalten.
Der Stand der Dinge:
Ich habe ein Charakter, der aus einzelnen Sprites besteht (Körper, Arme, Kopf...), damit ich diese einzel animieren kann. Das klappt im Draw-Event auch super, aber ich habe vor auf diesen Charakter 'pseudo Shader' anzuwenden, sprich mal ist er fast durchsichtig, Farben werden negiert, Schatten, usw. Darum wollte ich diesen in ein Surface im Step-Event zeichnen.
Das Problem:
Die Sprites sind an den Kanten geglättet, sprich der Alpha wert nimmt ab. Zeichne ich jetzt zwei Sprites übereinander, so gibt es hässliche Kanten:
Achtet auf die weißen Linien übern den Beinen. Das Bild ist an dieser Stelle Transparent und zeigt lediglich den Hintergrund.
Warum passiert das:
Der GameMaker legt die Bilder übereinander, indem er Pixel für Pixel des Surfaces mit den überlappenden Bild ersetzt. Allerdings wird auch der Alpha-Wert ersetzt, auch wenn der neue Wert wesentlich kleiner ist als der alte. So ist die Unterlage auf 100% Alpha und das überlappende Bild an dieser Stelle nur 10%, weil es zum Beispiel eine Kante ist. Jetzt ist das Surface selbst an dieser Stelle auch auf 10% Alpha, statt diesen Wert zu 'addieren' und auf 100% Alpha zu bleiben.
Der Hauptlayer (im Draw-Event) besitzt kein Alpha-Kanal und jeder Pixel hat eine 100%tigen Alpha-Wert, darum klappt es ohne Surface problemlos. Den Alpha Kanal brauch ich aber, da ein schwarzer Kasten um den Spieler ziemlich witzlos ist.
Was ist die Lösung?
Man muss sicher den BlendMode einstellen, so dass er Farben ersetzt (bm_normal), aber den Alpha wert addiert, oder zumindest immer das Maximum nimmt. Leider hab ich damit nicht wirklich Erfahrung und stumpfsinniges herumprobieren bringt mich nicht zum Ziel. Hier im Forum und in der GMC hab ich nur Lösungen gefunden, die ein Problem mit draw_set_alpha() betreffen, diese haben leider nicht funktioniert.
Die Bilder haben wirklich an den Ecken einen Alpha-Wert und sind auch richtig importiert. Das ist ja seit GM-8 auch endlich möglich.
Ich benutze Studio Pro mit dem Windows-Exporter.
Neulich im Step-Event:
GML-Quellcode
- // Auf surface zeichnen
- surface_set_target(surface);
- // Hintergrund leeren
- draw_clear_alpha(c_black, 0);
- // Hinteren Fuß
- draw_sprite_ext(sprFeedL, 0, feedX, feedY, 1, 1, bodyRot + feedLRot, c_white, 1);
- // Hinteren Arm
- draw_sprite_ext(sprHandL, 0, handX, handY, 1, 1, bodyRot + handLRot, c_white, 1);
- // Körper
- draw_sprite_ext(sprBody, 0, bodyX, bodyY, 1, 1, bodyRot, c_white, 1);
- // Kopf
- if (eyeClose < 0)
- draw_sprite_ext(sprHeadEyeClose, 0, headX, headY, 1, 1, bodyRot + headRot, c_white, 1);
- else
- draw_sprite_ext(sprHead, 0, headX, headY, 1, 1, bodyRot + headRot, c_white, 1);
- // Vordere Hand
- draw_sprite_ext(sprHandR, 0, handX, handY, 1, 1, bodyRot + handRRot, c_white, 1);
- // Vorderen Fuß
- draw_sprite_ext(sprFeedR, 0, feedX, feedY, 1, 1, bodyRot + feedRRot, c_white, 1);
- surface_reset_target();
*Ich zeig ganz bewusst nur die Füße, weil das Gesicht momentan so hässlich aussieht, dass der Spieler absichtlich sterben würde um den Charakter zu erlösen.
„Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher.“
Albert Einstein
Albert Einstein