Libgdx - 动态地仅为sprite的一部分着色

时间:2015-02-23 10:19:06

标签: java android libgdx blending spritebatch

让Android应用程序运行Libgdx,其中包含许多精灵。目前我根据它们属于哪个组来对它们进行不同的着色,例如“红色”,“绿色”,“蓝色”等。但是,我认为我更喜欢只对精灵的一部分进行着色而不是整个部分。< / p>

目前我使用:

batch.begin();
batch.setColor(color1);
batch.draw(group1);
batch.setColor(color2);
batch.draw(group2);
etc..

batch.end();

batch.setColor(color)用于为批处理着色并将其应用于整个精灵。完成该组后,我会更改颜色并移至下一组。完成组后,我重置批次颜色。

是否有着色器/搅拌器方式只对颜色的一部分进行着色?例如,我的纹理中任何颜色为红色的东西都应被视为“动态区域”,然后可以将其着色为我动态设置的任何颜色。

我无法使用透明度,因为纹理的边缘是透明的,需要保持这种方式进行混合。

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以使用TextureRegion中的第二个Sprite来实现此目的。因此,您可以为此附加区域使用其他颜色。这个其他区域应该只包含可以改变颜色和透明背景的图像的一部分。

public class MySprite extends Sprite {
    TextureRegion region1, region2;
    Color extraColor;

    ...

    @Override
    public void draw(Batch batch, float parentAlpha) {
        Color color = getColor();
        batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
        batch.draw(region1, getX(), getY(), getOriginX(), getOriginY(),
                getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation());

        batch.setColor(extraColor);
        batch.draw(region2, getX(), getY(), getOriginX(), getOriginY(),
                getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation());
    }
}