我正在制作一个基于比赛三的游戏,每当用户在棋盘上移动棋子时,游戏就会执行以下操作:
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在不同的线程中进行渲染,但这种情况就像我只有一个线程必须在渲染之前等待计算结束...
如果有人能对可能发生的事情给出一些暗示,我将不胜感激!
答案 0 :(得分:1)
Libgdx将每帧调用一次render
回调。你无法让Libgdx从单个render
回调中绘制多个帧,因此你的while循环将始终在下一帧渲染到屏幕之前运行完毕。
您需要从while
循环切换到在更新过程中多次调用render
的方法。通常,状态机是思考这个问题的好方法。但在你的具体情况下,我认为你可以完全摆脱while循环。 (实际上render
方法已经处于无限循环中):
public void render(float delta) {
...
if (checkIfThereAre3BlocksTogether()) {
removeThoseBlocks();
updateTheBoardPieces();
}
...
}
现在您可能会遇到这样的问题:当您运行这些更新时,您将希望阻止播放器对系统进行新的更改。您需要跟踪游戏所处的“模式”(接受更新或通过组合运行)并推迟检查输入,直到您完成组合运行。