diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/GameLoopManager.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/GameLoopManager.java deleted file mode 100644 index 44e421a..0000000 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/GameLoopManager.java +++ /dev/null @@ -1,87 +0,0 @@ -package de.thdeg.greiner.superpangworld.game; - -import de.thdeg.greiner.superpangworld.gameview.GameView; -import de.thdeg.greiner.superpangworld.graphics.*; - -import java.awt.*; -import java.awt.event.KeyEvent; -import java.util.Arrays; - -/** Der Manager zur Verwaltung der Spielschleife. */ -public class GameLoopManager { - - private static final boolean DIAGONAL_MOVEMENT_ALLOWED = false; - - private GameView gameView; - private Bubble bubble; - private Harpoon harpoon; - - private LevelProgressBar levelProgressBar; - private LevelLabel levelLabel; - private ScoreLabel scoreLabel; - - private Player player; - - /** Erzeugt den GameLoopManager mit Standardwerten. */ - public GameLoopManager() { - this.gameView = new GameView(); - this.gameView.setWindowTitle("Super Pang World"); - this.gameView.setStatusText("Andreas Greiner - Java Programmierung SS 2021"); - this.gameView.setWindowIcon("Target.png"); - - this.bubble = new Bubble(gameView); - this.harpoon = new Harpoon(gameView); - - this.levelProgressBar = new LevelProgressBar(gameView); - this.levelLabel = new LevelLabel(gameView); - this.scoreLabel = new ScoreLabel(gameView); - - this.player = new Player(gameView); - - gameView.setColorForBlockImage('k',Color.LIGHT_GRAY); - } - - /** Startet das Spiel. */ - public void startGame() { - while(true){ - updateUserInputs(); - - - bubble.updatePosition(); - bubble.addToCanvas(); - harpoon.addToCanvas(); - - levelProgressBar.addToCanvas(); - levelLabel.addToCanvas(); - scoreLabel.addToCanvas(); - - player.addToCanvas(); - - gameView.printCanvas(); - } - } - - void updateUserInputs() { - Integer[] gedruekteTasten = gameView.getKeyCodesOfCurrentlyPressedKeys(); - if(Arrays.stream(gedruekteTasten).anyMatch(k -> k == KeyEvent.VK_SPACE)){ - player.shoot(); - } - for (int keyCode : gedruekteTasten) { - switch(keyCode) { - case KeyEvent.VK_LEFT: - player.left(); - break; - case KeyEvent.VK_RIGHT: - player.right(); - break; - default: - continue; - } - if(!DIAGONAL_MOVEMENT_ALLOWED){ - return; - } - } - } - - -} diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/Start.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/bin/Start.java similarity index 80% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/Start.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/bin/Start.java index 6c86166..48fc2e5 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/Start.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/bin/Start.java @@ -1,6 +1,6 @@ package de.thdeg.greiner.superpangworld.game; -import de.thdeg.greiner.superpangworld.game.GameLoopManager; +import de.thdeg.greiner.superpangworld.managers.GameLoopManager; /** * Die Startklasse für das Spiel. diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameLoopManager.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameLoopManager.java new file mode 100644 index 0000000..dd2026b --- /dev/null +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameLoopManager.java @@ -0,0 +1,39 @@ +package de.thdeg.greiner.superpangworld.managers; + +import de.thdeg.greiner.superpangworld.gameview.GameView; +import de.thdeg.greiner.superpangworld.managers.GameObjectManager; +import de.thdeg.greiner.superpangworld.managers.GamePlayManager; +import de.thdeg.greiner.superpangworld.managers.InputManager; + +/** This class manages the main game loop of the game. */ +public class GameLoopManager { + private final GameView gameView; + private final InputManager inputManager; + private final GameObjectManager gameObjectManager; + private final GamePlayManager gamePlayManager; + + /** + * Creates the main loop. + */ + public GameLoopManager() { + this.gameView = new GameView(); + this.gameView.setWindowTitle("UFO-Fight"); + this.gameView.setStatusText("Andreas Berl - Java Programmierung SS 2021"); + this.gameView.setWindowIcon("Target.png"); + this.gameObjectManager = new GameObjectManager(gameView); + this.inputManager = new InputManager(gameView, gameObjectManager.getPlayer()); + this.gamePlayManager = new GamePlayManager(gameView, gameObjectManager); + } + + /** + * Starts the main loop of the game. + */ + public void startGame() { + while (true) { // The "Game-Loop" + gamePlayManager.updateGamePlay(); + inputManager.updateUserInputs(); + gameObjectManager.updateGameObjects(); + gameView.printCanvas(); + } + } +} \ No newline at end of file diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameObjectManager.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameObjectManager.java new file mode 100644 index 0000000..e3beefc --- /dev/null +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameObjectManager.java @@ -0,0 +1,86 @@ +package de.thdeg.greiner.superpangworld.managers; + +import de.thdeg.greiner.superpangworld.gameview.GameView; +import de.thdeg.greiner.superpangworld.graphics.immovable.*; +import de.thdeg.greiner.superpangworld.graphics.moveable.*; + +import java.awt.*; + +/** + * The manager handling the display and passive movement of the game objects. + */ +public class GameObjectManager { + + /** The GameView to display the objects */ + private GameView gameView; + + /** The game objects */ + private RoundBubble roundBubble; + private HexagonalBubble hexBubble; + private SpecialBubble specialBubble; + private Harpoon harpoon; + private LevelProgressBar levelProgressBar; + private LevelLabel levelLabel; + private ScoreLabel scoreLabel; + private LivesIcon livesIcon; + private Background background; + private Player player; + + /** + * Create a manager handling the display and passive movement of the game objects. + * @param gameView the GameView + */ + public GameObjectManager(GameView gameView){ + this.gameView = gameView; + + gameView.setColorForBlockImage('k', Color.LIGHT_GRAY); + + this.roundBubble = new RoundBubble(gameView); + this.hexBubble = new HexagonalBubble(gameView); + this.specialBubble = new SpecialBubble(gameView); + + this.harpoon = new Harpoon(gameView); + + this.levelProgressBar = new LevelProgressBar(gameView); + this.levelLabel = new LevelLabel(gameView); + this.scoreLabel = new ScoreLabel(gameView); + + this.livesIcon = new LivesIcon(gameView); + + this.background = new Background(gameView); + + this.player = new Player(gameView); + + } + + /** + * Add the objects to the canvas and handle update their positions. + */ + public void updateGameObjects(){ + background.addToCanvas(); + roundBubble.updatePosition(); + roundBubble.addToCanvas(); + hexBubble.updatePosition(); + hexBubble.addToCanvas(); + specialBubble.updatePosition(); + specialBubble.addToCanvas(); + harpoon.updatePosition(); + harpoon.addToCanvas(); + + levelProgressBar.addToCanvas(); + levelLabel.addToCanvas(); + scoreLabel.addToCanvas(); + livesIcon.addToCanvas(); + + player.addToCanvas(); + } + + /** + * Get the player object. + * @return the player + */ + public Player getPlayer(){ + return player; + } + +} diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GamePlayManager.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GamePlayManager.java new file mode 100644 index 0000000..69e47d3 --- /dev/null +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GamePlayManager.java @@ -0,0 +1,31 @@ +package de.thdeg.greiner.superpangworld.managers; + +import de.thdeg.greiner.superpangworld.gameview.GameView; + +/** + * The manager which handles the gameplay. + */ +public class GamePlayManager { + + /** The GameView on which the game is displayed */ + private GameView gameView; + /** The manager, which handles the game objects */ + private GameObjectManager gameObjectManager; + + /** + * Create the manager handling the gameplay. + * @param gameView + * @param gameObjectManager + */ + public GamePlayManager(GameView gameView, GameObjectManager gameObjectManager) { + this.gameView = gameView; + this.gameObjectManager = gameObjectManager; + } + + /** + * Handle the gameplay. + */ + public void updateGamePlay(){ + + } +} diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/InputManager.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/InputManager.java new file mode 100644 index 0000000..1097271 --- /dev/null +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/InputManager.java @@ -0,0 +1,58 @@ +package de.thdeg.greiner.superpangworld.managers; + +import de.thdeg.greiner.superpangworld.gameview.GameView; +import de.thdeg.greiner.superpangworld.graphics.moveable.Player; + +import java.awt.event.KeyEvent; +import java.util.Arrays; + +/** + * The manager which handles the user input and controls the player object. + */ +public class InputManager { + + /** The gameView, which displays the player object */ + private GameView gameView; + /** The player object */ + private Player player; + /** Flag, if diagonal movement is allowed */ + private static final boolean DIAGONAL_MOVEMENT_ALLOWED = false; + + /** + * Create a manager handling the user input + * @param gameView the GameView + * @param player the player object + */ + public InputManager(GameView gameView, Player player){ + this.gameView = gameView; + this.player = player; + } + + /** + * Read the user inputs and perform actions accordingly + */ + public void updateUserInputs() { + Integer[] gedruekteTasten = gameView.getKeyCodesOfCurrentlyPressedKeys(); + if(Arrays.stream(gedruekteTasten).anyMatch(k -> k == KeyEvent.VK_SPACE)){ + player.shoot(); + } + for (int keyCode : gedruekteTasten) { + switch(keyCode) { + case KeyEvent.VK_LEFT: + player.left(); + break; + case KeyEvent.VK_RIGHT: + player.right(); + break; + default: + continue; + } + if(!DIAGONAL_MOVEMENT_ALLOWED){ + return; + } + } + } + + + +} diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/LivesLabe.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/LivesLabe.java deleted file mode 100644 index 541e834..0000000 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/LivesLabe.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.thdeg.greiner.superpangworld.graphics; - -import de.thdeg.greiner.superpangworld.gameview.GameView; - -/** - * The label for the remaining lives count. - */ -public class LivesLabe extends GameObject{ - - /** - * Create a lives label with default values. - * - * @param gameView the gameView - */ - protected LivesLabe(GameView gameView) { - super(gameView); - } -} diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Bubble.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Bubble.java similarity index 56% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Bubble.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Bubble.java index 396fdab..11a2efd 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Bubble.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Bubble.java @@ -1,26 +1,11 @@ -package de.thdeg.greiner.superpangworld.graphics; +package de.thdeg.greiner.superpangworld.graphics.base; import de.thdeg.greiner.superpangworld.gameview.GameView; /** * A Bubble, which moves around on the screen and can be shot by the player. */ -public class Bubble extends GameObject{ - - /** The pixel art for the bubble */ - private final static String BUBBLE = - " RRRR \n"+ - " RWRRRR \n"+ - " RWRRRRRR \n"+ - " RWRRRRRRRR \n"+ - "RWRRRRRRRRRR\n"+ - "RWRRRRRRRRRR\n"+ - "RWRRRRRRRRWR\n"+ - "RRRRRRRRRWWR\n"+ - " RRRRRRRWWR \n"+ - " RRRRRWWR \n"+ - " RRRWWR \n"+ - " RRRR \n"; +public class Bubble extends GameObject { /** Flag, if the bubble flies from left to right */ private boolean flyFromLeftToRight; @@ -39,14 +24,6 @@ public class Bubble extends GameObject{ flyFromLeftToRight = true; } - /** - * Draws the bubble onto the canvas of the {@link GameView}. - */ - @Override - public void addToCanvas(){ - gameView.addBlockImageToCanvas(BUBBLE, getPosition().x, getPosition().y,size, rotation); - } - @Override public String toString() { return "Bubble:" + getPosition().toString(); @@ -57,7 +34,7 @@ public class Bubble extends GameObject{ */ @Override public void updatePosition(){ - if(flyFromLeftToRight && getPosition().x + width >= GameView.WIDTH){ + if(flyFromLeftToRight && getPosition().x + (width*size) >= GameView.WIDTH){ flyFromLeftToRight = false; }else if (!flyFromLeftToRight && getPosition().x <= 0){ flyFromLeftToRight = true; diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/GameObject.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/GameObject.java similarity index 73% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/GameObject.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/GameObject.java index fbff9be..9d471a9 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/GameObject.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/GameObject.java @@ -1,5 +1,6 @@ -package de.thdeg.greiner.superpangworld.graphics; +package de.thdeg.greiner.superpangworld.graphics.base; +import de.thdeg.greiner.superpangworld.managers.GamePlayManager; import de.thdeg.greiner.superpangworld.gameview.GameView; /** @@ -21,6 +22,9 @@ class GameObject { protected int width; /** The height of the game object. */ protected int height; + /** The responsible GamePlayManager */ + protected GamePlayManager gamePlayManager; + /** * Create a game object with default values. @@ -45,6 +49,14 @@ class GameObject { } + /** + * Set the responsible GamePlayManager. + * @param gamePlayManager the responsible GamePlayManager + */ + public void setGamePlayManager(GamePlayManager gamePlayManager){ + this.gamePlayManager = gamePlayManager; + } + /** * Get the position of the game object. * @return the position diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Position.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Position.java similarity index 97% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Position.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Position.java index d8c5d9b..7e631e1 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Position.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Position.java @@ -1,4 +1,4 @@ -package de.thdeg.greiner.superpangworld.graphics; +package de.thdeg.greiner.superpangworld.graphics.base; /** * Die Position eines Objekts auf einem Fenster anhand zweidimensionaler Koordinaten. diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Background.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/Background.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Background.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/Background.java diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/LevelLabel.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/LevelLabel.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/LevelLabel.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/LevelLabel.java diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/LevelProgressBar.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/LevelProgressBar.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/LevelProgressBar.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/LevelProgressBar.java diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/LivesIcon.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/LivesIcon.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/LivesIcon.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/LivesIcon.java diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/ScoreLabel.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/ScoreLabel.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/ScoreLabel.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/ScoreLabel.java diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Harpoon.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/Harpoon.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Harpoon.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/Harpoon.java diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/HexagonalBubble.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/HexagonalBubble.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/HexagonalBubble.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/HexagonalBubble.java diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Player.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/Player.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/Player.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/Player.java diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/RoundBubble.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/RoundBubble.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/RoundBubble.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/RoundBubble.java diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/SpecialBubble.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/SpecialBubble.java similarity index 100% rename from SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/SpecialBubble.java rename to SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/SpecialBubble.java diff --git a/SuperPangWorld/src/resources/Herz.png b/SuperPangWorld/src/resources/Herz.png deleted file mode 100644 index dc04122..0000000 Binary files a/SuperPangWorld/src/resources/Herz.png and /dev/null differ diff --git a/SuperPangWorld/src/resources/Player.png b/SuperPangWorld/src/resources/Player.png deleted file mode 100644 index 0f0154c..0000000 Binary files a/SuperPangWorld/src/resources/Player.png and /dev/null differ diff --git a/SuperPangWorld/src/resources/hexagon.png b/SuperPangWorld/src/resources/hexagon.png new file mode 100644 index 0000000..ed3a2f7 Binary files /dev/null and b/SuperPangWorld/src/resources/hexagon.png differ