Java 设置SpriteBatch颜色(用于着色)会影响所有图形

Java 设置SpriteBatch颜色(用于着色)会影响所有图形,java,sprite,libgdx,tint,spritebatch,Java,Sprite,Libgdx,Tint,Spritebatch,我创建了一个AnimatedSprite类,用于绘制特定的TextureRegion。有时我需要着色效果,所以我设置(this.color是我的动画精灵的color字段): 但是,当我将动画精灵的颜色设置为黑色或任何颜色时,其他所有颜色都具有该色调。我甚至尝试flush(),结束批处理并开始新的批处理,等等。。。但似乎什么都不管用 请帮助我正确应用着色效果。任何想法我都会很感激。小心共享可变对象!如果您这样做: this.color = Color.WHITE; 然后变异this.color稍

我创建了一个
AnimatedSprite
类,用于绘制特定的
TextureRegion
。有时我需要着色效果,所以我设置(this.color是我的
动画精灵的
color
字段):

但是,当我将
动画精灵的颜色设置为黑色或任何颜色时,其他所有颜色都具有该色调。我甚至尝试
flush()
,结束批处理并开始新的批处理,等等。。。但似乎什么都不管用

请帮助我正确应用着色效果。任何想法我都会很感激。

小心共享可变对象!如果您这样做:

this.color = Color.WHITE;
然后变异
this.color
稍后,你将变异
color.WHITE
这通常是错误的事情!:)

在构建将要变异的
颜色
对象时,请始终进行复制:

this.color = new Color(Color.WHITE);
libGDX中的许多对象是这样可变的(而常规Java库中的类似对象是不可变的),因为libGDX(正确地)非常关注GC开销。

而不是使用

this.color = new Color(Color.WHITE);
您可以使用:

batch.setColor(Color.WHITE.tmp());

这将创建白色的临时副本,对我来说似乎稍微干净一些。

这是动画精灵的主体
draw
方法?它看起来是正确的,并且看起来像draw方法。也许是别的什么?这是其他地方使用的颜色吗?@P.T.在看到你的评论后,我也看了
图片
类。
Image
类甚至没有重置批处理的颜色,所以我尝试在代码中删除它
this.color
在其他地方没有使用,我也给出了rgb值,而不是整个color实例。但是,我的整个屏幕仍然有一种颜色。@P.T.谢谢你的提示。我发现了问题。因为在初始化时,我将精灵的颜色设置为color.WHITE(libgdx的),所以我的每个动画精灵都指向相同的颜色!我也这样做过。我添加了一个答案,以便其他人看到这个答案。如果您有机会添加一些“将颜色设置为黑色”的代码,libgdx 1.9.6中也不存在.color.WHITE.tmp(),最新版本中是.cpy()。我认为最好的做法是在每次调用(或使用相同颜色的调用)之前将颜色显式设置为batch.draw()。
batch.setColor(Color.WHITE.tmp());