首页 > 解决方案 > Java 游戏与 JavaFX 画布 | 画布停止更新

问题描述

我使用 Java 使用 JavaFX Canvas 创建游戏。

我将 Canvas graphicsContext 传递给我的 GameLoop,它启动了一个额外的线程。从那里,我通过 ObjectHandler 将我的 graphicsContext 传递给要在画布上绘制的每个对象。

它以这种方式工作了一段时间,但随后画布以某种方式停止并且没有重绘任何对象。游戏仍在后台运行。在日志中,我可以看到所有对象都在继续运行和更新。有谁知道为什么会这样或我该如何解决?

这是我的窗口类的一部分:

canvas = new Canvas(Config.getCANVAS_WIDTH(), Config.getCANVAS_HEIGHT());
canvas.setFocusTraversable(true);
gc = new GameContainer(canvas.getGraphicsContext2D(), canvas);
primaryStage.setTitle(gc.getTitle());
primaryStage.setResizable(false);

这是我的 Gameloop 的一部分:

if (render) {
    gc.clearRect(0, 0, width, height);
    handler.render(gc);
    gc.setFill(Color.GRAY);
    if (Config.isDebug()) {
         debugText.printDebug(fps);
    }
    frames++;
}

HandlerClass 只是一个带有 arrayList 和两个循环(用于刻度和渲染)的列表。这是典型渲染函数的示例

public void render(GraphicsContext gc) {
    gc.save();
    gc.translate(x, y);
    gc.rotate(rotation);
    gc.setFill(Color.RED);
    gc.fillRect(-4, -4, 8, 8);
    gc.restore();
}

标签: javajavafxjava-8

解决方案


带有 GraphicsContext 的画布上的绘图必须位于

Platform.runLater (() -> {});

请参阅JavavFX 不是线程安全的


推荐阅读