在 JavaFX 中传递游戏逻辑?

Passing game logic in JavaFX?

我目前正在 Java 开发 table RPG 游戏。我开发了游戏逻辑和连接 (socket/RMI)。现在游戏可以使用 CLI。我想用 JavaFX 和 sceneBuilder 实现 GUI。我设计了所有场景并开始编写控制器。我的问题是:如何将我的游戏逻辑传递给 GUI?

这个问题是概念性的,因此是概念性的答案。

面向对象的方法。 只要模型(游戏逻辑)与视图(CLI / GUI)很好​​地分离,它应该不是什么大问题。假设您有某种 Game / GameLogic class,您只需将其实例传递给相关控制器即可。您大概每个 FXML 视图都有一个控制器。加载场景时,您可以使用 setControllerFactory 通知 FXMLLoader 您的控制器需要如何创建。考虑到这一点,您可以尝试以下操作:

MainGameController(Game game) {
    this.game = game; // now your controller has an instance of your game logic
}

然后,加载视图的位置(可能在 Application subclass 中):

FXMLLoader loader = ...
Game game = ...

loader.setControllerFactory(t -> new MainGameController(game));

如果您的游戏逻辑被分成几个部分并且每个部分都有自己的视图,只需采用相同的控制器实例化即可。

务实的方法。假设您不想在幕后进行大量布线。在那种情况下,您可以在整个游戏中创建一个单一的访问点,本质上类似于单例模式。如果您的游戏在游戏逻辑之上还有其他服务,例如AudioPlayerAssetLoader,这种方法实际上可能更有益。

class GameApplication {

    static Game game; // + getters / setters
    static AudioPlayer audioPlayer;
    ...
}

然后在您的 MainGameController(或任何其他)中:

// called automatically by FXMLLoader
public void initialize() {
    this.game = GameApplication.getGame();
}