我正在使用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时,我看不到更半透明的圆圈。
这是我的问题:
有人能帮帮我吗?我该怎么办,在绘制一个完整的透明圆圈之前我应该怎么做?感谢。
更新 我找到了问题的答案。我必须禁用混合以避免此问题。
现在我的代码:
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,白色的圆圈)。
答案 0 :(得分:2)
我不确定这是否适合您,但我只是分享它:
您可以使用FrameBuffer
并执行以下操作:
SpriteBatch
。FrameBuffer
s alpha通道(透明度)设置为0.7
或类似的内容。SpriteBatch
和FrameBuffer
以将其绘制到屏幕。会发生什么?你绘制正常场景,没有雾。你创建一个“虚拟屏幕”,用黑色填充它并用白色圆圈透过黑色。现在你设置了这个“虚拟屏幕”的透明度,并用它透支你的真实屏幕。屏幕的一部分,在白色圆圈下看起来很明亮,而黑色的休息使你的场景变暗。 需要阅读的内容: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();
告诉我它是否有效