当前位置: 首页 > 知识库问答 >
问题:

在libgdx中用透明度清除屏幕以绘制粒子轨迹

沈淇
2023-03-14

我正在使用libgdx开发一个android应用程序,我试图绘制一些留下痕迹的风粒子,类似于以下内容:http://hint.fm/wind/。

我已经画出了粒子,它们是连接前一个位置和最新位置的线。但是,如果我每次都清理屏幕,它只会画出当前的位置,这将类似于小圆点移动,正如预期的那样。

我想做的是在那些粒子后面画一条痕迹,那条痕迹会逐渐消失。为了做到这一点,我试着创建一个列表的前面的粒子位置,并用一个递减的alpha绘制它们,但有很多粒子要绘制,这被证明是非常慢的。所以我搜索了一下,还有一种方法可以实现,就是在我画新粒子的时候,用透明的方式清除屏幕。我现在的解决方案是使用这个:意想不到的结果在Libgdx中实现简单的运动模糊,而我的桌面渲染工作如预期,在android中有一个紫色的背景是由我不理解的白色颗粒形成的。我该怎么解决这个?

这分别是android和桌面的截图:http://imgur.com/a/jm2sz

代码:

Pixmap screenClearPixmap = new Pixmap(480, 548, Format.RGBA8888);
screenClearPixmap.setColor(Color.rgba8888(0f, 0f, 0f, 0.1f));
screenClearPixmap.fill();
screenClearTexture = new Texture(screenClearPixmap);
screenClearSprite = new Sprite(screenClearTexture);
screenClearSprite.setSize(480, 548);
screenClearPixmap.dispose();

public void render() {

batch.begin();
screenClearSprite.draw(batch);
batch.end();
animate();
}

public void animate() {
moveParticles();
drawParticles();
}

public void drawParticles() {

shapeRenderer.begin(ShapeType.Line);
shapeRenderer.setColor(Color.WHITE);
...
shapeRenderer.line((float) particle.getOldX(), (float) particle.getOldY(), (float) particle.getX(), (float) particle.getY());
Gdx.gl20.glLineWidth(Global.LINEWIDTH);
shapeRenderer.end();
}

共有1个答案

陈昂熙
2023-03-14

我知道这已经晚了好几年了,但因为这对我很有用,所以我把它贴出来,希望它能帮助别人。

我见过的大多数Android设备(不包括模拟器)都要求您调用gdx.gl.glclear(gl20.gl_color_buffer_bit)或者您可以得到一些奇怪的结果。这种方法允许您清除屏幕,但仍然可以通过绘制帧缓冲区对象(FBO),然后将FBO绘制到屏幕上,而glClear()不会清除FBO。

>

  • 创建FBO:framebuffer FBO;

    创建SpriteBatch以绘制FBO:SpriteBatch批处理;

    在create()中:fbo=new FrameBuffer(pixmap.format.rgba8888,gdx.graphics.getwidth(),gdx.graphics.getheight(),false);batch=新建SpriteBatch();

    在render()中:gdx.gl.glClearColor(0,0,0,1);gdx.gl.glclear(GL20.gl_color_buffer_bit);GDx.gl.glenable(Gl20.gl_blend);gdx.gl.glblendfunc(gl20.gl_src_alpha,gl20.gl_one_minus_src_alpha);fbo.begin();//必须在绘图代码Shaperenderer.Begin()之前调用此命令;Shaperenderer.SetColor(0,0,0,0.2F);//您可以通过更改alpha Shaperenderer.rect(0,0,screenWidth,screenHeight)来更改跟踪长度;//在FBO上绘制一个半透明矩形。...您的绘图代码显示在此处...Shaperenderer.end();fbo.end();//确保在shaperenderer.end()或shaperenderer.flush()之后调用此命令;batch.begin();draw(fbo.getColorBufferTexture(),0,0);//绘制FBO批.End();gdx.gl.gldisable(GL20.gl_blend);

  •  类似资料:
    • 我在互联网上看了很多,但不知何故,找不到任何好处,总是清除屏幕在渲染方法或不太理解它。 那么清除屏幕的好处是什么?清除不会导致游戏在每次调用render方法时从头开始绘制所有内容吗?

    • 问题内容: 在我的游戏中,我使用 因此,当我绘制粒子时,它们占据了整个屏幕并且很大!那么如何缩小它们以满足我的需求? //皮尤实验室 问题答案: 您要么使用粒子编辑器(说实话,我认为这不是调整粒子大小的好主意,因为您提到粒子不会变得太小(对于其他任何我真的推荐的东西)),或者只是打开粒子效果文件。它应该由编辑器生成,或者您可以从示例中复制它。在此文件中搜索以下字段: 根据需要调整和。

    • 我制作了一个类,在draw函数中,我画了一个文本区域,一些静态文本,并给屏幕上色。draw函数位于while循环中。我希望整个pygame屏幕除输入框外都清晰,并且我希望屏幕改变颜色。我该怎么做?我的代码如下: ######################################################################################### 皮加梅。

    • 问题内容: 我想在PDFBox中用透明线绘制线条和多边形。这是一些有关如何绘制蓝线的示例代码,但是我无法弄清楚更改颜色的Alpha值。 问题答案: 您不能使用的alpha值,因为PDFBox仅使用RGB值。根据它的javadoc 只是: 设置描边颜色,指定为RGB。 一种选择是将背景色设置为描边色,以使线条不可见。 注意- 不可见!=透明(因此您不会获得透视效果)

    • 多亏了我在这个论坛上解决其他问题的帮助,我成功地推进了我的项目,但另一个障碍出现在我的道路上。 我有麻烦在libgdx java实现多个屏幕。我想知道如何实现多个屏幕(一个用于主菜单,一个用于播放,一个用于加载屏幕,...)。 关于我应该如何构造我的屏幕类的一个例子或一些解释将非常有帮助。我试着实现我自己的屏幕管理器,但不太顺利...还有一些关于我应该如何处理屏幕的提示,因为每次从主菜单到播放或选

    • 就像我们有清晰的屏幕在C/C...有没有办法在Java做同样的事情?我到处都找遍了,什么也没找到。 我试图用它来更新程序每秒钟显示的内容,去掉之前出现的所有代码。如果你知道其他方法我将感激不尽 谢谢:)