【问题标题】:Libgdx won't render on requestRenderingLibgdx 不会在 requestRendering 上呈现
【发布时间】:2014-02-08 18:20:57
【问题描述】:

我正在制作一个基于三消的游戏,每次用户在棋盘上移动一个棋子时,游戏都会执行以下循环:

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

    showTheBoard();
} while (thereWhereBlockRemoved);

这主要是因为当你移除一些碎片时,有可能掉落的碎片会组合在一起......

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

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

另一种解决方法是调用

 Gdx.graphics.setContinuousRendering(false); 

然后调用:

 Gdx.graphics.requestRendering();

在 showTheBoard() 函数中...我在渲染函数中放置了一些 system.out.println 以了解它是否被调用,并且我意识到渲染仅在 do/while 循环退出时被调用。 (尽管有这种情况,render 被正确调用了)

以防万一,在我的 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 在不同的线程中进行渲染,但这种情况就像我只有一个线程必须等待计算结束才能渲染......

如果有人能就可能发生的事情提供一些提示,我将不胜感激!

【问题讨论】:

  • 不建议让线程休眠....尝试其他方法...

标签: java android libgdx desktop


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。据我了解,您的建议是将游戏逻辑移入渲染功能。我以为它只是用来画画的。当两块移动(鼠标/触摸输入)时调用了我的循环,因此我将游戏逻辑与绘图分开。但我会按照你的方法告诉你!
  • 是的,尽管名称为 render 函数是每帧更新调用一次的例程,它是你应该更新你的世界并进行渲染的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 2017-06-29
相关资源
最近更新 更多