有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Libgdx中实现简单运动模糊的java意外结果

在所附的两张图片中,libgdx的桌面截图按预期运行。不幸的是,我的Galaxy Nexus的截图与预期不符。我试图创建一个简单的运动模糊或轨迹效果

在桌面上按预期呈现。 Libgdx running on my desktop, working as expected

在我的Galaxy nexus上没有像我预期的那样渲染。 Libgdx running on my Galaxy Nexus not working as expected

在渲染过程中,将在for循环中绘制圆纹理,并使用在圆之前绘制的0,0,0,0.1f的RGBA,使用pixmap实现效果

ScreenClearPrite创建

Pixmap screenClearPixmap = new Pixmap(256, 256, Format.RGBA8888);
screenClearPixmap.setColor(Color.rgba8888(0, 0, 0, 0.1f));
screenClearPixmap.fillRectangle(0, 0, 256, 256);
screenClearTexture = new Texture(screenClearPixmap);
screenClearSprite = new Sprite(screenClearTexture);
screenClearSprite.setSize(screenWidth, screenHeight);
screenClearPixmap.dispose();

渲染

batch.begin();
font.draw(batch, "fps:" + Gdx.graphics.getFramesPerSecond(), 0, 20);
screenClearSprite.draw(batch);
for (int i = 0; i < circleBodies.size(); i++) {
    tempPos = circleBodies.get(i).getPosition();
    batch.draw(circleTexture, (tempPos.x * SCALE) + screenWidthHalf
            - circleSizeHalf, (tempPos.y * SCALE) + screenHeightHalf
            - circleSizeHalf);
}
batch.end();

那么,我做错了什么?也许有更好的方法来获得运动的“运动模糊”效果


共 (2) 个答案

  1. # 1 楼答案

    这里有一种不同的方法,每次你都用纯色而不是alpha来清除屏幕

    这意味着您将不得不修改一些代码。这样做的好处是,你这样做有一些缺陷:它会模糊运动中的一切,而不仅仅是球。除非你小心,否则会很快产生难看的结果/假象

    1. 执行与现在相同的操作,但不要将球绘制到批次中,而是将它们绘制到纹理/位图/任何东西上。然后每个帧在球图像上添加一个alpha混合图像,然后在其上绘制球的当前位置。然后将该图像添加到屏幕上。非常像你现在做的,除了你吸引到别的东西并保留它。这样,您就不必依赖正在绘制的视口,并且可以将所有内容分开。 此方法类似于绘制累积缓冲区

    2. 你可以跟踪每个球的n最新位置,而不是像现在这样做。然后用不同的阿尔法在每一帧中画出它们。这很容易实现。如果你有很多球或一个大的n,可能会导致很多绘画调用,但如果不是太多,它不应该限制你的fps,并提供很好的控制

  2. # 2 楼答案

    Perhaps there is a better way to get the 'motion blur' effect of movement?

    为了在我的游戏中使运动模糊,我使用了另一种方法“粒子效果”,它对我来说非常好,我没有安卓/桌面问题,也没有不同的安卓设备

    你所要做的就是使用Libgdx的“粒子效果编辑器”,制作效果,然后将其加载到你的项目中,最后在你绘制对象的同一位置绘制它(以及alos绘制对象)

    使用粒子编辑器制作正确效果文件的提示:

    • 设置(使用)要在粒子效果中模糊其运动的对象的相同图像

    • 尝试限制计数:允许的最大粒子数

    • 禁用“速度”和“角度” 参数

    粒子效果有助于实现运动效果 希望这能帮助别人