在libgdx中使用filledcircle和pixmap

时间:2014-02-06 12:27:28

标签: java libgdx render transparent pixmap

我正在使用Libgdx。 我想用pixmap模拟游戏中的雾,但是在生成"fogless"圈时我遇到了问题。首先,我制作一个像黑色填充的像素图(它是透明的一点点)。填充后我想在其上画一个圆圈,但结果不是我所期望的。

this.pixmap = new Pixmap(640, 640, Format.LuminanceAlpha);
Pixmap.setBlending(Blending.None); // disable Blending
this.pixmap.setColor(0, 0, 0, 0.9f);
this.pixmap.fill();
//this.pixmap.setColor(0, 0, 0, 0);
this.pixmap.fillCircle(200, 200, 100);
this.pixmapTexture = new Texture(pixmap, Format.LuminanceAlpha, false);

render()

程序中
public void render() {
  mapRenderer.render();
  batch.begin();
  batch.draw(pixmapTexture, 0, 0);
  batch.end();
}

如果我使用格式化。 Alpha在创建Pixmap和Texture时,我看不到更半透明的圆圈。

这是我的问题:

enter image description here

Problem

有人能帮帮我吗?我该怎么办,在绘制一个完整的透明圆圈之前我应该​​怎么做?感谢。

更新 我找到了问题的答案。我必须禁用混合以避免此问题。


现在我的代码:

FrameBuffer fbo = new FrameBuffer(Format.RGBA8888, 620, 620, false);
Texture tex = EnemyOnRadar.assetManager.get("data/sugar.png", Texture.class);

batch.begin();
// others
batch.end();

fbo.begin();
batch.setColor(1,1,1,0.7f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw( tex, 100, 100);
batch.end();
fbo.end();

但是我没有看到圆圈(它是一个png图像,代表透明的bg,白色的圆圈)。

1 个答案:

答案 0 :(得分:2)

我不确定这是否适合您,但我只是分享它: 您可以使用FrameBuffer并执行以下操作:

  1. 在屏幕上绘制您想要绘制的所有内容。
  2. 结束SpriteBatch并开始使用FrameBuffer,再次开始SpriteBatch
  3. 绘制雾,用黑色,不透明的颜色填充整个“屏幕”(FrameBuffer)。
  4. 在要删除雾的位置绘制“Fogless”圆圈作为白色圆圈。
  5. FrameBuffer s alpha通道(透明度)设置为0.7或类似的内容。
  6. 结束SpriteBatchFrameBuffer以将其绘制到屏幕。
  7. 会发生什么?你绘制正常场景,没有雾。你创建一个“虚拟屏幕”,用黑色填充它并用白色圆圈透过黑色。现在你设置了这个“虚拟屏幕”的透明度,并用它透支你的真实屏幕。屏幕的一部分,在白色圆圈下看起来很明亮,而黑色的休息使你的场景变暗。 需要阅读的内容:2D Fire effect with libgdx,或多或少与雾相同。 我的问题是:Libgdx lighting without box2d

    编辑:另一个Tutorial

    让我知道它是否有帮助!

    编辑:某些伪代码: 在创建:

    fbo = new FrameBuffer(Format.RGBA8888, width, height, false);
    

    在渲染中:

    fbo.begin();
    glClearColor(0f, 0f, 0f, 1f);    // Set the clear color to black, non transparent
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);  // Clear the "virtual screen" with the clear color
    spriteBatch.begin();  // Start the SpriteBatch
    // Draw the filled circles somehow // Draw your Circle Texture as a white, not transparent Texture
    spriteBatch.end(); // End the spritebatch
    fbo.end(); // End the FrameBuffer
    spriteBatch.begin();   // start the spriteBatch, which now draws to the real screen
    // draw your textures, sprites, whatever
    spriteBatch.setColor(1f, 1f, 1f, 0.7f); // Sets a global alpha to the SpriteBatch, maybe it applies alo to the stuff you have allready drawn. If so just call spriteBatch.end() before and than spriteBatch.begin() again.
    spriteBatch.draw(fbo, 0, 0);  // draws the FBO to the screen.
    spriteBatch.end();
    

    告诉我它是否有效