在 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));
如果您的游戏逻辑被分成几个部分并且每个部分都有自己的视图,只需采用相同的控制器实例化即可。
务实的方法。假设您不想在幕后进行大量布线。在那种情况下,您可以在整个游戏中创建一个单一的访问点,本质上类似于单例模式。如果您的游戏在游戏逻辑之上还有其他服务,例如AudioPlayer
、AssetLoader
,这种方法实际上可能更有益。
class GameApplication {
static Game game; // + getters / setters
static AudioPlayer audioPlayer;
...
}
然后在您的 MainGameController
(或任何其他)中:
// called automatically by FXMLLoader
public void initialize() {
this.game = GameApplication.getGame();
}
我目前正在 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));
如果您的游戏逻辑被分成几个部分并且每个部分都有自己的视图,只需采用相同的控制器实例化即可。
务实的方法。假设您不想在幕后进行大量布线。在那种情况下,您可以在整个游戏中创建一个单一的访问点,本质上类似于单例模式。如果您的游戏在游戏逻辑之上还有其他服务,例如AudioPlayer
、AssetLoader
,这种方法实际上可能更有益。
class GameApplication {
static Game game; // + getters / setters
static AudioPlayer audioPlayer;
...
}
然后在您的 MainGameController
(或任何其他)中:
// called automatically by FXMLLoader
public void initialize() {
this.game = GameApplication.getGame();
}