在libGDX中如何作为一个演员绘制一个透明的形状?

4
我正在尝试在一个类中绘制一个简单的矩形,并将其用作演员。
但无论我做什么,似乎都没有选项可以将其绘制为透明。有人知道如何做到这一点吗? 提前感谢!
public class AreaColorRect extends Actor {

    public float opacity = 0.0f;
    private Color shapeFillColor = new Color();
    public Rectangle area;
    public ShapeRenderer shapeRen;

    public AreaColorRect(float x, float y, float w, float h) {
        shapeRen = new ShapeRenderer();
        this.area = new Rectangle(x, y, w, h);
    }


    @Override
    public void draw(SpriteBatch batch, float parentAlpha) {
        shapeRen.begin(ShapeType.Filled);
        shapeRen.setColor(new Color(shapeFillColor.r, shapeFillColor.g, shapeFillColor.b,
            0.0f));
        shapeRen.rect(area.x, area.y, area.width, area.height);
        shapeRen.end();
    }

    public void setShapeFillColor(float r, float g, float b) {
        this.shapeFillColor = new Color(r, g, b, 1);
    }

}
3个回答

5
您正在混淆上下文。在启动ShapeRenderer之前,请结束SpriteBatch。请参见libgdx - ShapeRenderer in Group.draw renders in wrong colour。虽然这可能不是问题的原因。
您还需要打开混合功能。您可以全局执行此操作,也可以根据需要启用(和禁用)它。应该对SpriteBatch上下文启用它,但我认为ShapeRenderer没有启用它。
Gdx.graphics.getGL10().glEnable(GL10.GL_BLEND); // Or GL20

你渲染背景和角色的顺序也会影响透明度。最后,你将不透明度设为0,所以物体将完全不可见。通常这没有任何效果。(我猜你只是想从当前的100%可见性做出改变?)

嗯,透明度/alpha值确实还是不对的。但这只是因为我在测试不同的值。 问题仍然存在。我做了一些更改(比如首先结束spritebatch),但矩形仍然出现。即使alpha仍然为0.0f。 - EchtFettigerKeks
正如P.T.所提到的,执行该代码时似乎已禁用混合。注意:默认情况下,当您在SpriteBatch上调用end()时,它会确保混合被禁用。 - Jyro117
Gdx.graphics.getGL20().glEnable(GL20.GL_BLEND);需要在render()中调用还是只需要在Screen的构造函数中调用一次? - Someone Somewhere

2
我刚决定在我的游戏中使用Scene2d,遇到了同样的问题:如何将矩形用作演员并在屏幕上绘制它?
然后我在libgdx wiki上找到了这篇文档(默认情况下,Scene2d有一个SpriteBatch来处理演员的绘制)。
如果演员需要以不同的方式进行绘制,例如使用ShapeRenderer,则应该在方法结束时结束批处理,然后再次开始。当然,这会导致批处理被刷新,因此应该谨慎使用。可以使用批处理的转换和投影矩阵。
private ShapeRenderer renderer = new ShapeRenderer();

public void draw (Batch batch, float parentAlpha) {
    batch.end();

    renderer.setProjectionMatrix(batch.getProjectionMatrix());
    renderer.setTransformMatrix(batch.getTransformMatrix());
    renderer.translate(getX(), getY(), 0);

    renderer.begin(ShapeType.Filled);
    renderer.setColor(Color.BLUE);
    renderer.rect(0, 0, getWidth(), getHeight());
    renderer.end();

    batch.begin();
}

谢谢,对我很有效...(在正确的组中进行了转换) - ultra.deep

2

抱歉打扰一下。既然你标记了Android,我想分享一下我的经验。

最近我遇到了一个问题,花了将近4个小时,Alpha混合就是无法工作,这也是你遇到的问题。

事实证明,libgdx的AndroidApplicationConfiguration默认使用0位作为Alpha通道。如果你也遇到了这种情况,在initialize()应用程序之前将其更改为更合理的值可能会更好。


我正在尝试理解你所写的内容... 你是指像这样吗?AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); config.a = 1; initialize(new MainGame(), config); - Someone Somewhere
@SomeoneSomewhere 是的,完全正确。虽然我建议使用 config.a = 8,因为这是用于 alpha 通道的位数。 - suluke

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