Java Libgdx在运行时更改纹理的颜色
在一个用libgdx制作的游戏中,我有一个Java Libgdx在运行时更改纹理的颜色,java,colors,libgdx,textures,Java,Colors,Libgdx,Textures,在一个用libgdx制作的游戏中,我有一个TextureAtlas,其中我存储了玩家动画的所有TextureRegions。默认情况下,播放器有一件蓝色T恤(例如)。现在我希望能够有一个以上的播放器,每个播放器都应该有另一种颜色的T恤。因此,基本上,我想用红色代替蓝色作为第二个播放器,用绿色代替第三个播放器,以此类推。我确信我可以用PixMap做到这一点,但我不会。因为这样我就失去了TextureAtlas(?)的优势。 还有别的办法吗?或者我是否需要将每个“颜色版本”作为纹理区域放在纹理特拉斯
TextureAtlas
,其中我存储了玩家动画的所有TextureRegion
s。默认情况下,播放器
有一件蓝色T恤(例如)。现在我希望能够有一个以上的播放器
,每个播放器都应该有另一种颜色的T恤。因此,基本上,我想用红色代替蓝色作为第二个播放器
,用绿色代替第三个播放器
,以此类推。我确信我可以用PixMap
做到这一点,但我不会。因为这样我就失去了TextureAtlas
(?)的优势。
还有别的办法吗?或者我是否需要将每个“颜色版本”作为纹理区域
放在纹理特拉斯
中
另一个小问题:
使用Gimp(可能还有一些其他程序),您可以对“.gif”文件使用颜色索引。通过为文件中的每种颜色保存索引,然后使用此索引描述像素,可以减小所有纹理的大小。因此,对于每个红色像素,您都会有一个“1”而不是“#FF0000”,并且文件中的某个地方会有一个“1=#FF0000”。如果我们将带有颜色索引的“.gif”文件打包到TextureAtlas
中,那么索引是否会丢失并恢复默认RGB颜色,还是会出现问题
非常感谢 实现这一点的一种方法是设置最大玩家数量,为每个人制作T恤,并将其与纹理图谱打包,然后将其添加到一个纹理区域阵列中
现在,您只需在索引之间切换
另一种方法是使用batch.setColor
void setColor(Color tint)
void setColor(float color)
void setColor(float r, float g, float b, float a)
只需为您绘制的每件T恤设置雪碧批次的颜色,然后在绘制完所有T恤后,再次将雪碧批次的颜色设置为白色
您还可以使用带有setColor函数的Sprite类来实现这一点
如果你的T恤尺寸不是很大,而你的最大玩家数量很小,我推荐第一种方法。我面临同样的问题,使用相同的纹理生成随机颜色的武器
所以我写了这个。
基本上,我会为你想要编辑的纹理制作一个像素贴图。
然后你迭代所有的像素,在迭代的同时我检查某些颜色,这些颜色是纹理的特定部分。(我建议使用不同的灰度,因为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, y, 1, 1);
} else if (colorInt[0] == colorAffinity
&& colorInt[1] == colorAffinity
&& colorInt[2] == colorAffinity) {
pixmap.setColor(tintAffinity);
pixmap.fillRectangle(x, y, 1, 1);
} else if (colorInt[0] == colorGrip && colorInt[1] == colorGrip
&& colorInt[2] == colorGrip) {
pixmap.setColor(tintGrip);
pixmap.fillRectangle(x, y, 1, 1);
}
else if (colorInt[0] == colorExtra && colorInt[1] == colorExtra
&& colorInt[2] == colorExtra) {
pixmap.setColor(tintExtra);
pixmap.fillRectangle(x, y, 1, 1);
}
}
}
tex = new Texture(pixmap);
textureData.disposePixmap();
pixmap.dispose();
return tex;
}
/**
*需要资源的textureName,并且需要
*零件
*
*@param-texturename
*@param彩色刀片
*@param colorEdge
*@param颜色亲和力
*@param-colorGrip
*@返回
*/
私有静态纹理genTexture(字符串texturename、int colorBlade、,
int colorEdge、int colorAffinity、int colorGrip、int colorExtra){
纹理tex=Game.res.getTexture(纹理名称);
TextureData TextureData=tex.getTextureData();
textureData.prepare();
颜色tintBlade=选择颜色(主颜色);
颜色tintEdge=新颜色(tintBlade.r+0.1f,tintBlade.g+0.1f,
(b+0.1f,1);
色彩色彩亲和力=选择颜色(亲和力颜色);
彩色握把;
Color tintExtra=选择颜色(外部颜色);
布尔颜色集合=假;
做{
tintGrip=选择颜色(主颜色);
如果(tintAffinity!=tintBlade&&tintAffinity!=tintGrip
&&tintGrip!=tintBlade){
colorsAreSet=true;
}
}而(!colorsAreSet);
Pixmap Pixmap=tex.getTextureData().consumePixmap();
对于(int y=0;y
我希望这有帮助。
请不要只是复制粘贴,尝试重新构建它以满足您的需要,否则您将一无所获。
Rose Blax做得非常好。但是,如果您想通过使用SpriteBatch或有相同问题但不想使用Pixmap的人来实现这一点
当然,我真的很喜欢使用Pixmap,但我已经看到“spritebatch/sprite.setcolor(r,g,b,a)”的使用带来了一些挑战,因为只更改t恤的所有纹理颜色。。。这就是我来这里的原因,是的,用这种方式只可以换t恤。你准备好了吗D
1-制作pa
public void draw(SpriteBatch batch){
//First we draw the player with a hole in his body
batch.draw(playerA,0,0,75,100);
//Here we set the color of next texture to be drawn as RED.
batch.setColor(Color.RED);
//Now we draw the t-shirt of the player in same x and half y.
//That t-short has to be drawn in right position. That's why calc it.
batch.draw(tshirtA, 0,50,50);
//For don't affect others textures then make it white back.
batch.setColor(Color.WHITE);
}