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?
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
-
-
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. -
Ok, aber ich muss schon einzelne Pixel exakt ändern können, zB so:
-
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.
-
Würde es nicht auch eventuell gehen einfach 4 Quadrate zu drawen?Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
Nach langer zeit wieder im Forum aktiv -
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. -
Wie genau stelle ich in diesem Fall den Blend Mode ein, damit nur der Alpha Kanal gezeichnet wird?
-
*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:
-
Das wäre wohl auch eine Lösung, jedoch auf ein Spritesheet mit mehr als 30 verschiedenen Sprites unmöglich anwendbar.
-
-
Stimmt schon, aber in meinem Fall soll der Spieler die Farbpalette selbst gestalten können.
-
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. -
Man könnte auch mit einem (Pixel-)Shader hier arbeiten, ich hab nur keine Ahnung wie das mit dem Game Maker funktioniert (vielleicht gibt es ja eine DLL dazu).