From bb61a68f245d13bcc11b3c1ea7931a3373400c27 Mon Sep 17 00:00:00 2001 From: Joshua Date: Tue, 10 Dec 2024 17:26:27 +0100 Subject: [PATCH] Player names will now be passed correctly between classes. Added lots of comments in startLocalGame, startLocalGameLoadingScreen, startMultiplayerGame and JoinGame. --- src/JoinGame.java | 38 ++++++-- src/startLocalGame.java | 80 +++++++++++++---- src/startLocalGameLoadingScreen.java | 18 +++- src/startMultiplayerGame.java | 125 +++++++++++---------------- 4 files changed, 163 insertions(+), 98 deletions(-) diff --git a/src/JoinGame.java b/src/JoinGame.java index a12c083..47986d6 100644 --- a/src/JoinGame.java +++ b/src/JoinGame.java @@ -5,26 +5,49 @@ import java.awt.event.ActionListener; import java.io.IOException; import java.net.InetSocketAddress; +/** + * Das JoinGame Panel dient zum setzten des Ports/IP-Adresse. + * Anschließend kann das Verbinden Panel gezeigt werden. + */ public class JoinGame extends JPanel { + // Grafiken ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); + // Labels JLabel spielBeitretenLabel; JLabel ipLabel = new JLabel("IP-Adresse"); JLabel portLabel = new JLabel("Port"); + // Textfelder JTextField ipTextField = new JTextField(20); JTextField portTextField = new JTextField(20); + // Buttons JButton losButton = new JButton("Los!"); JButton backButton = new JButton(backButtonIcon); + // Font Font robotoFont = new Font("Roboto", Font.BOLD, 45); + /** + * Erstellt mittels Funktionsaufrufen das Panel. + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @param g int-Anzeige, ob es sich um "spiel erstellen" oder "spiel beitreten" handelt. + * @param playerType int-Anzeige, ob es sich um einen HumanPlayer,AIEasy... handelt. + * @param playerName Name des Spielers + */ public JoinGame(MainFrame frame,int g,int playerType,String playerName) { setLayout(null); buildPanel(frame,g,playerType,playerName); } + /** + * Erstellt das Panel. + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @param g int-Anzeige, ob es sich um "spiel erstellen" oder "spiel beitreten" handelt. + * @param playerType int-Anzeige, ob es sich um einen HumanPlayer,AIEasy... handelt. + * @param playerName Name des Spielers + */ private void buildPanel(MainFrame frame,int g,int playerType,String playerName) { if(g==1){ spielBeitretenLabel= new JLabel("Spiel beitreten"); @@ -42,8 +65,8 @@ public class JoinGame extends JPanel { ipLabel.setBounds(50, 125, 200, 30); ipTextField.setBounds(50, 150, 250, 50); } - portTextField.setBounds(50, 225, 250, 50); + portTextField.setBounds(50, 225, 250, 50); spielBeitretenLabel.setFont(robotoFont.deriveFont(50f)); @@ -54,11 +77,16 @@ public class JoinGame extends JPanel { add(ipTextField); add(portTextField); add(backButton); + // ActionListener für Buttons + // Um in das MultiplayerGame zurückzuwechseln. + backButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MultiplayerGame"); + } + }); - backButton.addActionListener(e -> frame.showPanel("MultiplayerGame")); - //losButton.addActionListener(e -> frame.showPanel("Verbinden")); - - + // Um das Verbinden Panel anzuzeigen und Daten an Backend weiterzureichen. losButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { diff --git a/src/startLocalGame.java b/src/startLocalGame.java index cf08aa9..1fb6792 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -2,12 +2,13 @@ import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -// TODO -// Evtl. ist Namen selber setzten noch unmöglich -// - +/** + * Das startLocalGame Panel dient dem Erstellen eines lokalen Spiels. + * Hier kann der Benutzer Spieler inklusive Namen und das Semester, in dem sich der Benutzer befindet, einstellen. + */ public class startLocalGame extends JPanel { // Player + // TODO: entfernen Player p1; Player p2; @@ -23,7 +24,7 @@ public class startLocalGame extends JPanel { ImageIcon aiPlayerNormalIcon = new ImageIcon("graphics/botPlayerNormal.png"); ImageIcon aiPlayerHardIcon = new ImageIcon("graphics/botPlayerHard.png"); - // Labels und Buttons + // Labels JLabel frameTitle = new JLabel("Lokales Spiel"); JLabel semesterLabel = new JLabel("Semester"); JLabel leftPlayerName = new JLabel("Name"); @@ -32,6 +33,7 @@ public class startLocalGame extends JPanel { JLabel rightPlayerIcon = new JLabel(aiPlayerEasyIcon); JLabel semesterCounterLabel = new JLabel(String.valueOf(semesterCounter)); + // Buttons JButton backButton = new JButton(backButtonIcon); JButton leftPlayerLeftButton = new JButton("<-"); JButton leftPlayerRightButton = new JButton("->"); @@ -42,12 +44,20 @@ public class startLocalGame extends JPanel { JButton startButton = new JButton("Start!"); JButton testButton = new JButton("Test"); + // Textfelder JTextField leftPlayerTextField = new JTextField(20); JTextField rightPlayerTextField = new JTextField(20); - // Methode zur Erstellung des Panels + /** + * Konstruktor der startLocalGame. + * Fügt Buttons, Textfelder und Label hinzu. + * Fügt ebenfalls ActionListeners hinzu, damit Buttons etc. ihre gewünschte Funktion haben + * + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + */ startLocalGame(MainFrame frame) { - setLayout(null); // Stelle das Layout des Panels ein + // Layout des Panels + setLayout(null); // Setze Komponentenpositionen frameTitle.setBounds(20, 20, 200, 30); @@ -107,8 +117,8 @@ public class startLocalGame extends JPanel { rightPlayerTextField.setText(rightPlayerNickname); add(rightPlayerTextField); - // ActionListener für Buttons + // Um das Semester zu erhöhen. semesterUpButton.addActionListener(e -> { if (semesterCounter < 6) { semesterCounter++; @@ -116,6 +126,7 @@ public class startLocalGame extends JPanel { } }); + // Um das Semester zu senken. semesterDownButton.addActionListener(e -> { if (semesterCounter > 1) { semesterCounter--; @@ -123,6 +134,7 @@ public class startLocalGame extends JPanel { } }); + // Um linken Player nach links zu "rotieren". leftPlayerLeftButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -131,6 +143,7 @@ public class startLocalGame extends JPanel { } }); + // Um linken Player nach rechts zu "rotieren". leftPlayerRightButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -139,6 +152,7 @@ public class startLocalGame extends JPanel { } }); + // Um rechten Player nach links zu "rotieren". rightPlayerLeftButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -147,6 +161,7 @@ public class startLocalGame extends JPanel { } }); + // Um den rechten Player nach rechts zu "rotieren". rightPlayerRightButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -155,9 +170,38 @@ public class startLocalGame extends JPanel { } }); - backButton.addActionListener(e -> frame.showPanel("MainMenu")); - testButton.addActionListener(e -> frame.showPanelSLG("GameBoard",1,p1,p2)); - //startButton.addActionListener(e -> frame.showPanelSLG("GameBoard", semesterCounter,p1, p2)); // TODO ECHTE FUNKTION EINFÜGEN + // Um Namen des linken Spielers zu speichern. + leftPlayerTextField.addActionListener(e -> { + leftPlayerNickname = leftPlayerTextField.getText(); + System.out.println("Linker Spielername geändert zu: " + leftPlayerNickname); // Debugging-Ausgabe + }); + + // Um Namen des linken Spielers zu speichern, auch wenn nicht Enter gedrückt wird. + leftPlayerTextField.addFocusListener(new java.awt.event.FocusAdapter() { + @Override + public void focusLost(java.awt.event.FocusEvent evt) { + leftPlayerNickname = leftPlayerTextField.getText(); + System.out.println("Linker Spielername geändert zu: " + leftPlayerNickname); // Debugging-Ausgabe + } + }); + + // Um zum MainMenu zu wechseln. + backButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MainMenu"); + } + }); + + // Um zum Gameboard zu wechseln. + testButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanelSLG("GameBoard",1,p1,p2); + } + }); + + // Um zum startLocalGameLoadingScreen zu wechseln und Daten an Backend weiterzureichen. startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -200,7 +244,8 @@ public class startLocalGame extends JPanel { }); } - + // Hilfsfunktionen + // Setzt das jeweils "nächste" Icon, wenn der leftPlayerLeftButton gedrückt wird. private void toggleLeftPlayerIconLeft() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { leftPlayerIcon.setIcon(aiPlayerHardIcon); @@ -213,6 +258,7 @@ public class startLocalGame extends JPanel { } } + // Setzt das jeweils "nächste" Icon, wenn der leftPlayerRightButton gedrückt wird. private void toggleLeftPlayerIconRight() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { leftPlayerIcon.setIcon(aiPlayerEasyIcon); @@ -225,6 +271,7 @@ public class startLocalGame extends JPanel { } } + // Setzt das jeweils "nächste" Icon, wenn der RightPlayerLeftButton gedrückt wird. private void toggleRightPlayerIconLeft() { if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { rightPlayerIcon.setIcon(aiPlayerHardIcon); @@ -235,6 +282,7 @@ public class startLocalGame extends JPanel { } } + // Setzt das jeweils "nächste" Icon, wenn der RightPlayerRightButton gedrückt wird. private void toggleRightPlayerIconRight() { if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { rightPlayerIcon.setIcon(aiPlayerNormalIcon); @@ -245,11 +293,11 @@ public class startLocalGame extends JPanel { } } - // Methode zum Aktualisieren der Textfelder basierend auf den ausgewählten Icons + // Aktualisiert die Textfelder basierend auf den Icons private void updateTextFields() { - // Linker Spieler + // Für Linken Spieler if (leftPlayerIcon.getIcon() == humanPlayerIcon) { - leftPlayerTextField.setText("Spieler 1"); + leftPlayerTextField.setText(leftPlayerNickname); } else if (leftPlayerIcon.getIcon() == aiPlayerEasyIcon){ leftPlayerTextField.setText("Einfach"); } else if (leftPlayerIcon.getIcon() == aiPlayerNormalIcon) { @@ -258,7 +306,7 @@ public class startLocalGame extends JPanel { leftPlayerTextField.setText("Schwer"); } - // Rechter Spieler + // Für Rechten Spieler if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon){ rightPlayerTextField.setText("Einfach"); } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { diff --git a/src/startLocalGameLoadingScreen.java b/src/startLocalGameLoadingScreen.java index c8f180a..a704f6b 100644 --- a/src/startLocalGameLoadingScreen.java +++ b/src/startLocalGameLoadingScreen.java @@ -1,9 +1,19 @@ import javax.swing.*; import java.awt.*; -//Kann evtl. als genereller LoadingScreen verwendet werden und nicht "nur" für localGame + +/** + * Das startLocalGameLoadingScreen Panel dient als "Überblende", während im Backend das Spiel erstellt wird. + * Hier wird lediglich Text angezeigt + */ public class startLocalGameLoadingScreen extends JPanel{ + /** + * Konstruktor der startLocalGameLoadingScreen. + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @param semesterCounter Ein Zähler, der das gewählte Semester speichert (hier unbenutzt) + */ startLocalGameLoadingScreen(MainFrame frame, int semesterCounter) { - // Layout setzen + + // Layout des Panels setLayout(new BorderLayout()); // Label mit dem Text erstellen @@ -11,8 +21,8 @@ public class startLocalGameLoadingScreen extends JPanel{ loadingLabel.setHorizontalAlignment(SwingConstants.CENTER); // Horizontal zentrieren loadingLabel.setVerticalAlignment(SwingConstants.CENTER); // Vertikal zentrieren - // Schriftgröße anpassen (optional) - loadingLabel.setFont(new Font("Arial", Font.PLAIN, 18)); + // Schriftgröße anpassen + loadingLabel.setFont(new Font("Roboto", Font.BOLD, 45)); // Label zum Panel hinzufügen add(loadingLabel, BorderLayout.CENTER); diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java index db94f47..5d5ef9b 100644 --- a/src/startMultiplayerGame.java +++ b/src/startMultiplayerGame.java @@ -2,14 +2,16 @@ import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -// TODO -// Evtl. ist Namen selber setzten noch unmöglich -// - +/** + * Das startMultiplayerGame Panel dient dem Erstellen eines Online Spiels. + * Hier kann der Benutzer Spieler inklusive Namen und das Semester, in dem sich der Benutzer befindet, einstellen. + */ public class startMultiplayerGame extends JPanel { + // Funktionshilfen - int semesterCounter = 1; // Semester Counter Label + int semesterCounter = 1; String PlayerNickname = "Spieler 1"; + // Grafiken ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png"); @@ -36,11 +38,18 @@ public class startMultiplayerGame extends JPanel { // Textfelder JTextField PlayerTextField = new JTextField(20); - // Konstruktor + /** + * Konstruktor der startLocalGame. + * Fügt Buttons, Textfelder und Label hinzu. + * Fügt ebenfalls ActionListeners hinzu, damit Buttons etc. ihre gewünschte Funktion haben + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + */ startMultiplayerGame(MainFrame frame) { - setLayout(null); // Setze das Layout für das Panel auf null - // Setze Komponentenpositionen und füge sie dem Panel hinzu + // Layout des Panels + setLayout(null); + + // Setze Komponentenpositionen frameTitle.setBounds(20, 20, 200, 30); add(frameTitle); @@ -57,7 +66,6 @@ public class startMultiplayerGame extends JPanel { semesterCounterLabel.setHorizontalAlignment(SwingConstants.CENTER); add(semesterCounterLabel); - // Füge Buttons hinzu und setze ihre Positionen backButton.setBounds(1380, 20, 80, 80); add(backButton); @@ -79,22 +87,12 @@ public class startMultiplayerGame extends JPanel { createGameButton.setBounds(1100, 550, 200, 50); add(createGameButton); - // Füge das Textfeld hinzu PlayerTextField.setBounds(50, 650, 250, 50); PlayerTextField.setText(PlayerNickname); add(PlayerTextField); - /* TODO: Muss in Lucas klasse rein. - public static void startOnlineGame(Class localPlayerClass, String localPlayerName, InetSocketAddress - address, int size) throws IOException { - */ - - //GameController.startOnlineGame(...); - - - - // ActionListener für Buttons - // SEMESTERBUTTONS + // ActionListener für Buttons + // Um das Semester zu erhöhen. semesterUpButton.addActionListener(e -> { if (semesterCounter < 6) { semesterCounter++; @@ -102,6 +100,7 @@ public class startMultiplayerGame extends JPanel { } }); + // Um das Semester zu senken. semesterDownButton.addActionListener(e -> { if (semesterCounter > 1) { semesterCounter--; @@ -109,28 +108,46 @@ public class startMultiplayerGame extends JPanel { } }); - // PLAYERTOGGLEBUTTONS + // Um Player nach links zu "rotieren". PlayerLeftButton.addActionListener(e -> { togglePlayerIconLeft(); updateTextFields(); }); + // Um Player nach rechts zu "rotieren". PlayerRightButton.addActionListener(e -> { togglePlayerIconRight(); updateTextFields(); }); - // ActionListener für den "Back" Button, um zum vorherigen Panel zurückzukehren + // Um Namen des linken Spielers zu speichern. + PlayerTextField.addActionListener(e -> { + PlayerNickname = PlayerTextField.getText(); + System.out.println("Linker Spielername geändert zu: " + PlayerNickname); // Debugging-Ausgabe + }); - backButton.addActionListener(e -> frame.showPanel("MainMenu")); - //joinGameButton.addActionListener(e -> frame.showPanelSMG("JoinGame",1)); - //createGameButton.addActionListener(e -> frame.showPanelSMG("JoinGame",0)); + // Um Namen des linken Spielers zu speichern, auch wenn nicht Enter gedrückt wird. + PlayerTextField.addFocusListener(new java.awt.event.FocusAdapter() { + @Override + public void focusLost(java.awt.event.FocusEvent evt) { + PlayerNickname = PlayerTextField.getText(); + System.out.println("Linker Spielername geändert zu: " + PlayerNickname); // Debugging-Ausgabe + } + }); + // Um zum MainMenu zu wechseln. + backButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MainMenu"); + } + }); + + // Um zu JoinGame mit richtigen Parametern zu wechseln. joinGameButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - //Parameter -> panelName, Spiel erstellen oder beitreten (int), Spielertyp(int 0-3), Spielername - if (PlayerIcon.getIcon() == humanPlayerIcon) { // TODO Wird name wirklich weitergegeben? + if (PlayerIcon.getIcon() == humanPlayerIcon) { frame.showPanelSMG("JoinGame",1,0, PlayerNickname); } else if ( PlayerIcon.getIcon() == aiPlayerEasyIcon) { frame.showPanelSMG("JoinGame",1,1, PlayerNickname); @@ -142,6 +159,7 @@ public class startMultiplayerGame extends JPanel { } }); + // Um zu JoinGame mit richtigen Parametern zu wechseln. createGameButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -157,51 +175,10 @@ public class startMultiplayerGame extends JPanel { } } }); - /* - startButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - frame.showPanelSLGLS("startLocalGameLoadingScreen", semesterCounter); //TODO - if (leftPlayerIcon.getIcon() == humanPlayerIcon) {// TODO Wird name wirklich weitergegeben? - if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); - } - } else if (leftPlayerIcon.getIcon() == aiPlayerEasyIcon) { - if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); - } - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); - } - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerEasy.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerNormalIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerMedium.class, GameController.semesterToBoardSize(semesterCounter)); - } else if (rightPlayerIcon.getIcon() == aiPlayerHardIcon) { - GameController.startLocalGame(HumanPlayer.class, leftPlayerNickname, SpecificAiPlayerHard.class, GameController.semesterToBoardSize(semesterCounter)); - } - } - - } - }); - */ } - // TOGGLE METHODEN + // Hilfsfunktionen + // Setzt das jeweils "nächste" Icon, wenn der PlayerLeftButton gedrückt wird. private void togglePlayerIconLeft() { if (PlayerIcon.getIcon() == humanPlayerIcon) { PlayerIcon.setIcon(aiPlayerHardIcon); @@ -214,6 +191,7 @@ public class startMultiplayerGame extends JPanel { } } + // Setzt das jeweils "nächste" Icon, wenn der PlayerRightButton gedrückt wird. private void togglePlayerIconRight() { if (PlayerIcon.getIcon() == humanPlayerIcon) { PlayerIcon.setIcon(aiPlayerEasyIcon); @@ -226,9 +204,10 @@ public class startMultiplayerGame extends JPanel { } } + // Aktualisiert die Textfelder basierend auf den Icons private void updateTextFields() { if (PlayerIcon.getIcon() == humanPlayerIcon) { - PlayerTextField.setText("Spieler 1"); + PlayerTextField.setText(PlayerNickname); } else if (PlayerIcon.getIcon() == aiPlayerEasyIcon){ PlayerTextField.setText("Einfach"); } else if (PlayerIcon.getIcon() == aiPlayerNormalIcon) { @@ -237,4 +216,4 @@ public class startMultiplayerGame extends JPanel { PlayerTextField.setText("Schwer"); } } -} +} \ No newline at end of file