设置SpriteBatch颜色(用于着色)影响所有图纸

问题描述:

我创建了AnimatedSprite类,即绘制特定的TextureRegion。有时候,我需要一个色调的色彩效果,所以我设置(this.color是的Color场我AnimatedSprite):设置SpriteBatch颜色(用于着色)影响所有图纸

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](https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/scenes/scene2d/ui/Image.java# L118)绘制方法。也许别的东西?这是否使用其他颜色? – 2013-02-16 05:13:49

+0

@ P.T。在看到您的评论后,我也查看了Image类。 'Image'类甚至不重置批次的颜色,所以我试着在我的代码中删除它。 'this.color'不在其他地方使用,我也给出r g b值而不是整个颜色实例。但是,我的整个屏幕仍然是一种颜色的色调。 – 2013-02-16 09:29:18

+0

@ P.T。谢谢你的提示。我发现了这个问题。因为初始化时,我将Sprite的颜色设置为Color.WHITE(libgdx),所以我的每个AnimatedSprite都指向相同的颜色! – 2013-02-16 09:39:45

当心共享可变Color对象!如果你这样做:

this.color = Color.WHITE; 

再变异this.color以后,你会变异Color.WHITE通常是错误的东西! :)

构建Color对象,你会发生变异时,始终做一个副本:

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

许多对象是可变的,这样的(而常规的Java库类似的对象将是不可改变的),因为libGDX是(正确)非常关心GC的开销。

而不是使用

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

你可以使用:

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

这将创建一个白色的临时副本并稍微清洁在我看来。

+0

Color.WHITE.tmp()在libgdx 1.9.6中不存在 – Vokail 2018-03-05 15:36:29