Java Libgdx-仅动态着色精灵的一部分

Java Libgdx-仅动态着色精灵的一部分,java,android,libgdx,blending,spritebatch,Java,Android,Libgdx,Blending,Spritebatch,有一个运行Libgdx的Android应用程序,其中有很多精灵。目前,我根据它们所属的类别给它们涂上不同的颜色,如红色、绿色、蓝色等。然而,我认为我更喜欢只给雪碧的一部分涂颜色,而不是整个雪碧 目前我使用: batch.begin(); batch.setColor(color1); batch.draw(group1); batch.setColor(color2); batch.draw(group2); etc.. batch.end(); batch.setColorcolor用于为

有一个运行Libgdx的Android应用程序,其中有很多精灵。目前,我根据它们所属的类别给它们涂上不同的颜色,如红色、绿色、蓝色等。然而,我认为我更喜欢只给雪碧的一部分涂颜色,而不是整个雪碧

目前我使用:

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

batch.end();
batch.setColorcolor用于为批次上色并将其应用于整个雪碧。当那一组完成后,我改变颜色并转到下一组。当完成组时,我重置批次颜色

是否有一种着色器/混合器方法只对精灵的一部分着色?例如,我的纹理中任何红色的东西都应该被视为一个动态区域,然后可以按照我动态设置的颜色进行着色

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


非常感谢

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

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());
    }
}

嗨,拉拉,谢谢你回复我。有点被你的方法弄糊涂了。目前,textureregion是我想要显示的精灵的图集的返回部分,比如说角色。我怎么才能只给这个返回的雪碧的一部分着色呢?是否为角色的每个部分创建不同的纹理区域?是的。您应该向图集中添加另一个纹理,在该纹理处,仅可以看到要更改颜色的角色部分。然后创建MySprite,其中region1是角色纹理,region2是第二个纹理。在渲染之前别忘了设置“extraColor”值。不过这种方法看起来开销很大?我有一个在8个方向旋转的精灵,每个方向都有4帧动画。所以,我需要一个纹理区域图像在地图册中的每一个?这看起来就像是一场管理噩梦,尤其是当主角的图片被更新时。使用的精灵具有透明胶片-是否没有办法针对精灵的特定颜色(如洋红),而只动态地为该部分着色?就像绿色/蓝色屏幕如何与tv/filmsWell一起工作一样,您应该在问题中包含这样的细节:在这种情况下,我建议您查看Pixmap类:。您可以使用getColor和drawPixel方法实现所需。我不确定这是否是最佳解决方案,但它应该有效。