2016-07-05 30 views
1

Mit einer Klasse namens LayeredAssetsBitmapTextureAtlasSource (die Sie hier sehen können: http://pastebin.com/vgfT1U5j) staple ich derzeit mehrere PNG-Bilder aus Charakterstücken in einem Atlas und machen ein Zeichen Sprite aus Teilen. Ich habe meine Sprite-Blätter für jene Teile gemacht, wo alles außer diesem Teil (zB Hosen) transparent ist. Ich habe mehrere verschiedenfarbige Spritesheets für alle Teile des Charakters gemacht: Hosen, Schuhe, Hemd, Handschuhe, Kopf, Hut, Schwert. Mit LayeredAssetsBitmapTextureAtlasSource kann ich sie in denselben Atlas zusammenfügen und daraus einen AnimatedSprite erstellen.AndEngine: Wie ändere ich die Farbe einer Textur, BEVOR sie Teil einer Entity ist

Ich aktualisiere die Farben des Kostüms des Charakters, wenn neue Gegenstände gefunden werden, indem der Prozess neu erstellt wird.

Was ich jetzt tun möchte, ist, die Farben dieser Teile programmatisch zu ändern, bevor sie in den Atlas gelegt werden, so dass meine Artikelvielfalt viel höher gehen kann, aber ich muss nicht so viel ausgeben Zeit in GIMP alles zu färben ... auch, Tonnen von Farbvariationen in PNG gespeichert zu haben, erhöht meine apk Größe. Ich würde gerne die Teile in Weiß machen und sie im Flug kolorieren.

Ich kann Entity.setColor verwenden, um ganze Sprites zu färben, aber ich kann nicht finden, die überschriebene Methode, die dies tatsächlich erreicht. Es sieht so aus, als ob es nur einen Farbwert setzt, der an anderer Stelle verwendet wird. Also ist das Reverse-Engineering einer Lösung bisher fehlgeschlagen.

Ich bin nicht sicher, dass Shadern funktionieren wird von dem, was ich gelesen habe, aber ich könnte falsch liegen. Ich glaube, ich muss eine Kopie des Bildes machen und es kolorieren und dann diese Kopie im Atlas verwenden, aber ich weiß nicht, wie ich damit anfangen soll.

Wer hat irgendwelche Ideen? Vielen Dank im Voraus für jede Hilfe

Antwort

0

Es herausgefunden .... Die Antwort war, Paint und ColorFilter im Canvas in der LayeredAssetsBitmapTextureAtlasSource zu verwenden.

für die ganze Klasse-Datei, hier http://pastebin.com/0wXUbLmk

Für die relevanten Änderungen, schauen unten

@Override public Bitmap onLoadBitmap (final Config pBitmapConfig) { endgültige Bitmap image = BitmapFromAsset (mContext, BitmapTextureAtlasTextureRegionFactory.getAssetBasePath() + this.mBaseAssetPath); // mBaseAssetPath); if (image == null) Rückgabewert null;

final Bitmap bitmap = Bitmap.createBitmap(mTextureWidth, mTextureHeight, Bitmap.Config.ARGB_8888); 
    final Canvas canvas = new Canvas(bitmap); 
    canvas.drawBitmap(image, 0f, 0f, null); 
    for (int i = 0; i < mAssetLayers.size(); i++) 
    { 
     Paint p = new Paint(); 
     int color = Color.rgb(100,100,2); 
     ColorFilter filter = new LightingColorFilter(color, 0); 
     p.setColorFilter(filter); 


    final AssetLayer al = mAssetLayers.get(i); 
    final Bitmap layer = BitmapFromAsset(mContext, BitmapTextureAtlasTextureRegionFactory.getAssetBasePath() + al.mAssetPath); 
    canvas.drawBitmap(layer, al.mXOffset, al.mYOffset, p); 
    } 
    return bitmap; 

}