2016-07-05 63 views
1

使用一个名为LayeredAssetsBitmapTextureAtlasSource的类(你可以看看这里:http://pastebin.com/vgfT1U5j)我目前正在堆叠多个PNG图像组成的角色块成一个图集并从零件中制作角色精灵。对于那些除了那个部分(例如裤子)以外的所有部分都是透明的,我有我的精灵表。我为角色的所有部分制作了多个不同颜色的spritesheet:裤子,鞋子,衬衫,手套,头部,帽子,剑。 LayeredAssetsBitmapTextureAtlasSource可以让我将它们夹在一起放入相同的地图集中,并从中制作一个AnimatedSprite。AndEngine:我如何改变纹理的颜色之前,它是一个实体的一部分

我更新了角色服装的颜色,因为通过重新创建过程找到了新物品。

我现在想要做的就是在编程前将这些部件的颜色改变为图集之前的颜色,这样我的物品多样性就可以上升,但我不必花那么多钱在GIMP中对所有东西进行着色......另外,在PNG中保存了大量的颜色变化,大大增加了我的apk大小。我想用白色做这些部分,并且在飞行中对它们进行着色。

我能够使用Entity.setColor着色整个精灵,但我似乎无法找到实际完成此操作的重写方法。它看起来只是设置了其他地方使用的颜色值。因此,逆向工程解决方案迄今为止失败了。

我不确定着色器会从我读过的内容中工作,但我可能是错的。我相信我需要复制图像并着色,然后在图集中使用该副本,但我不知道如何开始这样做。

任何人有任何想法?在此先感谢您的帮助

回答

0

想出来......答案是在LayeredAssetsBitmapTextureAtlasSource的Canvas上使用Paint和ColorFilter。

对于整个类文件,看看这里http://pastebin.com/0wXUbLmk

对于相关的变化,看看下面

@覆盖 公共位图onLoadBitmap(最终配置pBitmapConfig) { 最终图图像= BitmapFromAsset(mContext, BitmapTextureAtlasTextureRegionFactory.getAssetBasePath()+ this.mBaseAssetPath); // mBaseAssetPath); if(image == null) return 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; 

}