# Java Game Pixel "einfärben"



## BraunBerry (13. Aug 2016)

Hallo Community,

in meinem Java-Spiel möchte ich eine Charaktererstellung hinzufügen ähnlich wie im Spiel "Starbound". Es soll 3 grundlegende Teile geben (Haare, Shirt, Hose) welche auf den Standardcharakter draufgelegt werden. Ich habe versucht mir ein System zu überlegen, bei dem ich möglichst wenig Dateien brauche und hatte eine Idee: Zum Beispiel die Frisur würde ich in Schwarz-Weiß malen, also mit verschiedenen Graustufen, und dann später im Programm mit einer Farbe "einfärben". Wichtig Dabei ist, dass nicht die transparenten Pixel der .png Datei gefärbt werden. Bei der Kleidung hatte ich die Idee, ein Grundbild zu malen, dessen Farben nicht verändert werden können und ein "Highlight"-Bild anzulegen, auf dem nur die Pixel zusehen sind, welche eingefärbt werden dürfen. Diese Bilder würden dann übereinandergelegt. In Minecraft wird so eine Technik bei der Textur der Spawneier verwendet. Ich wäre euch sehr verbunden, wenn ihr mir erklären könntet, wie man alle undurchstichtigen Pixel eines Schwarz-Weiß Bildes in Java mit einer Farbe bemalt.

Danke im Voraus 

lg BraunBerry


----------



## Viktim (15. Aug 2016)

Zu deiner Frage, wie man die Farbe ändert:
Ich hab da mal eine Methode geschrieben

```
public static BufferedImage aendereBild(BufferedImage image, Color neueFarbe) {
    for (int i = 0; i < image.getWidth(); i++) {
      for (int j = 0; j < image.getHeight(); j++) {
        Color pixelfarbe = new Color(image.getRGB(i, j), true);
        int rgb = new Color(neueFarbe.getRed(), neueFarbe.getGreen(), neueFarbe.getBlue(), pixelfarbe.getAlpha())
            .getRGB();
        image.setRGB(i, j, rgb);
      }
    }
    return image;
  }
```

Du must bloß aufpassen, dass der Farbtyp des Bilds  RGB und nicht graustufen ist.


----------



## Jardcore (15. Aug 2016)

Wenn du das ganze ernsthaft machen möchtest würde ich vorschlagen einen Shader zu schreiben. Alles andere hat einfach nur eine schlechte Performance.
Grundsätzlich ist dein Ansatz richtig. Nur dieser kann verbessert werden:


BraunBerry hat gesagt.:


> Bei der Kleidung hatte ich die Idee, ein Grundbild zu malen, dessen Farben nicht verändert werden können und ein "Highlight"-Bild anzulegen[...]


Hier solltest du eine extra Farbe wählen, die 'geHighlightet' wird. Pink oder andere abnormale Farben XD
Mit einem HSV Filter kannst du dann die Farbe herausfiltern und mit einem Shader färben.

Vielleicht guckst du dir mal das Framework LibGDX an. Dort kannst du einfache GLSL Shader benutzen.
https://libgdx.badlogicgames.com/
https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson1


----------



## Major_Sauce (29. Aug 2016)

@Jardcore da hast du zwar nicht ganz unrecht, aber nötig sind Shader auch nicht unbedingt.
Ich habe nichts von einer Engine oder ähnlichem gelesen, die er verwendet, daher gehe ich davon aus dass er es mit AWT oder Swing macht. In dem Fall wird es mit einem Shader ein wenig knifflig. Mein Tipp dazu:
Du wirst wohl mit BufferedImages oder ähnlichem arbeiten, da der Charakter mit der Kleidung und allem sowieso (fast) immer zu sehen ist, kannst du natürlich einfach nur bilder mit Graustufen benutzen.
Dann musst du eigentlich nur mit einer oder zwei for-loops durch die Pixel des Bildes und dir die Farben anschauen, da gibt es mehrere Möglichkeiten, einfach mal nach "BufferedImage pixel manipulation" suchen und unser lieber freund Goockel wird dir dann bestimmt ein paar Beispiele zeigen.
Shader wären wahrscheinlich einfach overpowered, vor allem da du die ganze Aktion nur einmal beim Start des Spiels durchführen musst.

mfg Major


----------



## Jardcore (30. Aug 2016)

Major_Sauce hat gesagt.:


> daher gehe ich davon aus dass er es mit AWT oder Swing macht


Das wäre leider ein wenig realitätsfern. Wenn man das professionell mit Java aufziehen möchte kommt man derzeit nicht an lwjgl oder libgdx vorbei.


----------



## Major_Sauce (31. Aug 2016)

Jardcore hat gesagt.:


> Das wäre leider ein wenig realitätsfern. Wenn man das professionell mit Java aufziehen möchte kommt man derzeit nicht an lwjgl oder libgdx vorbei.


Nun ja, es kommt ganz einfach auf die Größe des Spiels an. Natürlich werde ich mit Swing nicht an GTA oder ähnliches rankommen, selbst Starbound wird da schon ziemlich schwierig, aber man kann daraus doch schon ganz nette Spiele machen (Einfach mal nen GameJam verfolgen, da basteln ziemlich verrückte Leute ziemlich schnell ganz nette Spielchen aus dem nichts)
Und ich konnte im Beitrag nichts bzgl. Engine/Bindings finden, daher...

Mfg Major


----------



## Jardcore (1. Sep 2016)

Major_Sauce hat gesagt.:


> Und ich konnte im Beitrag nichts bzgl. Engine/Bindings finden, daher...


 ... kann man nur hoffen 
Natürlich kann man mit allem Spiele entwickeln, auch mit Zettel und Stift oder nur mit seiner Vorstellungskraft. Das bezweifel ich auch nicht. Wollte nur drauf hinweisen, dass wenn man etwas wie Starbound oder Minecraft plant sollte man nicht mit AWT, Swing oder Java3D arbeiten, sondern gleich die Zeit sparen und zu ausgereiften Frameworks greifen. Das wird auch in jedem guten Tutorial, Buch oder Blog empfohlen.
Schließlich und das ist wohl das wichtigste will man hauptsächlich ein Spiel entwickeln. Deswegen sind Engines wie Unity und co. auch so bliebt.


----------

