diff --git a/Sound/hit.mp3 b/Sound/hit.mp3 new file mode 100644 index 0000000..2854416 Binary files /dev/null and b/Sound/hit.mp3 differ diff --git a/Sound/loosescreenWAH.mp3 b/Sound/loosescreenWAH.mp3 new file mode 100644 index 0000000..25c2f25 Binary files /dev/null and b/Sound/loosescreenWAH.mp3 differ diff --git a/Sound/plop.mp3 b/Sound/plop.mp3 new file mode 100644 index 0000000..421dd01 Binary files /dev/null and b/Sound/plop.mp3 differ diff --git a/Sound/shipdestroyed.mp3 b/Sound/shipdestroyed.mp3 new file mode 100644 index 0000000..a9f1545 Binary files /dev/null and b/Sound/shipdestroyed.mp3 differ diff --git a/src/BoardDisplay.java b/src/BoardDisplay.java index 4afa8c4..608a11f 100644 --- a/src/BoardDisplay.java +++ b/src/BoardDisplay.java @@ -6,13 +6,12 @@ import java.util.ArrayList; import java.util.List; /** - * TODO Klassenbeschreibung - * reines im frontend zeichnen für preview + * Dient dem Aufbau der Matrix (Spielfeld) und füllt diese mit Funktion + * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ public class BoardDisplay extends JPanel { private JButton[][] fields; private int gridSize; - //private List ships;//brauchen wir nicht mehr private Ship currentShip; private Player player; private boolean horizontal = false; @@ -20,31 +19,40 @@ public class BoardDisplay extends JPanel { private boolean enemyBoard; private Point mousePosition; + /** + * Fügt Buttons zu Liste hinzu und aktualisiert Feld durch Aufruf von paintFields + * @param button + * @author Joshua Kuklok + */ public void addShipButton(ShipButton button) { shipButtonList.add(button); paintFields(); } + /** + * Gibt currentShip zurück + * @return currentShip + * @author Lucas Bronson, Luca Conte, Joshua Kuklok + */ public Ship getCurrentShip() { return currentShip; } /** * Konstruktor der startLocalGame. - * TODO fertig schreiben - * @param gridSize - * @param player + * @param gridSize Die Größe des Spielfelds + * @param player Der Spieler + * @author Lucas Bronson */ public BoardDisplay(int gridSize, Player player, boolean enemyBoard) { super(new GridLayout(gridSize + 1, gridSize + 1)); // +1 wegen extra Zeile/Spalte this.fields = new JButton[gridSize][gridSize]; - //this.ships = new ArrayList<>(); this.shipButtonList = new ArrayList<>(); this.player = player; this.gridSize = gridSize; this.enemyBoard = enemyBoard; - System.out.println("Name in Boarddisplay: " + player.getName());//Testausgabe - // Erstellung von Spielfeld + + // Erstellung vom Spielfeld for (int i = 0; i <= gridSize; i++) { for (int j = 0; j <= gridSize; j++) { final int x = j - 1; // Temporäre Variable @@ -54,7 +62,7 @@ public class BoardDisplay extends JPanel { } else if (i == 0) { JLabel colLabel = new JLabel(String.valueOf(j)); colLabel.setHorizontalAlignment(SwingConstants.CENTER); - colLabel.setFont(new Font("Arial", Font.BOLD, 14)); + colLabel.setFont(new Font("Roboto", Font.BOLD, 14)); add(colLabel); } else if (j == 0) { JLabel rowLabel = new JLabel(String.valueOf((char) ('A' + i - 1))); @@ -69,32 +77,24 @@ public class BoardDisplay extends JPanel { field.setBorderPainted(true); fields[x][y] = field; add(field); - //field.addMouseListener(new MouseAdapter() { - // @Override - //public void mouseClicked(MouseEvent e) { - // if (SwingUtilities.isRightMouseButton(e)) { - // handleFieldClick(field); - // } - // } - //@Override - //public void mouseExited(MouseEvent e) { - // field.setBackground(Color.LIGHT_GRAY); - // } - // }); + // Um Mausinteraktionen zu ermöglichen (Rechts/- Linksklick, Hover) field.addMouseListener(new MouseAdapter() { + + // Um beim "Hovern" Position zu setzten und weiterzugeben. @Override public void mouseEntered(MouseEvent e) { mousePosition = new Point(x, y); paintFields(); } + // Um nach "wegbewegen" der Maus wieder zu entfärben @Override public void mouseExited(MouseEvent e) { paintFields(); - } + // Um Schiffe zu rotieren/platzieren @Override public void mouseClicked(MouseEvent e) { if (SwingUtilities.isRightMouseButton(e)) { @@ -102,19 +102,20 @@ public class BoardDisplay extends JPanel { } else if (SwingUtilities.isLeftMouseButton(e)) { Point o = new Point(x, y); handleFieldClick(o); + SoundHandler.playSound("plop"); } } }); } } } - // this.ships = new ArrayList(); } /** - * Aktuelles Schiff auswaehlen - * @param ship + * Aktuelles Schiff auswählen + * @param ship Schiff zum Auswählen + * @author Lucas Bronson, Joshua Kuklok */ public void selectCurrentShip(Ship ship) { this.currentShip = ship; @@ -122,11 +123,11 @@ public class BoardDisplay extends JPanel { } /** - * Zuruecksetzen von aktuellem Schiff und allen Schiffen des Spielers - * Danach blau faerben des Spielfeldes + * Zurücksetzen von aktuellem Schiff und allen Schiffen des Spielers. + * Danach blau färben des Spielfeldes + * @author Lucas Bronson, Joshua Kuklok */ public void resetAllShips() { - //ships.clear(); this.currentShip = null; for (Ship ship : player.getBoard().getShips()) { ship.resetPosition(); @@ -136,6 +137,7 @@ public class BoardDisplay extends JPanel { /** * Wechselt die Platzierungsrichtung zwischen horizontal und vertikal. + * @author Lucas Bronson, Joshua Kuklok */ private void togglePlacementDirection() { horizontal = !horizontal; @@ -147,6 +149,7 @@ public class BoardDisplay extends JPanel { /** * Handhabt das Platzieren eines Schiffs auf dem Spielfeld. * @param o Die Koordinaten des Klicks. + * @author Lucas Bronson, Luca Conte */ private void handleFieldClick(Point o) { System.out.println("CLICK " + o); @@ -157,20 +160,14 @@ public class BoardDisplay extends JPanel { this.player.enemy.shoot(o); } paintFields(); - //if(this.currentShip.isPlaced()){ - // this.currentShip. - // }; - // Beispiel: Setze ein Schiff bei einem Klick - //if (setShip(new Ship(3, "TestShip"), o, true,player)) { - // field.setBackground(Color.BLUE); // Visualisiere Schiff - //} } /** - * Faerbt das Spielfeld blau, ueberprueft ob das aktuelle Schiff null ist - * Faerbt eine Preview in das Spielfeld ein ob Schiff setzen moeglich ist - * Schiffe die gesetzt wurden werden grau gefaerbt - * Aufrufen von refreshButtonState um zu zeigen ob Button drueckbar ist + * Färbt das Spielfeld blau, überprüft, ob das aktuelle Schiff null ist. + * Färbt eine Preview in das Spielfeld ein, ob Schiff setzen möglich ist + * Schiffe die gesetzt wurden, werden grau gefärbt + * Aufrufen von refreshButtonState um zu zeigen, ob Button drückbar ist + * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ public void paintFields() { List test=new ArrayList<>(); @@ -222,13 +219,16 @@ public class BoardDisplay extends JPanel { switch (hit.getType()) { case HIT: fields[i][j].setBackground(Color.ORANGE); + //SoundHandler.playSound("hit"); break; case SUNK: + //SoundHandler.playSound("destroyed"); case VICTORY: fields[i][j].setBackground(Color.RED); break; case MISS: if (this.enemyBoard) { + //SoundHandler.playSound("miss"); fields[i][j].setBackground(Color.BLUE); } else { fields[i][j].setBackground(Color.CYAN); @@ -243,10 +243,11 @@ public class BoardDisplay extends JPanel { } } - - + /** + * Ruft paintFields auf, um Felder zu aktualisieren + * @author Luca Conte + */ public void refresh() { paintFields(); } - } diff --git a/src/GameBoard.java b/src/GameBoard.java index 1337b5b..a645f9e 100644 --- a/src/GameBoard.java +++ b/src/GameBoard.java @@ -2,13 +2,12 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseAdapter; import java.util.List; /** * Das GameBoard dient als Panel, in dem das tatsächliche Spiel stattfindet. * Der Benutzer kann hier seine Schiffe platzieren, das Spiel starten etc. + * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ public class GameBoard extends JPanel { @@ -38,8 +37,8 @@ public class GameBoard extends JPanel { JLabel frameTitle = new JLabel("GameBoard"); JLabel kontextText = new JLabel(kT1); - JButton backButton = new JButton(backButtonIcon); - // Eigene ModulButtons + // Buttons + JButton giveUpButton = new JButton("Aufgeben"); /** * Konstruktor von GameBoard. @@ -47,6 +46,7 @@ public class GameBoard extends JPanel { * @param semesterCounter Ausgewähltes Semester * @param p1 Erstes Spielerobjekt * @param p2 Zweites Spielerobjekt + * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ GameBoard(MainFrame frame, int semesterCounter,Player p1, Player p2) { this.p1 = p1; @@ -54,66 +54,45 @@ public class GameBoard extends JPanel { buildPanel(frame, semesterCounter); List shipsP1 =p1.getBoard().getShips(); List shipsP2 =p2.getBoard().getShips(); - backButton.addActionListener(e -> frame.showPanel("MainMenu")); - } -/* TODO löschen falls nicht gebraucht - private void updateButtonLabels(List ships,JToggleButton[] buttons) { - for(int i=0;i= 90) { - increasing = false; // Richtung ändern + value++; + if (value >= 90) { + increasing = false; } } else { - grayValue--; - if (grayValue <= 0) { - increasing = true; // Richtung ändern + value--; + if (value <= 0) { + increasing = true; } } } }); - /* - // Timer für pulsierenden Disco-Effekt - Timer timer = new Timer(50, new ActionListener() { - private float hue = 0; // Farbton-Wert für HSB-Farbmodell - - @Override - public void actionPerformed(ActionEvent e) { - // Farbe basierend auf dem Farbton-Wert berechnen - Color pulsierendeFarbe = Color.getHSBColor(hue, 0.8f, 0.8f); // Sättigung und Helligkeit fix - kontextText.setForeground(pulsierendeFarbe); - - // Farbton leicht verändern (Zyklus zwischen 0 und 1) - hue += 0.01f; - if (hue > 1) { - hue = 0; - } - } - });*/ - /** - * TODO Funktion beschreiben etc. + * Baut das grundlegende Spielboard * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. * @param semesterCounter Ausgewähltes Semester + * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ public void buildPanel(MainFrame frame, int semesterCounter) { // Hauptlayout - BorderLayout für die Anordnung der Komponenten @@ -130,7 +109,7 @@ public class GameBoard extends JPanel { headerPanel.setLayout(new BorderLayout()); headerPanel.add(kontextText, BorderLayout.WEST); kontextText.setFont(new Font("Roboto", Font.BOLD, 30)); //TODO setFont fixen - headerPanel.add(backButton, BorderLayout.EAST); + headerPanel.add(giveUpButton, BorderLayout.EAST); JPanel leftButtonsPanel = new JPanel(); leftButtonsPanel.setLayout(new GridLayout(7, 1)); // 6 Buttons untereinander @@ -172,12 +151,17 @@ public class GameBoard extends JPanel { ownBoardPanel.resetAllShips(); } }); - + // TODO buttons erst disablen wenn alle Schiffe platziert sind + // Um Bereit-Meldung and Backend zu geben, kontextText zu setzten und ready/reset Button zu deaktivieren readyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { kontextText.setText(kT2); p1.ready(); + if(true) { + readyButton.setEnabled(false); + resetButton.setEnabled(false); + } } }); @@ -211,13 +195,13 @@ public class GameBoard extends JPanel { add(leftButtonsPanel, BorderLayout.WEST); add(rightButtonsPanel, BorderLayout.EAST); add(headerPanel, BorderLayout.NORTH); - //add(centerPanel, BorderLayout.CENTER); add(namesAndBoardsPanel, BorderLayout.CENTER); timer.start(); } /** - * + * Aktualisiert Zustand(kontextText) je nach Zug + * @author Luca Conte */ public void refresh() { if (this.p1.myTurn) { diff --git a/src/HalloSchiffeVersenken.java b/src/HalloSchiffeVersenken.java index 066890e..ca25a89 100644 --- a/src/HalloSchiffeVersenken.java +++ b/src/HalloSchiffeVersenken.java @@ -1,21 +1,26 @@ +/** + * Hauptklasse über die der MainFrame gestartet wird + * @author Lucas Bronson, Ole Wachtel, Joshua Kuklok + */ public class HalloSchiffeVersenken { + /** + * Erstellt und setzt den Mainframe + * @param args Argumente an Main durch Konsole etc. + * @throws InterruptedException + */ public static void main(String[] args) throws InterruptedException { MainFrame mf = new MainFrame(); mf.setVisible(true); - - System.out.println("HelloSchiffeVersenekn"); - - - System.out.println("sound"); - SoundHandler.playSound("hit"); - - Thread.sleep(10000); - - SoundHandler.setSoundOn(false); - System.out.println("sound off"); - SoundHandler.playSound("hit"); - - } } + +/* +*TODO +* Alle Textfonts anpassen +* SOUND interrupt? +* BACKEND aufruf bei aufgeben +* check bevor ready ob alle schiffe platziert? +* testcode rausnehmen +* FidgetButton als surprise (button während spiels, der zufällig farbe wechseln kann und sounds abspielt) +*/ \ No newline at end of file diff --git a/src/JoinGame.java b/src/JoinGame.java index 76ad2c7..2cc484d 100644 --- a/src/JoinGame.java +++ b/src/JoinGame.java @@ -8,8 +8,10 @@ import java.net.InetSocketAddress; /** * Das JoinGame Panel dient zum setzten des Ports/IP-Adresse. * Anschließend kann das Verbinden Panel gezeigt werden. + * @author Lucas Bronson */ public class JoinGame extends JPanel { + // Grafiken ImageIcon backButtonIcon = new ImageIcon("graphics/backButton.png"); @@ -35,6 +37,7 @@ public class JoinGame extends JPanel { * @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 + * @author Lucas Bronson, Joshua Kuklok */ public JoinGame(MainFrame frame,int g,int playerType,String playerName) { setLayout(null); @@ -47,6 +50,7 @@ public class JoinGame extends JPanel { * @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 + * @author Lucas Bronson, Joshua Kuklok */ private void buildPanel(MainFrame frame,int g,int playerType,String playerName) { if(g==1){ @@ -61,7 +65,7 @@ public class JoinGame extends JPanel { portLabel.setBounds(50, 200, 200, 30); - if(g==1) { //Wenn man Spiel erstellen will werden IP-Felder nicht angezeigt. + if(g==1) { // Wenn man Spiel erstellen will, werden IP-Felder nicht angezeigt. ipLabel.setBounds(50, 125, 200, 30); ipTextField.setBounds(50, 150, 250, 50); } @@ -77,7 +81,8 @@ public class JoinGame extends JPanel { add(ipTextField); add(portTextField); add(backButton); - // ActionListener für Buttons + + // ActionListener für Buttons. // Um in das MultiplayerGame zurückzuwechseln. backButton.addActionListener(new ActionListener() { @Override diff --git a/src/LooseScreen.java b/src/LooseScreen.java new file mode 100644 index 0000000..28d105f --- /dev/null +++ b/src/LooseScreen.java @@ -0,0 +1,34 @@ +import java.awt.*; +import javax.swing.*; + +/** + * Klasse für Erstellung von looseScreen Objekten + * Dient zur Anzeige das ein Spiel verloren wurde + */ +public class LooseScreen extends JPanel { + JLabel looseLabel = new JLabel("Du hast Verloren"); + JButton okButton = new JButton("Zurück zum Hauptmenü"); + Font robotoFont = new Font("Roboto", Font.BOLD, 45); + + /** + * Konstruktor der LooseScreen Klasse + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @author Lucas Bronson + */ + public LooseScreen(MainFrame frame) { + setLayout(new BorderLayout()); + buildPanel(frame); + } + + /** + * Panel bauen/Objekte hinzufügen + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @author Lucas Bronson + */ + public void buildPanel(MainFrame frame) { + add(looseLabel); + okButton.setBounds(650,525,200,50); + looseLabel.setBounds(500,450,500,50); + looseLabel.setFont(robotoFont); + } +} diff --git a/src/MainFrame.java b/src/MainFrame.java index ea49617..79454d4 100644 --- a/src/MainFrame.java +++ b/src/MainFrame.java @@ -1,11 +1,10 @@ import javax.swing.*; import java.awt.*; -//TODO Generell button ausblenden anpassen - /** * Der MainFrame dient als Hub und Übergreifendes Fenster auf dem alle weiteren Panel angezeigt werden. * Dadurch werden keine weiteren Fenster geöffnet. + * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ public class MainFrame extends JFrame { @@ -21,11 +20,13 @@ public class MainFrame extends JFrame { // Von startLocalGameLoadingScreen an GameBoard int semesterCounter; // ---------- // + private GameBoard gameBoard; /** * Konstruktor von MainFrame. * Ermöglicht es Panel anzuzeigen. + * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ public MainFrame() { @@ -53,6 +54,7 @@ public class MainFrame extends JFrame { mainPanel.add(multiplayerGame, "MultiplayerGame"); mainPanel.add(coinToss, "coinToss"); mainPanel.add(verbinden, "Verbinden"); + // mainPanel.add(winLooseScreen, "WinLooseScreen"); // Hauptpanel in JFrame hinzufügen add(mainPanel); @@ -64,6 +66,7 @@ public class MainFrame extends JFrame { /** * Methode, um die Ansicht zu wechseln * @param panelName Name des anzuzeigenden Panels + * @author Joshua Kuklok */ public void showPanel(String panelName) { cardLayout.show(mainPanel, panelName); @@ -75,15 +78,16 @@ public class MainFrame extends JFrame { * @param num Hilfsvariable um abzugleichen, ob "Spiel erstellen" oder "Spiel beitreten" ausgewählt wurde * @param playerType Spielertyp(HumanPlayer, AIEasy etc.) * @param playerName Name des Spielers + * @author Lucas Bronson, Joshua Kuklok */ public void showPanelSMG(String panelName, int num, int playerType,String playerName) { this.localMult = num; JoinGame joinGame = new JoinGame(this, localMult, playerType, playerName); mainPanel.add(joinGame, panelName); - mainPanel.revalidate(); // Refresh + mainPanel.revalidate(); mainPanel.repaint(); - cardLayout.show(mainPanel, panelName); // Show the panel + cardLayout.show(mainPanel, panelName); } /** @@ -92,6 +96,7 @@ public class MainFrame extends JFrame { * @param semesterCounter Ausgewähltes Semester * @param p1 Erstes Spielerobjekt * @param p2 Zweites Spielerobjekt + * @author Lucas Bronson, Luca Conte, Joshua Kuklok */ public void showPanelSLG(String panelName,int semesterCounter, Player p1, Player p2) { this.semesterCounter = semesterCounter; @@ -100,24 +105,55 @@ public class MainFrame extends JFrame { mainPanel.add(gameBoard, panelName); mainPanel.revalidate(); mainPanel.repaint(); - cardLayout.show(mainPanel, panelName); // Show the panel + cardLayout.show(mainPanel, panelName); // Panel anzeigen } /** * Spezifische ShowPanel der startLocalGame Klasse * @param panelName Name des anzuzeigenden Panels * @param semesterCounter Ausgewähltes Semester + * @author Joshua Kuklok */ public void showPanelSLGLS(String panelName,int semesterCounter) { this.semesterCounter = semesterCounter; startLocalGameLoadingScreen LocalGameLoadingScreen = new startLocalGameLoadingScreen(this, semesterCounter); mainPanel.add(LocalGameLoadingScreen, panelName); - mainPanel.revalidate(); // Refresh + mainPanel.revalidate(); mainPanel.repaint(); - cardLayout.show(mainPanel, panelName); // Show the panel + cardLayout.show(mainPanel, panelName); // Panel anzeigen } + /** + * Spezifische ShowPanel für WinScreen Klasse + * @param panelName Name des anzuzeigenden Panels + * @author Lucas Bronson + */ + public void showPanelWin(String panelName){ + WinScreen winScreen = new WinScreen(this); + mainPanel.add(winScreen, panelName); + mainPanel.revalidate(); + mainPanel.repaint(); + cardLayout.show(mainPanel, panelName); + } + + /** + * Spezifische ShowPanel für LooseScreen Klasse + * @param panelName Name des anzuzeigenden Panels + * @author Lucas Bronson + */ + public void showPanelLoose(String panelName){ + LooseScreen looseScreen = new LooseScreen(this); + mainPanel.add(looseScreen,panelName); + mainPanel.revalidate(); + mainPanel.repaint(); + cardLayout.show(mainPanel, panelName); + } + + /** + * Aktualisiert das Spielfeld (kontextText) + * @author Luca Conte + */ public void refreshGameBoard() { if(this.gameBoard == null) { return; diff --git a/src/MainMenuController.java b/src/MainMenuController.java deleted file mode 100644 index c0ddcb1..0000000 --- a/src/MainMenuController.java +++ /dev/null @@ -1,35 +0,0 @@ -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.*; - -public class MainMenuController implements ActionListener { - private MainMenuView view; - private MainMenuModel model; - - public MainMenuController(MainMenuModel model, MainMenuView view) { - this.view = view; - this.model = model; - //this.view.getLocalButton().addActionListener(this); - //this.view.getMultiButton().addActionListener(this); - // this.view.getSoundButton().addActionListener(this); - } - - @Override - public void actionPerformed(ActionEvent e) { - //if (e.getSource() == view.getMultiButton()) { - // model.setGameMode("Multiplayer"); - // MultiMenuModel multiModel = new MultiMenuModel(); - // MultiMenuView multiView = new MultiMenuView(); - // MultiMenuController multiMenuController = new MultiMenuController(multiModel, multiView); - // view.addPanel(multiView.getMultiPanel(), "MultiMenu"); - // view.showPanel("MultiMenu"); - // }else if (e.getSource() == view.getSoundButton()) { - // view.toggleMute(); - // }else if(e.getSource() == view.getLocalButton()) { - model.setGameMode("LocalGame"); - //startLocalGame localGame = new startLocalGame(); - // view.addPanel(localGame.getLocalPanel(), "LocalMenu"); - // view.showPanel("LocalMenu"); - } - } -//} \ No newline at end of file diff --git a/src/MainMenuModel.java b/src/MainMenuModel.java deleted file mode 100644 index de9a8d4..0000000 --- a/src/MainMenuModel.java +++ /dev/null @@ -1,11 +0,0 @@ -public class MainMenuModel { - private String gameMode; - - public void setGameMode(String mode) { - this.gameMode = mode; - } - - public String getGameMode() { - return gameMode; - } -} \ No newline at end of file diff --git a/src/MainMenuView.java b/src/MainMenuView.java index af862f3..1624e83 100644 --- a/src/MainMenuView.java +++ b/src/MainMenuView.java @@ -1,9 +1,13 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.JFrame; import javax.swing.*; +/** + * Klasse zum Erstellen von MainMenu Objekten + * Dient als Hauptmenü für die Anwendung + * @author Lucas Bronson + */ public class MainMenuView extends JPanel { private JLabel titelLabel = new JLabel("Studium versenken"); @@ -15,11 +19,21 @@ public class MainMenuView extends JPanel { private ImageIcon soundIcon = new ImageIcon("graphics/sound button.png"); private ImageIcon muteIcon = new ImageIcon("graphics/sound button muted.png"); + /** + * Konstruktor der MainMenuView Klasse + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @author Lucas Bronson + */ public MainMenuView(MainFrame frame) { setLayout(null); buildPanel(frame); } + /** + * Methode zum Füllen des Panels, Objekte werden dem frame hinzugefügt + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @author Lucas Bronson + */ private void buildPanel(MainFrame frame) { lokalButton.setBounds(200, 200, 500, 500); multiButton.setBounds(800, 200, 500, 500); @@ -36,7 +50,7 @@ public class MainMenuView extends JPanel { add(multiButton); add(soundButton); - // Event Listener für Buttons + // ActionListener um vom Hauptmenü zum LocalGame Menü zu wechseln lokalButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -45,6 +59,7 @@ public class MainMenuView extends JPanel { } }); + // ActionListener um vom Hauptmenü zum MultiPlayerGame Menü zu wechseln multiButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -53,6 +68,7 @@ public class MainMenuView extends JPanel { } }); + //Aufruf von toggleMute, falls der soundButton geklickt wird soundButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -62,11 +78,18 @@ public class MainMenuView extends JPanel { }); } + /** + * Setzt Sound auf Stumm/Laut und ändert Grafik, sodass + * der aktuelle Stand der Grafik entspricht + * @author Lucas Bronson, Joshua Kuklok + */ private void toggleMute() { if (soundButton.getIcon() == soundIcon) { soundButton.setIcon(muteIcon); + SoundHandler.setSoundOn(false); } else { soundButton.setIcon(soundIcon); + SoundHandler.setSoundOn(true); } } } \ No newline at end of file diff --git a/src/MultiMenuController.java b/src/MultiMenuController.java deleted file mode 100644 index 79d8dfb..0000000 --- a/src/MultiMenuController.java +++ /dev/null @@ -1,22 +0,0 @@ -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import javax.swing.*; - -public class MultiMenuController implements ActionListener { - private MultiMenuView view; - private MultiMenuModel model; - - public MultiMenuController(MultiMenuModel model, MultiMenuView view) { - this.view = view; - this.model = model; - } - - @Override - public void actionPerformed(ActionEvent e) { - if (e.getSource() == view.getPlayerLeftButton()){ - view.togglePlayerIcon(); - }else if(e.getSource() == view.getPlayerRightButton()){ - view.togglePlayerIcon(); - } - } -} \ No newline at end of file diff --git a/src/MultiMenuModel.java b/src/MultiMenuModel.java deleted file mode 100644 index 4a8466b..0000000 --- a/src/MultiMenuModel.java +++ /dev/null @@ -1,11 +0,0 @@ -public class MultiMenuModel { - private String gameMode; - - public void setGameMode(String mode) { - this.gameMode = mode; - } - - public String getGameMode() { - return gameMode; - } -} \ No newline at end of file diff --git a/src/MultiMenuView.java b/src/MultiMenuView.java deleted file mode 100644 index b5e7fec..0000000 --- a/src/MultiMenuView.java +++ /dev/null @@ -1,83 +0,0 @@ -import java.awt.*; -import javax.swing.JFrame; -import javax.swing.*; - -public class MultiMenuView { - int semesterCounter = 1; - private JPanel multiPanel = new JPanel(null); - - private ImageIcon humanPlayerIcon = new ImageIcon("graphics/humanPlayer.png"); - private ImageIcon aiPlayerIcon = new ImageIcon("graphics/aiPlayer.png"); - - JButton PlayerLeftButton = new JButton("<-"); - JButton PlayerRightButton = new JButton("->"); - JButton semesterUpButton = new JButton("^"); - JButton semesterDownButton = new JButton("v"); - - JLabel semesterLabel = new JLabel("Semester"); - private JLabel titelLabel = new JLabel("Multiplayer"); - private JLabel PlayerIcon = new JLabel(humanPlayerIcon); - private JLabel PlayerName = new JLabel("Name"); - private JTextField PlayerTextField = new JTextField(20); - JLabel semesterCounterLabel = new JLabel(String.valueOf(semesterCounter)); - - private Font robotoFont = new Font("Roboto", Font.BOLD, 45); - public MultiMenuView() { - buildPanel(); - } - - - public void buildPanel(){ - titelLabel.setBounds(20,20,700,100); - PlayerIcon.setBounds(75, 400, 200, 128); - PlayerName.setBounds(50, 625, 200, 30); - PlayerTextField.setBounds(50, 650, 250, 50); - semesterCounterLabel.setBounds(725, 475, 50, 50); // zwischen den Up/Down-Buttons - PlayerLeftButton.setBounds(50, 450, 50, 50); - PlayerRightButton.setBounds(250, 450, 50, 50); - semesterLabel.setBounds(500, 400, 200, 30); - semesterUpButton.setBounds(700, 400, 50, 50); - semesterDownButton.setBounds(700, 550, 50, 50); - - - multiPanel.setLayout(null); - titelLabel.setFont(robotoFont.deriveFont(50f)); - semesterLabel.setFont(robotoFont.deriveFont(20f)); - - multiPanel.add(PlayerName); - multiPanel.add(titelLabel); - multiPanel.add(PlayerIcon); - multiPanel.add(PlayerTextField); - multiPanel.add(semesterCounterLabel); - multiPanel.add(semesterUpButton); - multiPanel.add(semesterDownButton); - multiPanel.add(PlayerLeftButton); - multiPanel.add(PlayerRightButton); - multiPanel.add(semesterLabel); - } - - public JPanel getMultiPanel() { - return multiPanel; - } - - //public void showMultiPanel(String panelName) { - // CardLayout cl = (CardLayout)mainPanel.getLayout(); - // cl.show(multiPanel, panelName); - //} - - public void togglePlayerIcon() { - if (PlayerIcon.getIcon() == humanPlayerIcon) { - PlayerIcon.setIcon(aiPlayerIcon); - } else { - PlayerIcon.setIcon(humanPlayerIcon); - } - } - - public JButton getPlayerLeftButton() { - return PlayerLeftButton; - } - - public JButton getPlayerRightButton() { - return PlayerRightButton; - } -} diff --git a/src/ShipButton.java b/src/ShipButton.java index bbc79fa..dcf4983 100644 --- a/src/ShipButton.java +++ b/src/ShipButton.java @@ -1,10 +1,21 @@ import javax.swing.*; import java.awt.*; +/** + * Das ShipButton Panel dient dem Erstellen eines lokalen Spiels. + * Hier kann der Benutzer Spieler inklusive Namen und das Semester, in dem sich der Benutzer befindet, einstellen. + * @author Lucas Bronson, Luca Conte, Joshua Kuklok + */ public class ShipButton extends JButton { private Ship ship; private BoardDisplay boardDisplay; + /** + * TODO fertig beschreiben + * @param ship + * @param boardDisplay + * @author Lucas Bronson, Luca Conte, Joshua Kuklok + */ public ShipButton(Ship ship, BoardDisplay boardDisplay) { super(ship.getName()); this.ship = ship; @@ -14,6 +25,12 @@ public class ShipButton extends JButton { }); } + /** + * Setzt Farbe der Modulbuttons. + * Verschiedene Farben für: + * Modul ausgewählt, platziert nicht platziert. + * @author Joshua Kuklok + */ public void refreshButtonState() { if (ship.isPlaced()) { setBackground(Color.LIGHT_GRAY); diff --git a/src/SoundHandler.java b/src/SoundHandler.java index 0db2f8c..b5d6a82 100644 --- a/src/SoundHandler.java +++ b/src/SoundHandler.java @@ -9,6 +9,10 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +/** + * Der SoundHandler dient zum Anlegen und Abspielen von Sounds + * @author Lucas Bronson, Luca Conte, Ole Wachtel, Joshua Kuklok + */ public class SoundHandler { private static boolean soundOn = true; @@ -17,9 +21,18 @@ public class SoundHandler { // Wenn fehler beim erstellen von .jar mit sound hier gucken private static HashMap sounds = new HashMap(Map.of( - "hit", "./Sound/water-drip.mp3" + "miss", "./Sound/water-drip.mp3", + "hit", "./Sound/hit.mp3", + "destroyed", "./Sound/hit.mp3", + "plop", "./Sound/plop.mp3", + "loose", "./Sound/loosescreenWAH.mp3" )); + /** + * Erstellt neuen Thread, um ausgewählten Sound abzuspielen + * @param soundName Name der Audiodatei, welche abgespielt werden soll + * @author Ole Wachtel, Luca Conte + */ public static void playSound(String soundName) { if (soundOn) { Thread thread = new Thread(new Runnable() { @@ -53,11 +66,21 @@ public class SoundHandler { } } - + /** + * TODO funktion beschreiben (potentiell nicht benötigte Funktion?) + * @param soundName + * @param path + * @author Ole Wachtel + */ static void add(String soundName, String path){ sounds.put(soundName, path); } + /** + * TODO funktion beschreiben (potentiell nicht benötigte Funktion?) + * @param sound + * @author Ole Wachtel + */ static void setSoundOn(boolean sound){ soundOn= sound; } diff --git a/src/Verbinden.java b/src/Verbinden.java index aeb086d..3e8cdbe 100644 --- a/src/Verbinden.java +++ b/src/Verbinden.java @@ -3,6 +3,7 @@ import java.awt.*; /** * Das Verbinden Panel dient als "Überblende", während im Backend das Spiel erstellt/ eine Verbindung hergestellt wird. + * @author Lucas Bronson */ public class Verbinden extends JPanel{ @@ -13,8 +14,9 @@ public class Verbinden extends JPanel{ Font robotoFont = new Font("Roboto", Font.BOLD, 45); /** - * Konstruktor der startLocalGame. + * Konstruktor der Verbinden Klasse. * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @author Lucas Bronson */ public Verbinden(MainFrame frame) { setLayout(null); @@ -24,6 +26,7 @@ public class Verbinden extends JPanel{ /** * Baut Panel auf. * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @author Lucas Bronson */ private void buildPanel(MainFrame frame) { setLayout(new BorderLayout()); diff --git a/src/WinScreen.java b/src/WinScreen.java new file mode 100644 index 0000000..f97dbe5 --- /dev/null +++ b/src/WinScreen.java @@ -0,0 +1,64 @@ +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.*; + +/** + * Klasse für Erstellung von winScreen Objekten + * Dient zur Anzeige des Sieges nachdem ein Spiel + * @author Lucas Bronson + */ +public class WinScreen extends JPanel { + JLabel winLabel = new JLabel("Du hast Gewonnen!"); + Font robotoFont = new Font("Roboto", Font.BOLD, 45); + JButton okButton = new JButton("Zurück zum Hauptmenü"); + + /** + * Konstruktor der WinScreen Klasse + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @author Lucas Bronson + */ + public WinScreen(MainFrame frame) { + setLayout(null); + buildPanel(frame); + } + + /** + * Panel bauen/Objekte hinzufuegen + * @param frame Der Mainframe der Anwendung über den alle Panels angezeigt werden. + * @author Lucas Bronson + */ + public void buildPanel(MainFrame frame) { + Timer timer = new Timer(5, new ActionListener() { + private float hue = 0; // Farbton-Wert für HSB-Farbmodell + + @Override + public void actionPerformed(ActionEvent e) { + // Farbe basierend auf dem Farbton-Wert berechnen + Color pulsierendeFarbe = Color.getHSBColor(hue, 0.8f, 0.8f); // Sättigung und Helligkeit fix + winLabel.setForeground(pulsierendeFarbe); + + // Farbton leicht verändern (Zyklus zwischen 0 und 1) + hue += 0.01f; + if (hue > 1) { + hue = 0; + } + } + }); + okButton.setBounds(650,525,200,50); + winLabel.setBounds(500,450,500,50); + timer.start(); // Timer starten + winLabel.setFont(robotoFont); + winLabel.setHorizontalAlignment(SwingConstants.CENTER); + //Zurückkehren zum Hauptmenü, wenn okButton gedrückt wird + okButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + frame.showPanel("MainMenu"); + } + + }); + add(winLabel); + add(okButton); + } +} diff --git a/src/coinToss.java b/src/coinToss.java index 87ed50b..ef3dafe 100644 --- a/src/coinToss.java +++ b/src/coinToss.java @@ -1,6 +1,6 @@ import javax.swing.*; import java.awt.*; - +// TODO Klasse löschen da nicht gebraucht public class coinToss extends JPanel { private int reihenfolge = 1; // 1 = Spieler 1 fängt an, 0 = Spieler 2 fängt an private Timer timer; diff --git a/src/startLocalGame.java b/src/startLocalGame.java index 01840ef..5253c78 100644 --- a/src/startLocalGame.java +++ b/src/startLocalGame.java @@ -6,10 +6,11 @@ import java.util.HashMap; /** * 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. + * @author Lucas Bronson, Joshua Kuklok */ public class startLocalGame extends JPanel { // Player - // TODO: entfernen + // TODO: entfernen (generell auch test button) Player p1; Player p2; @@ -55,6 +56,7 @@ public class startLocalGame extends JPanel { * 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. + * @author Lucas Bronson, Joshua Kuklok */ startLocalGame(MainFrame frame) { // Layout des Panels @@ -118,7 +120,7 @@ public class startLocalGame extends JPanel { rightPlayerTextField.setText(rightPlayerNickname); add(rightPlayerTextField); - // ActionListener für Buttons + // ActionListener für Buttons. // Um das Semester zu erhöhen. semesterUpButton.addActionListener(e -> { if (semesterCounter < 6) { @@ -198,7 +200,7 @@ public class startLocalGame extends JPanel { testButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - frame.showPanelSLG("GameBoard",1,p1,p2); + frame.showPanelWin("WinPanel"); } }); @@ -266,6 +268,7 @@ public class startLocalGame extends JPanel { /** * Setzt das jeweils "nächste" Icon, wenn der leftPlayerLeftButton gedrückt wird. + * @author Joshua Kuklok */ private void toggleLeftPlayerIconLeft() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { @@ -281,6 +284,7 @@ public class startLocalGame extends JPanel { /** * Setzt das jeweils "nächste" Icon, wenn der leftPlayerRightButton gedrückt wird. + * @author Joshua Kuklok */ private void toggleLeftPlayerIconRight() { if (leftPlayerIcon.getIcon() == humanPlayerIcon) { @@ -296,6 +300,7 @@ public class startLocalGame extends JPanel { /** * Setzt das jeweils "nächste" Icon, wenn der RightPlayerLeftButton gedrückt wird. + * @author Joshua Kuklok */ private void toggleRightPlayerIconLeft() { if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { @@ -309,6 +314,7 @@ public class startLocalGame extends JPanel { /** * Setzt das jeweils "nächste" Icon, wenn der RightPlayerRightButton gedrückt wird. + * @author Joshua Kuklok */ private void toggleRightPlayerIconRight() { if (rightPlayerIcon.getIcon() == aiPlayerEasyIcon) { @@ -322,6 +328,7 @@ public class startLocalGame extends JPanel { /** * Aktualisiert die Textfelder basierend auf den Icons + * @author Joshua Kuklok */ private void updateTextFields() { // Für Linken Spieler diff --git a/src/startLocalGameLoadingScreen.java b/src/startLocalGameLoadingScreen.java index a704f6b..28a4e07 100644 --- a/src/startLocalGameLoadingScreen.java +++ b/src/startLocalGameLoadingScreen.java @@ -4,12 +4,14 @@ import java.awt.*; /** * Das startLocalGameLoadingScreen Panel dient als "Überblende", während im Backend das Spiel erstellt wird. * Hier wird lediglich Text angezeigt + * @author Joshua Kuklok */ 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) + * @author Joshua Kuklok */ startLocalGameLoadingScreen(MainFrame frame, int semesterCounter) { diff --git a/src/startMultiplayerGame.java b/src/startMultiplayerGame.java index c9b748a..dcb6530 100644 --- a/src/startMultiplayerGame.java +++ b/src/startMultiplayerGame.java @@ -5,6 +5,7 @@ import java.awt.event.ActionListener; /** * 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. + * @author Joshua Kuklok */ public class startMultiplayerGame extends JPanel { @@ -43,6 +44,7 @@ public class startMultiplayerGame extends JPanel { * 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. + * @author Joshua Kuklok */ startMultiplayerGame(MainFrame frame) { @@ -164,7 +166,7 @@ public class startMultiplayerGame extends JPanel { @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",0,0, PlayerNickname); } else if ( PlayerIcon.getIcon() == aiPlayerEasyIcon) { frame.showPanelSMG("JoinGame",0,1, PlayerNickname); @@ -181,6 +183,7 @@ public class startMultiplayerGame extends JPanel { /** * Setzt das jeweils "nächste" Icon, wenn der PlayerLeftButton gedrückt wird. + * @author Joshua Kuklok */ private void togglePlayerIconLeft() { if (PlayerIcon.getIcon() == humanPlayerIcon) { @@ -196,6 +199,7 @@ public class startMultiplayerGame extends JPanel { /** * Setzt das jeweils "nächste" Icon, wenn der PlayerRightButton gedrückt wird. + * @author Joshua Kuklok */ private void togglePlayerIconRight() { if (PlayerIcon.getIcon() == humanPlayerIcon) { @@ -211,6 +215,7 @@ public class startMultiplayerGame extends JPanel { /** * Aktualisiert die Textfelder basierend auf den Icons + * @author Joshua Kuklok */ private void updateTextFields() { if (PlayerIcon.getIcon() == humanPlayerIcon) {