Pixelfarbwerte aus einem Sprite auslesen und ändern, aka "Palette Swap"

  • GM 8

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

  • Pixelfarbwerte aus einem Sprite auslesen und ändern, aka "Palette Swap"

    Ein einfaches Beispiel: Angenommen ich habe in meinem GM Projekt ein Sprite mit den Maßen 2x2 (wie unten abgebildet) und möchte mir im Spiel daraus einen zweiten Sprite generieren, wobei die zwei roten Pixel grün umgefärbt werden sollen. Wie würde das gehen?

  • Du könntest es mit

    GML-Quellcode

    1. image_blend=c_green;
    umfärben in deinem Beispiel funktioniert es da weiße Stellen nicht gefärbt werden(soweit ich weiß), nur Färbt diese Funktion das Gesamte Sprite Grün und nicht nur einen bestimmten Bereich davon.

    MFG DragonXZ
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.
  • Du kannst das Sprite in einen Surface zeichnen und mit surface_getpixel die Farben auslesen, aber Achtung die Funktion ist sehr langsam, dann kannst du mit draw_point und draw_set_color auf das Surface den Pixel malen und dann aus dem Surface wieder ein Sprite machen.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • henrik1235 schrieb:

    Du kannst das Sprite in einen Surface zeichnen und mit surface_getpixel die Farben auslesen, aber Achtung die Funktion ist sehr langsam, dann kannst du mit draw_point und draw_set_color auf das Surface den Pixel malen und dann aus dem Surface wieder ein Sprite machen.

    Das klingt perfekt, danke dir. Damit werde ich mich näher befassen. Gibt es aber auch eine Möglichkeit, den Alpha-Wert eines Pixels herauszubekommen?

    Larsi schrieb:

    Würde es nicht auch eventuell gehen einfach 4 Quadrate zu drawen?

    Im Endeffekt geht es mir darum, normale Sprites mithilfe dieser Methode umzufärben.
  • *bump*
    Hab hier mal ein Palette Swap Script geschrieben, findet ihr als Anlage: paletteswap.zip. Die Methode braucht viel länger, als ich gedacht habe, nämlich wirklich viel zu lang, alleine schon bei nur einem kleinen Sprite. Schade.

    Andererseits hab ich auch von der Möglichkeit gehört, die Pixel eines sich auf der Festplatte befindliches Bild auszulesen und zu ändern, was viel schneller gehen soll. Wer sich dafür interessiert, kann sich die zweite Datei ansehen, die ich irgendwo gefunden hab: metroid palette swap.zip.
  • Falls es nur um bestimmte Bereiche des Bildes geht, die den gleichen Farbwert in verschiedener Helligkeit haben sollen (wie zum Beispiel Einheiten in einem Strategiespiel, die entsprechend ihrer Fraktion eingefärbt werden), kann man diese Bereiche auch vorher aus dem Bild ausschneiden, entfärben, aufhellen und später im Spiel zusätzlich mit angepasstem image_blend zeichnen.

    Bescheuertes schnell gepixeltes Beispielbild:


    GML-Quellcode

    1. // draw event (blau eingefärbt)
    2. draw_sprite_ext( base_sprite, image_index, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha );
    3. draw_sprite_ext( colorized_sprite, image_index, x, y, image_xscale, image_yscale, image_angle, c_blue, image_alpha );
    Einige meiner Spiele:
  • Hört sich doch noch überschaubar an...
    In Grafikprogrammen kannst du dir recht einfach alle Pixel einer bestimmten Farbe geben lassen und die auf eine neue Ebene extrahieren. Dann Farbe raus, Helligkeit anpassen und fertig.
    Einige meiner Spiele:
  • Der Game Maker hat leider keine gute Schnittstelle zwischen Grafiken und Matrizen. Mein persönlicher Traum wäre ja ein ds_grid_create_from_sprite, ds_grid_create_from_screen, (...) und ds_grid_draw.

    Ansonsten wie interceptor schon sagte: Extrahiere jeden Farbkanal als eigene Ebene und speichere diese alle als eigene Sprites ab (nur weiße Farbe). Diese lässt du immer automatisch übereinander zeichnen und färbst sie jeweils mit image_blend ein. Das bedeutet zwar auch jede Menge Overhead, aber wenigstens ist der Game Maker schnell darin Sprites zu zeichnen und schwarz/weiß-Sprites nehmen auch nicht furchtbar viel Platz weg.