在一个用Libgdx制作的游戏中,我有一个TextureAtlas,我在其中存储了所有TextureRegions用于播放器的动画.默认情况下,播放器有一个蓝色T恤(例如).
现在我希望能够拥有一个以上的玩家,每个玩家都应该拥有另一种T恤颜色.
所以基本上我想用第二个玩家用红色代替蓝色,用第三个玩家代替绿色等等.
我相信我可以用PixMap做到这一点,但是我不会失去TextureAtlas的优势吗?
还有其他可能吗?或者我需要在TextureAtlas中将每个“颜色版本”作为TextureRegion?
另一个小问题:
使用Gimp(可能还有一些其他程序),您可以使用“.gif”文件的颜色索引.
通过为文件中的每种颜色保存索引,然后使用此索引描述像素,可以减小所有纹理的大小.因此,对于每个红色像素,您将拥有“1”而不是“#FF0000”,并且文件中的某个位置有“1 =#FF0000”.
如果然后在TextureAtlas中打包带有颜色索引的“.gif”文件,那么索引是否会丢失并恢复默认的RGB颜色或会产生问题?
现在我希望能够拥有一个以上的玩家,每个玩家都应该拥有另一种T恤颜色.
所以基本上我想用第二个玩家用红色代替蓝色,用第三个玩家代替绿色等等.
我相信我可以用PixMap做到这一点,但是我不会失去TextureAtlas的优势吗?
还有其他可能吗?或者我需要在TextureAtlas中将每个“颜色版本”作为TextureRegion?
另一个小问题:
使用Gimp(可能还有一些其他程序),您可以使用“.gif”文件的颜色索引.
通过为文件中的每种颜色保存索引,然后使用此索引描述像素,可以减小所有纹理的大小.因此,对于每个红色像素,您将拥有“1”而不是“#FF0000”,并且文件中的某个位置有“1 =#FF0000”.
如果然后在TextureAtlas中打包带有颜色索引的“.gif”文件,那么索引是否会丢失并恢复默认的RGB颜色或会产生问题?
非常感谢!
解决方法
我面临着使用相同纹理生成随机颜色武器的相同问题.
所以我写了这个.
基本上我制作了你想要编辑的纹理的像素图.
然后迭代所有像素,迭代时检查某些颜色,这些颜色是纹理的一部分特定部分. (我建议使用不同的灰度,因为RGB是相同的)
然后当它在需要改变颜色的像素上时,我使用颜色选择器方法抓取那些像素组的颜色,颜色选择器方法基本上是随机的,从预制的颜色数组中获取颜色,然后将该特定像素更改为新的颜色.
/** * Requires a asset's textureName,and requires gray scale colors of the * parts * * @param texturename * @param colorBlade * @param colorEdge * @param colorAffinity * @param colorGrip * @return */ private static Texture genTexture(String texturename,int colorBlade,int colorEdge,int colorAffinity,int colorGrip,int colorExtra) { Texture tex = Game.res.getTexture(texturename); TextureData textureData = tex.getTextureData(); textureData.prepare(); Color tintBlade = chooseColor(mainColors); Color tintEdge = new Color(tintBlade.r + 0.1f,tintBlade.g + 0.1f,tintBlade.b + 0.1f,1); Color tintAffinity = chooseColor(affinityColors); Color tintGrip; Color tintExtra = chooseColor(extraColors); boolean colorsAreSet = false; do { tintGrip = chooseColor(mainColors); if (tintAffinity != tintBlade && tintAffinity != tintGrip && tintGrip != tintBlade) { colorsAreSet = true; } } while (!colorsAreSet); Pixmap pixmap = tex.getTextureData().consumePixmap(); for (int y = 0; y < pixmap.getHeight(); y++) { for (int x = 0; x < pixmap.getWidth(); x++) { Color color = new Color(); Color.rgba8888ToColor(color,pixmap.getPixel(x,y)); int colorInt[] = getColorFromHex(color); if (colorInt[0] == colorBlade && colorInt[1] == colorBlade && colorInt[2] == colorBlade) { pixmap.setColor(tintBlade); pixmap.fillRectangle(x,y,1,1); } else if (colorInt[0] == colorEdge && colorInt[1] == colorEdge && colorInt[2] == colorEdge) { pixmap.setColor(tintEdge); pixmap.fillRectangle(x,1); } else if (colorInt[0] == colorAffinity && colorInt[1] == colorAffinity && colorInt[2] == colorAffinity) { pixmap.setColor(tintAffinity); pixmap.fillRectangle(x,1); } else if (colorInt[0] == colorGrip && colorInt[1] == colorGrip && colorInt[2] == colorGrip) { pixmap.setColor(tintGrip); pixmap.fillRectangle(x,1); } else if (colorInt[0] == colorExtra && colorInt[1] == colorExtra && colorInt[2] == colorExtra) { pixmap.setColor(tintExtra); pixmap.fillRectangle(x,1); } } } tex = new Texture(pixmap); textureData.disposePixmap(); pixmap.dispose(); return tex; }
我希望这有帮助.请不要只是复制粘贴,尝试重建它以满足您的需求,否则您将无法学到任何东西.