作为Javafx和Java的新手,我在制作国际象棋游戏的设计时遇到了麻烦。 所以我在我的JavaFX应用程序扩展类中有以下开始方法:
public void start(Stage primaryStage) throws Exception{
Scene scene = new Scene(createContent());
primaryStage.setTitle("ChessGame");
primaryStage.getIcons().add(new Image("file:images/icon.png"));
primaryStage.setScene(scene);
primaryStage.show();
}
protected Parent createContent(){
Pane root = new Pane();
root.setPrefSize(WIDTH*TILE_SIZE, HEIGHT*TILE_SIZE);
boardInitialize("8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - -");
root.getChildren().add(tileGroup);
root.getChildren().add(pieceGroup);
return root;
}
问题是,我不知道将游戏的逻辑放在我的应用程序中的哪个位置。游戏逻辑将处理玩家的回合,检查支票和核对,产生可能的动作等(如果可能的话,后来是非常粗糙的AI)。我试图将它塞进start方法,但它不起作用,因为start方法只运行一次。 Pygame和他们的游戏循环比这更有意义,我可以看到我会如何使用它。所以我的问题是:我在哪里将游戏逻辑放在我的应用程序中?
答案 0 :(得分:1)
您可以使用模型 - 视图 - 控制器(+网络,如果需要)架构来设计您的系统。在使用MVC时,JavaFX非常有用。
经验法则
1-不要将您的游戏逻辑放在模型,网络和视图(FXML)类中。
2-使用FXML作为设计的一部分(它将引导您的工作)。
3-尝试实现“Low coupling & High Coherence”
4-完全工作的MVC JavaFX项目的一些示例。
> /* WelcomeScreenController class (interacts with the FXML file)*/
> @FXML
> void doSignup(ActionEvent event) {
>
> user = username.getText();
> pass = password.getText();
>
> if(user != null && !user.isEmpty() && pass != null && !pass.isEmpty())
> if (checkBox.isSelected())
> GameEngine.game().getAccessManager().callSignupService(user,pass);
> else
> showNotification("You need to accept terms.");
> }
5-尝试从特定FXML文件的Controller类处理按钮逻辑。 http://docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm
6-创建一个名为“GameEngine”的控制器类来完成有关游戏逻辑的所有计算。从按钮的handle动作事件方法中调用GameEngine的方法。
7-尝试使用面向对象的编程方法。 (多态性,继承,设计模式等)
答案 1 :(得分:1)
我会站在别人的肩膀上,并使用已经有一些结构的库。
通过这种方式,您可以遵循建立在他人经验基础上的模型,并使用他们的最佳实践,避免他们遇到的陷阱。
对于JavaFX,我知道FXGL library,它提供了一个很好的list of examples如何在JavaFX中构建游戏。
在YouTube上,您可以找到该库的多个examples和教程。
答案 2 :(得分:0)
首先,我想告诉您,我从未编写过Javafx应用程序,但我可能错了。
正如您正确指出的那样,start方法是Javafx应用程序的主要入口点,您可以从描述here的Javafx应用程序的解剖结构中看到。你可以在那里初始化你的游戏,但自然地,这些动作将比跑步开始晚发生。当玩家尝试移动时,你需要使用event handling来处理这种情况。
一旦您能够处理移动事件,您还可以检查移动是否正确,或者检查给定玩家的可能有效移动选项。我想建议您应该拥有自己的业务逻辑类,并避免将业务逻辑与事件处理混合,即使事件处理程序将调用业务逻辑方法。