【问题标题】:Set SpriteBatch color (for tinting) affects all drawing设置 SpriteBatch 颜色(用于着色)影响所有绘图
【发布时间】:2013-02-15 07:51:44
【问题描述】:

我创建了一个AnimatedSprite 类,它绘制了一个特定的TextureRegion。有时我需要一个 tint 颜色效果,所以我设置(this.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(),结束批次并开始一个新的,等等......但似乎没有任何效果。

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

【问题讨论】:

  • 这是AnimatedSprite draw 方法的主体?它看起来正确,看起来像Image.java 绘制方法。也许还有别的? this.color 是否在其他地方使用过?
  • @P.T.看到您的评论后,我还查看了Image class。 Image 类甚至没有重置批次的颜色,所以我尝试在我的代码中删除它。 this.color 没有在其他地方使用,我也给出了 r g b 值而不是整个颜色实例。但是,我的整个屏幕仍然是一种颜色。
  • @P.T.谢谢你的提示。我发现了问题。因为在初始化时,我将 Sprite 的颜色设置为 Color.WHITE(libgdx 的),所以我的每个 AnimatedSprite 都指向相同的颜色!
  • 我也这样做了。我添加了一个答案,以便其他人会看到这个答案。如果您有机会也添加一些“将颜色设置为黑色”的代码。

标签: java sprite libgdx tint spritebatch


【解决方案1】:

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

this.color = Color.WHITE;

然后再变异this.color,你将变异Color.WHITE,这通常是错误的! :)

在构造您将要变异的 Color 对象时,请务必进行复制:

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

libGDX 中的许多对象都是这样可变的(而常规 Java 库中的类似对象将是不可变的),因为 libGDX (理所当然地)非常关心 GC 开销。

【讨论】:

    【解决方案2】:

    而不是使用

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

    你可以使用:

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

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

    【讨论】:

    • Color.WHITE.tmp() 在 libgdx 1.9.6 中不存在
    • 最新版本是 .cpy()。我相信最佳做法是在每次调用(或使用相同颜色的调用)之前明确设置颜色到 batch.draw()。
    猜你喜欢
    • 2019-11-02
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2018-10-12
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多