在libGDX中绘制透明形状作为Actor?

时间:2013-05-07 18:55:37

标签: android libgdx

我正在尝试在一个类中在屏幕上绘制一个简单的rect并将其用作演员。

但无论我做什么,似乎都没有选择让它透明。有谁知道如何做到这一点? 提前谢谢!

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 个答案:

答案 0 :(得分:5)

你正在混合上下文。在启动SpriteBatch之前结束ShapeRenderer。见libgdx - ShapeRenderer in Group.draw renders in wrong colour。但这可能不是问题。

您还需要打开混音。您可以在全局范围内执行此操作,也可以根据需要启用它(并禁用它)。它应该由SpriteBatch上下文启用,但我不认为它已为ShapeRenderer启用。

Gdx.graphics.getGL10().glEnable(GL10.GL_BLEND); // Or GL20

渲染背景和演员的顺序也会对透明度产生影响。

最后,您将不透明度设置为0,因此对象将完全不可见。这通常根本不起作用。 (我假设你只是试图从当前的100%可见变化?)

答案 1 :(得分:2)

很抱歉挖掘这个。但是,既然你正在为Android标记,我认为我只会填充我的经验。 我最近花了差不多4个小时处理一个问题,其中alpha混合不起作用,因为它不适合你。

原来,libgdx'AndroidApplicationConfiguration使用0位作为默认的alpha通道。 如果您也是如此,那么在initialize()您的应用之前,将其更改为更合理的内容可能是值得的。

答案 2 :(得分:1)

我决定在我的游戏中使用Scene2d并达成了同样的问题:如何使用矩形作为演员并在屏幕上绘制它?

然后我在libgdx wiki上找到了这篇文档 (默认情况下,Scene2d有一个SpriteBatch来处理actor的绘制)

  

如果演员需要以不同方式执行绘图,例如使用   ShapeRenderer,Batch应该结束,然后再次开始   方法结束。当然,这会导致批次被冲洗,所以   应谨慎使用。变换和投影矩阵   可以使用批处理:

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