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

6
我创建了一个AnimatedSprite类,可以绘制特定的TextureRegion。有时我需要使用着色效果,所以我设置了这个颜色(color是我的AnimatedSprite类中的一个Color字段):
super.draw(batch, parentAlpha);

batch.setColor(this.color);
batch.draw(this.frames[this.currentFrame], x, y, originX, originY, width, height, scaleX, scaleY, rotation)
batch.setColor(Color.WHITE);

然而,当我将AnimatedSprite的颜色设置为黑色或其他颜色时,其他所有元素都会有相同的颜色。我甚至尝试过flush()、结束批处理并开始新的批处理等操作...但似乎没有什么作用。

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


1
这是AnimatedSprite draw方法的主体?看起来没问题,就像Image.java中的绘制方法。也许还有其他问题吗?这个color在其他地方被使用了吗? - P.T.
@P.T. 在看到你的评论后,我也查看了Image类。Image类甚至没有重置批处理的颜色,所以我尝试在我的代码中将其删除。this.color在其他地方没有被使用,我也只给出了r g b值而不是整个颜色实例。然而,我的整个屏幕仍然被染上了一种颜色。 - Luke Vo
@P.T. 谢谢您的提示。我找到了问题所在。因为在初始化时,我将我的 Sprite 的颜色设置为 libgdx 的 Color.WHITE,所以我的每个 AnimatedSprite 都指向同一个颜色! - Luke Vo
我也做过这个。我添加了一个答案,以便其他人看到这个问题已经得到解答。如果你有机会,也可以加入一些“将颜色设置为黑色”的代码。 - P.T.
2个回答

8

小心共享的可变颜色对象!如果你这样做:

this.color = Color.WHITE;

如果稍后改变this.color,你将会改变Color.WHITE,这通常是错误的! :)

在构造一个你将要改变的Color对象时,始终制作一份副本:

this.color = new Color(Color.WHITE);

许多libGDX中的对象都是可变的,就像这样(而常规Java库中类似的对象则是不可变的),因为libGDX非常关注GC开销。

1
不使用

,与其相反
this.color = new Color(Color.WHITE);

你可以使用:
batch.setColor(Color.WHITE.tmp());

这将创建一个白色的临时副本,对我来说看起来更清洁一些。

1
Color.WHITE.tmp() 在 libgdx 1.9.6 中不存在。 - Vokail
在最新版本中,它是.cpy()。我相信最佳实践是在每次调用之前(或使用相同颜色的调用)显式设置颜色以进行batch.draw()。 - Guillaume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接