Java / Libgdx - 如何在没有闪烁效果的情况下绘制多个圆圈?

时间:2015-10-21 11:52:16

标签: java libgdx 2d

也许我的标题不太合适,但我会尽力清楚解释。

事实上,我目前正在使用Libgdx开展一个小项目。目前,该项目的目标是能够在我的屏幕上随机显示几个圆圈。

我在屏幕上正确显示了这些圆圈,但它们正在闪烁。

@Override
public void render(float delta) {

    renderer.begin(ShapeType.Filled);
    if(!mapIsCreated)
    {
        Random rand = new Random();
        int x, y;
        for(int i=0;i<200;i++)
        {
            x = rand.nextInt(Gdx.graphics.getWidth());
            y = rand.nextInt(Gdx.graphics.getHeight());

            renderer.setColor(Color.DARK_GRAY);
            renderer.circle(x, y, 5);
            renderer.setColor(Color.GRAY);
            renderer.circle(x, y, 3);
        }
        mapIsCreated = true;
    }
    renderer.end();
}

有没有解决方案可以在背景上明确修复它们而不会闪烁/重新加载效果?

如果需要更多详细信息,请告知我们。

1 个答案:

答案 0 :(得分:0)

您似乎永远无法清除屏幕。

您应该在渲染方法的开头调用以下行:

// This is black, you can choose any color, technically one call is enough
Gdx.gl.glClearColor(0f, 0f, 0f, 1f);
// This line clears the screen (more precisely the color buffer, there are others but this one should be fine)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

现在,因为看起来你只想在初始化方法(比如create方法)中创建它们一次后随机生成它们并将它们保存在数组/集合中:

// Global field
Array<Vector2> circlePositions = new Array<>();

// initialization method
renderer = new ShapeRenderer();

Random rand = new RandomXS128();
for (int i = 0; i < 200; i++)
{
    circlePositions.add(
            new Vector2(
                    rand.nextInt(Gdx.graphics.getWidth()),
                    rand.nextInt(Gdx.graphics.getHeight())));
    circlePositions.add(
            new Vector2(
                    rand.nextInt(Gdx.graphics.getWidth()),
                    rand.nextInt(Gdx.graphics.getHeight())));
}

然后在你的渲染方法中你可以像这样绘制你的圆圈:

Gdx.gl.glClearColor(0f, 0f, 0f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

renderer.begin(ShapeType.Filled);
for (int i = 0; i < circlePositions.size; i++)
{
    Vector2 pos = circlePositions.get(i);

    if (i % 2 == 0)
    {
        renderer.setColor(Color.DARK_GRAY);
        renderer.circle(pos.x, pos.y, 5);
    } else
    {
        renderer.setColor(Color.GRAY);
        renderer.circle(pos.x, pos.y, 3);
    }
}
renderer.end();

如果您不想重新绘制所有内容,例如: 60 fps,然后看看非继续渲染。