Więc rozglądałem się i nie mogłem znaleźć odpowiedzi, która pasowałaby do mojego pytania. Przepraszamy, jeśli udzielono odpowiedzi na to pytanie.

Oto moje dwie klasy: Klasa gry

    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(){


    }
}

`` Klasa 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;
            }


    }

}

Po utworzeniu obiektu mapy i obiektu gracza chcę przekazać je do gry, aby proceduralnie utworzyć grafikę do gry. Próbowałem skonstruować klasę Game, aby wywołać metodę Start, jednak wymaga ona „Stage”, jednak kiedy tworzę domyślny etap i przekazuję go jako argument, zgłasza wiele wyjątków.

0
Dawid 9 marzec 2020, 23:00

2 odpowiedzi

Najlepsza odpowiedź

Musisz rozpocząć grę od Application.launch(args), więc rozważ następującą strukturę:

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 otrzymuje tylko dane wejściowe użytkownika i tworzy Player i 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;
    }
}

Lepszą opcją jest uzyskanie danych wejściowych użytkownika za pomocą graficznego interfejsu użytkownika:

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;
    }
}

I użyj go przez:

    GetUserInput getUserInput = new GetUserInput();
    player = getUserInput.getPlayer();
    map = getUserInput.getMap();
2
c0der 11 marzec 2020, 07:05

Należy pamiętać, że interfejs użytkownika nie jest tylko przypadkową kolekcją komponentów JavaFX, ale zawiera również kod. Dlatego możesz umieścić swój kod w dowolnym miejscu. Cóż, w pewnym sensie.

Stworzyłbym obiekt do przechowywania większości mojego stanu, być może nazywając tę Grę. Każda istniejąca podklasa wydarzenia może się do tego odwoływać, aby zdecydować, jaki powinien być następny stan gry.

Jeśli jest to gra podobna do zorków (wiele pokoi, przedmioty do podniesienia i odrzucenia, wiele wyjść) utworzyłbym tablicę Pokoju, każdy pokój byłby albo obiektem Pokoju, albo podklasą Pokoju, w zależności od tego, jak trudny jest pokój jest. Obiekty byłyby po prostu podstawową klasą „Rzecz”, z możliwymi podklasami zależnymi od tego, co ma robić. Każdy pokój opisywałby swoje wyjścia do programu, który tworzyłby odpowiednie przyciski. Niektóre pokoje pozwalałyby graczowi na zrobienie czegoś wewnątrz pokoju (być może „myje ręce w basenie”), a dla niektórych z nich byłyby odpowiedzi, a dla innych odpowiedzi ogólne („Nie wiem jak to zrobić, Dave . ”).

Większość przycisków byłaby przeznaczona do wyjść. EventHandler dla przycisku będzie zawierał informacje z pokoju o tym, do którego nowego pokoju wejść.

2
NomadMaker 9 marzec 2020, 20:30