Как бы я передать объект в класс Javafx для процедурного создания GUI? - PullRequest
0 голосов
/ 09 марта 2020

Итак, я осмотрелся и не смог найти ответ, который соответствует моему вопросу. Извиняюсь, если на этот вопрос был дан ответ.

Вот мои два класса: Класс игры

    package sample;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import java.awt.*;

public class Game extends Application{
    Player Player;
    Map Map;


    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Game");
        Group root = new Group();
        double x =0;
        double y = 0;
        for (Tile[] out: Map.Tiles_Array) {
            for (Tile in : out) {
                Rectangle rectangle = new Rectangle();
                rectangle.setHeight(10);
                rectangle.setWidth(10);
                rectangle.setX(x);
                rectangle.setY(y);
                root.getChildren().add(rectangle);
                x = x + 10;
            }
            y = y+ 10;
            x = 0;
        }



        VBox box = new VBox();
        root.getChildren().add(box);


        final Scene scene = new Scene(root);
        scene.setFill(null);
        primaryStage.setFullScreen(true);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public Game(Map map , Player player) {
        Map= map;
        Player = player;

    }
    public static void main(String[] args) {
        launch(args);

    }


    void update(){


    }
}

`` Класс MainMenu

   package sample;
import javafx.stage.Stage;
import java.util.Scanner;

public class MainMenu {

    public static void main(String[] args) {
        Print("***************************************************");
        Print("* Welcome to the best Object Orientated game ever *");
        Print("***************************************************");
        Print("What is your Name?");
        var Name = User_Input();
        Print("Are you Male Or Female (M/F)");
        char Gender = Check_Gender(User_Input().charAt(0));
        Print("Whats is your age");
        int Age = Exception_Catcher();
        Print("Great, Now you need to choose your avatar that you will play with......");
        Print("Your choice is between Archer(A), Knight(K) or Wizard(W)");
        Characters Chosen_Character = Check_Choice(User_Input().charAt(0));

        Print(Name + "   " + Gender +"     "+ Age + "     " + Chosen_Character.Name); // debugging
        Player player1 = new Player(Name,Age,Gender,Chosen_Character);
        var Map = new Map(25,25 , player1);
        Game My_Game = new Game(Map,player1);



    }
    private static void Print(String input){ // Prints string it is given
        System.out.println(input);
    }
    private static String User_Input(){ // returns Users response
        Scanner s = new Scanner(System.in);
        return s.nextLine();
    }
    private static char Check_Gender(char Letter){
        Letter = Character.toUpperCase(Letter);
        if(Letter == 'M'){return Letter;}
        else if(Letter == 'F'){return Letter;}
        else{
            Print("Choose M or F");
            return Check_Gender(User_Input().charAt(0));
        }
    }
    private static Characters Check_Choice(char Letter){
        Letter = Character.toUpperCase(Letter);
        if(Letter == 'A'){
            return new Archer(50,2,10);
        }
        else if(Letter == ('K')){
            return new Knight(100,1,20);
        }
        else if(Letter ==('W')){
            return new Wizard(25,5,5);
        }
        else{
            Print("Choose one of the correct options:Archer(A), Knight(K) or Wizard(W)");
            return Check_Choice(User_Input().charAt(0));
        }

    }
    private static int Exception_Catcher(){ //exception handling for when the user enters a non numerical value
        try{
             return Check_Age(Integer.parseInt(User_Input()));
        }
        catch (Exception e){
            Print("That's not a correct number format, try again");
            return Exception_Catcher();
        }
    }
    private static int Check_Age(int Age){

            if (Age <= 0) {
                Print("You are not alive apparently");
                return Exception_Catcher();
            } else if (Age > 120) {
                Print("You are not that old!! stop being silly");
                return Exception_Catcher();
            } else {
                return Age;
            }


    }

}

Однажды мой объект Map и Объект игрока создан, я хочу передать его в игру, чтобы процедурно создать графику для игры. Я попытался сконструировать класс Game для вызова метода Start, однако для него требуется этап, однако, когда я создаю этап по умолчанию и передаю его в качестве аргумента, он вызывает несколько исключений.

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Вам нужно начать игру с Application.launch(args), поэтому рассмотрите следующую структуру:

public class Game extends Application{

    private Player player;
    private Map map;

    @Override
    public void start(Stage primaryStage) throws Exception {

        MainMenu mm = new MainMenu();
        player = mm.getPlayer();
        map = mm.getMap();
        //rest of the code remains the same 
    }

    public static void main(String[] args) {
        launch(args);
    }
}

MainMenu принимает только пользовательский ввод и создает Player и Map:

public class MainMenu {

    private String name,age,gender,chosenCharacter;
    private final Player player;
    private final Map map;

    public MainMenu()  {
        getUserInput();
        player = new Player(name,age,gender,chosenCharacter);
        map = new Map(25,25 , player);
    }

    private void getUserInput(){ // returns Users response
        //todo
    }

    Player getPlayer() {
        return player;
    }

    Map getMap() {
        return map;
    }
}

Лучший вариант - получить пользовательский ввод с помощью GUI:

public class GetUserInput {

    private Player player;
    private Map map;
    private final TextField nameTf,  ageTf, genderTf,  characterTf;

     GetUserInput() {

         Dialog<Void> dialog = new Dialog<>();
         dialog.setTitle("Game Setting");
         dialog.setHeaderText("Please enter your prefrences");

         // Set the button types.
         ButtonType buttonType = new ButtonType("OK", ButtonData.OK_DONE);
         dialog.getDialogPane().getButtonTypes().addAll(buttonType, ButtonType.CANCEL);

         //Add event handler to ok button 
         Button okButton = (Button) dialog.getDialogPane().lookupButton(buttonType);
         okButton.setOnAction(e-> processInput());
         //todo hanlde response when cancel button is pressed 

         // Create labels and fields.
         GridPane grid = new GridPane();
         grid.setHgap(10);
         grid.setVgap(10);
         grid.setPadding(new Insets(20, 150, 10, 10));

         nameTf = new TextField();
         nameTf.setPromptText("Name");

         ageTf = new TextField();
         ageTf.setPromptText("Age");

         genderTf = new TextField();
         genderTf.setPromptText("Gender");

         characterTf = new TextField();
         characterTf.setPromptText("Character");
         //todo add validation to all text fields

         grid.add(new Label("Name:"), 0, 0);
         grid.add(nameTf, 1, 0);
         grid.add(new Label("Age:"), 0, 1);
         grid.add(ageTf, 1, 1);
         grid.add(new Label("Gender:"), 0, 2);
         grid.add(genderTf, 1, 2);
         grid.add(new Label("Character:"), 0, 3);
         grid.add(characterTf, 1, 3);

         dialog.getDialogPane().setContent(grid);

         // Request focus on the name field
         Platform.runLater(() -> nameTf.requestFocus());
         dialog.showAndWait();
    }

    private void processInput() {
        String name = nameTf.getText();
        String age = ageTf.getText();
        String gender = genderTf.getText();
        String chosenCharacter = characterTf.getText();

        player = new Player(name,age,gender,chosenCharacter);
        map = new Map(25,25 , player);
    }

    Player getPlayer() {
        return player;
    }

    Map getMap() {
        return map;
    }
}

и использовать его с помощью:

    GetUserInput getUserInput = new GetUserInput();
    player = getUserInput.getPlayer();
    map = getUserInput.getMap();
2 голосов
/ 09 марта 2020

Следует помнить, что ваш пользовательский интерфейс - это не просто случайная коллекция компонентов JavaFX, но и ваш код. Поэтому вы можете разместить свой код там, где вы будете sh. Ну, вроде.

Я бы создал объект для хранения большей части моего состояния, возможно, назвав эту Игру. Каждый существующий подкласс Event может ссылаться на это, чтобы решить, каким должно быть следующее состояние игры.

Если это игра типа zork (много комнат, предметы, которые можно забрать и выбросить, много выходов), я бы создайте массив комнат, каждая комната будет либо объектом комнаты, либо подклассом комнаты, в зависимости от сложности комнаты. Объекты будут просто базовым классом «Thing», с возможными подклассами в зависимости от того, что должна была делать вещь. Каждая комната будет описывать свои выходы в программу, которая создаст соответствующие кнопки. В некоторых комнатах игрок мог что-то делать внутри комнаты (возможно, "wa sh hands in the pool"), и для некоторых из них были бы ответы, а для других - ответы c ("Я не знаю как это сделать, Дейв. ").

Большинство кнопок предназначено для выхода. EventHandler для кнопки будет содержать информацию из комнаты о том, в какую новую комнату войти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...