游戏逻辑应该在JavaFx应用程序中的哪个位置?

时间:2017-05-12 10:57:56

标签: model-view-controller javafx

作为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和他们的游戏循环比这更有意义,我可以看到我会如何使用它。所以我的问题是:我在哪里将游戏逻辑放在我的应用程序中?

3 个答案:

答案 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来处理这种情况。

一旦您能够处理移动事件,您还可以检查移动是否正确,或者检查给定玩家的可能有效移动选项。我想建议您应该拥有自己的业务逻辑类,并避免将业务逻辑与事件处理混合,即使事件处理程序将调用业务逻辑方法。