我正在尝试在一个类中在屏幕上绘制一个简单的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);
}
}
答案 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();
}