Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Libgdx在运行时更改纹理的颜色_Java_Colors_Libgdx_Textures - Fatal编程技术网

Java Libgdx在运行时更改纹理的颜色

Java Libgdx在运行时更改纹理的颜色,java,colors,libgdx,textures,Java,Colors,Libgdx,Textures,在一个用libgdx制作的游戏中,我有一个TextureAtlas,其中我存储了玩家动画的所有TextureRegions。默认情况下,播放器有一件蓝色T恤(例如)。现在我希望能够有一个以上的播放器,每个播放器都应该有另一种颜色的T恤。因此,基本上,我想用红色代替蓝色作为第二个播放器,用绿色代替第三个播放器,以此类推。我确信我可以用PixMap做到这一点,但我不会。因为这样我就失去了TextureAtlas(?)的优势。 还有别的办法吗?或者我是否需要将每个“颜色版本”作为纹理区域放在纹理特拉斯

在一个用libgdx制作的游戏中,我有一个
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);
    }