2013-05-07 72 views
3

我想在一个类的屏幕上绘制一个简单的矩形并将其用作演员。作为Actor在libGDX中绘制透明形状?

但无论我做什么,似乎没有选项可以使其透明。有谁知道如何做到这一点? 在此先感谢!

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

} 

回答

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%可见变化?)

+0

那么,它不错,opacity- /α-值仍然是错误的。但这只是因为我正在测试不同的值。 问题依然存在。我做了一些改变(比如最初结束spritebatch),但仍然出现rect。即使alpha仍然在0.0f – 2013-05-07 19:38:06

+0

As P.T.上面提到的,它看起来像执行代码时混合禁用。注意:默认情况下,当您在SpriteBatch上调用end()时,它将确保混合被禁用。 – Jyro117 2013-05-08 19:33:33

+0

'Gdx.graphics.getGL20()。glEnable(GL20.GL_BLEND);'必须在render()中调用,或者只在Screen的构造函数中调用一次? – 2014-09-08 04:45:39

2

对不起,挖这个。但是,既然你在标记Android,我认为我只是将自己的经验打好。 我最近在一个问题上花了将近4个小时,因为alpha混合不起作用,因为它不适合你。

原来,libgdx'AndroidApplicationConfiguration默认使用0位作为alpha通道。 如果您也是这种情况,那么在您的应用程序之前,可能需要将其更改为更明智的选项。

+0

我想了解你写的是什么......你的意思是这样吗? 'AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();''config。a = 1;''initialize(new MainGame(),config);'? – 2014-09-08 04:43:08

+0

@SomeoneSomewhere是的,正好。虽然我建议'config.a = 8',因为那些是用于alpha通道的位数。 – suluke 2014-09-23 09:43:45

1

我只是决定为我的游戏使用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(); 
}