Libgdx不会在requestRendering上呈现

时间:2014-02-08 18:20:57

标签: java android libgdx desktop

我正在制作一个基于比赛三的游戏,每当用户在棋盘上移动棋子时,游戏就会执行以下操作:

do {
    checkIfThereAre3BlocksTogether();
    removeThoseBlocks();
    updateTheBoardPieces();

    showTheBoard();
} while (thereWhereBlockRemoved);

这主要是因为当你删除一些碎片时,一件堕落的碎片有可能组合起来......

我面临的问题是我无法在每次迭代循环之间渲染板。我只获得了这个循环的最终结果。

我尝试的是在每次迭代之前制作一个Thread.sleep(2 * 1000),以便为渲染系统提供时间来绘制我的电路板,但它可以工作。

另一种解决方法是致电

 Gdx.graphics.setContinuousRendering(false); 

然后致电:

 Gdx.graphics.requestRendering();
showTheBoard()函数中的

...我在render函数中放了一些system.out.println,以便知道它是否被调用,我意识到渲染只在do / while循环退出时调用。 (尽管出现这种情况,渲染被正确调用)

万一它有帮助,在我的Screen实现中,我现在在我的渲染函数中有这个代码:

@Override
public void render(float delta) {

    System.out.println("Rendering");

    // Background rendering
    Gdx.gl.glClearColor(0.8f, 0.8f, 0.8f, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);   

    // World rendering
    renderer.render();
}

我认为问题可能与线程处理有关。我不知道libgdx在不同的线程中进行渲染,但这种情况就像我只有一个线程必须在渲染之前等待计算结束...

如果有人能对可能发生的事情给出一些暗示,我将不胜感激!

1 个答案:

答案 0 :(得分:1)

Libgdx将每帧调用一次render回调。你无法让Libgdx从单个render回调中绘制多个帧,因此你的while循环将始终在下一帧渲染到屏幕之前运行完毕。

您需要从while循环切换到在更新过程中多次调用render的方法。通常,状态机是思考这个问题的好方法。但在你的具体情况下,我认为你可以完全摆脱while循环。 (实际上render方法已经处于无限循环中):

public void render(float delta) {
    ...
    if (checkIfThereAre3BlocksTogether()) {
       removeThoseBlocks();
       updateTheBoardPieces();
    }
    ...
}

现在您可能会遇到这样的问题:当您运行这些更新时,您将希望阻止播放器对系统进行新的更改。您需要跟踪游戏所处的“模式”(接受更新或通过组合运行)并推迟检查输入,直到您完成组合运行。