From 3d389fd180944d01992fd1a6729da3daf10f1ac2 Mon Sep 17 00:00:00 2001 From: agreiner Date: Fri, 25 Jun 2021 17:57:30 +0200 Subject: [PATCH] Added alternative bubbles and start/end screen --- .../game/managers/GameObjectManager.java | 29 ++- .../game/managers/GamePlayManager.java | 246 ++++++++++++------ .../game/managers/LevelManager.java | 58 +++++ .../superpangworld/graphics/base/Bubble.java | 79 +++--- .../graphics/base/CollidingGameObject.java | 5 + .../graphics/base/GameObject.java | 7 +- .../graphics/helper/HelperValues.java | 11 +- .../graphics/immovable/GameOverlay.java | 61 +++++ .../graphics/moveable/Harpoon.java | 12 +- .../graphics/moveable/HexagonalBubble.java | 40 ++- .../graphics/moveable/PlayerObject.java | 6 +- .../graphics/moveable/RoundBubble.java | 66 ++++- .../graphics/moveable/SpecialBubble.java | 67 ++++- .../Programmieren_2_jar/Programmieren 2.jar | Bin 728398 -> 735483 bytes .../game/managers/GameObjectManager.class | Bin 4868 -> 5320 bytes .../game/managers/GamePlayManager.class | Bin 7045 -> 10238 bytes ...nager$NoMoreLevelsAvailableException.class | Bin 0 -> 565 bytes .../game/managers/LevelManager.class | Bin 0 -> 1486 bytes .../superpangworld/graphics/base/Bubble.class | Bin 5305 -> 5699 bytes .../graphics/base/CollidingGameObject.class | Bin 1993 -> 2404 bytes .../graphics/base/GameObject.class | Bin 3497 -> 3731 bytes .../graphics/helper/HelperValues.class | Bin 715 -> 723 bytes .../graphics/immovable/GameOverlay.class | Bin 0 -> 1726 bytes .../graphics/moveable/Harpoon.class | Bin 3562 -> 3121 bytes .../graphics/moveable/HexagonalBubble.class | Bin 1989 -> 3987 bytes .../graphics/moveable/PlayerObject.class | Bin 4518 -> 4518 bytes .../graphics/moveable/RoundBubble.class | Bin 2658 -> 5436 bytes .../graphics/moveable/SpecialBubble.class | Bin 1974 -> 3264 bytes 28 files changed, 539 insertions(+), 148 deletions(-) create mode 100644 SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/LevelManager.java create mode 100644 SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/GameOverlay.java create mode 100644 out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/game/managers/LevelManager$NoMoreLevelsAvailableException.class create mode 100644 out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/game/managers/LevelManager.class create mode 100644 out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/immovable/GameOverlay.class diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameObjectManager.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameObjectManager.java index 6b20ec5..d04ad84 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameObjectManager.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GameObjectManager.java @@ -23,6 +23,7 @@ class GameObjectManager { private final LivesLabel livesLabel; private final Background background; private final GameFrame frame; + private final GameOverlay gameOverlay; private final PlayerObject playerObject; @@ -46,6 +47,16 @@ class GameObjectManager { background = new Background(gameView); frame = new GameFrame(gameView); playerObject = new PlayerObject(gameView); + gameOverlay = new GameOverlay(gameView); + } + + /** + * Clear all game object lists. + */ + public void clearAll(){ + gameObjects.clear(); + bubbles.clear(); + harpoons.clear(); } /** @@ -62,6 +73,7 @@ class GameObjectManager { gameObjects.add(livesLabel); gameObjects.add(playerObject); gameObjects.addAll(bubbles); + gameObjects.add(gameOverlay); gameObjects.forEach(gameObject ->{ gameObject.update(); @@ -71,6 +83,7 @@ class GameObjectManager { /** * Get the player object. + * * @return the player */ public PlayerObject getPlayerObject(){ @@ -79,6 +92,7 @@ class GameObjectManager { /** * Get the bubbles. + * * @return the bubbles */ public LinkedList getBubbles() { @@ -87,14 +101,16 @@ class GameObjectManager { /** * Get the level label. + * * @return the level label */ public LevelLabel getLevelLabel(){ - return this.levelLabel; + return levelLabel; } /** * Get the lives label. + * * @return the lives label */ public LivesLabel getLivesLabel() { @@ -103,6 +119,7 @@ class GameObjectManager { /** * Get the score label. + * * @return the score label */ public ScoreLabel getScoreLabel() { @@ -111,6 +128,7 @@ class GameObjectManager { /** * Get the level progress bar. + * * @return the level progress bar */ public LevelProgressBar getLevelProgressBar(){ @@ -119,10 +137,19 @@ class GameObjectManager { /** * Get the harpoons. + * * @return the harpoons */ public LinkedList getHarpoons() { return harpoons; } + /** + * Get the game overlay. + * + * @return the game overlay + */ + public GameOverlay getGameOverlay(){ + return gameOverlay; + } } diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GamePlayManager.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GamePlayManager.java index b9d1c8c..a205b9d 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GamePlayManager.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/GamePlayManager.java @@ -11,9 +11,9 @@ import de.thdeg.greiner.superpangworld.graphics.moveable.HexagonalBubble; import de.thdeg.greiner.superpangworld.graphics.moveable.RoundBubble; import de.thdeg.greiner.superpangworld.graphics.moveable.SpecialBubble; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Random; +import java.awt.*; +import java.util.*; +import java.util.List; /** * The manager which handles the gameplay. @@ -26,11 +26,20 @@ public class GamePlayManager { private final GameObjectManager gameObjectManager; /** Generator for random values */ private final Random random; - /** Das erste Level */ + /** The current level */ private Level level; - /** Der Spieler */ - private final Player player; - + /** The player */ + private Player player; + /** The level manager */ + private LevelManager levelManager; + /** Flag, if bubbles should be spawned */ + private boolean spawnBubbles; + /** Flag, if all bubbles should be destroyed */ + private boolean destroyAllBubbles; + /** Flag, is a special bubble is currently present */ + public boolean specialBubblePresent; + /** Flag, if the bubble movement is froze */ + public boolean movementFroze; /** * Create the manager handling the gameplay. @@ -39,47 +48,130 @@ public class GamePlayManager { * @param gameObjectManager the manager handling the game objects */ public GamePlayManager(GameView gameView, GameObjectManager gameObjectManager) { + random = new Random(); this.gameView = gameView; this.gameObjectManager = gameObjectManager; - level = new Level(1,10000,10000); - player = new Player(this.level); - random = new Random(); - // Set HUD elements + boolean easyDifficulty = gameView.showSimpleStartScreen("Super Pang World","Start the game"); + + initializeGame(easyDifficulty); + initializeLevel(); + } + + /** + * Initialize the game. + * + * @param easyDifficulty the game difficulty + */ + private void initializeGame(boolean easyDifficulty){ + gameObjectManager.clearAll(); + levelManager = new LevelManager(easyDifficulty); + try { + level = levelManager.getNextLevel(); + } catch (LevelManager.NoMoreLevelsAvailableException e) { + System.out.println("No levels were generated, exiting program"); + System.exit(-1); + } + player = new Player(level); gameObjectManager.getPlayerObject().setGamePlayManager(this); + } + + /** + * Initialize the level. + */ + private void initializeLevel(){ + // Set Gameplay variables + spawnBubbles = true; + destroyAllBubbles = false; + specialBubblePresent = false; + movementFroze = false; + // Update HUD + updateHUD(); + } + + /** + * Loose a life and remove all bubbles + */ + public void looseLife(){ + player.lives--; + gameObjectManager.getLivesLabel().setLifeCount(player.lives); + gameObjectManager.getBubbles().clear(); + specialBubblePresent = false; + spawnBubbles = true; + gameObjectManager.getGameOverlay().flashScreen(Color.red,100); + } + + /** + * Switch to the next level or end the game if every level was played. + */ + private void nextLevel(){ + try { + level = levelManager.getNextLevel(); + initializeLevel(); + } catch (LevelManager.NoMoreLevelsAvailableException e) { + gameView.showEndScreen("You won!"); + boolean easyDifficulty = gameView.showSimpleStartScreen("Super Pang World","Start the game"); + initializeGame(easyDifficulty); + initializeLevel(); + } + } + + /** + * Update all HUD elements + */ + private void updateHUD(){ gameObjectManager.getLevelLabel().setLevel(level.number); gameObjectManager.getLivesLabel().setLifeCount(player.lives); gameObjectManager.getScoreLabel().setScore(player.score); + double progress = (player.score- level.neededOverallScore+ level.neededLevelScore * 1.0) / level.neededLevelScore; + gameObjectManager.getLevelProgressBar().setLevelProgress(Math.min((int)(progress*100),100)); } /** * Handle the gameplay. */ public void updateGamePlay(){ - if(gameView.timerExpired("SpawnBubble","GamePlayManager")){ - RoundBubble roundBubble = new RoundBubble(gameView, new ArrayList<>(Collections.singletonList(gameObjectManager.getPlayerObject()))); - roundBubble.setGamePlayManager(this); - gameObjectManager.getBubbles().add(roundBubble); - gameView.setTimer("SpawnBubble","GamePlayManager",30000000); + updateHUD(); + + if(player.score>=level.neededOverallScore){ + nextLevel(); + } + + if(gameView.timerExpired("SpawnBubble","GamePlayManager" ) && spawnBubbles && !movementFroze){ + addRandomBubble(); + gameView.setTimer("SpawnBubble","GamePlayManager",3000); + } + + if(movementFroze && gameView.timerExpired("MovementFroze","GamePlayManager")){ + movementFroze = false; + } + + if(destroyAllBubbles && gameView.timerExpired("DestroyAllBubbles","GamePlayManager")){ + List bubblesCopy = new ArrayList<>(gameObjectManager.getBubbles()); + for(Bubble bubble: bubblesCopy){ + destroy(bubble); + } + gameView.setTimer("DestroyAllBubbles","GamePlayManager",500); } } /** - * Shoot a harpoon starting at a given position. - * - * @param startPosition the start position - * @return if a harpoon was shot or not + * Start the timer to destroy all bubbles. */ - public boolean shootHarpoon(Position startPosition){ - if(gameView.timerExpired("ShootHarpoon","GamePlayManager") && gameObjectManager.getHarpoons().size()<2){ - ArrayList collidableGameObjects = new ArrayList<>(gameObjectManager.getBubbles()); - Harpoon harpoon = new Harpoon(gameView,collidableGameObjects); - harpoon.getPosition().setTo(startPosition.x+16, startPosition.y-15); - harpoon.setGamePlayManager(this); - gameObjectManager.getHarpoons().add(harpoon); - gameView.setTimer("ShootHarpoon","GamePlayManager",300); - return true; - } - return false; + public void destroyAllBubbles(){ + gameView.setTimer("DestroyAllBubbles","GamePlayManager",500); + spawnBubbles = false; + destroyAllBubbles = true; + movementFroze = false; + } + + /** + * Freeze the bubble movement. + * + * @param freezeTime the freeze duration + */ + public void freezeMovement(int freezeTime){ + movementFroze = true; + gameView.setTimer("MovementFroze","GamePlayManager",freezeTime); } /** @@ -97,40 +189,21 @@ public class GamePlayManager { * @param bubble the bubble to remove */ public void destroy(Bubble bubble){ - if(gameObjectManager.getBubbles().contains(bubble)) { - if (bubble.getSize() > 1.25) { - addRandomBubble(bubble.getSize() / 2, bubble.getSpeedInPixel(), bubble.getPosition(), false); - addRandomBubble(bubble.getSize() / 2, bubble.getSpeedInPixel(), bubble.getPosition(), false); - } - - gameObjectManager.getBubbles().remove(bubble); - player.score += bubble.getBurstScore(); - updateHud(); - if(player.score>=level.neededOverallScore){ - switchLevel(); - } - } + bubble.destroy(); + gameObjectManager.getBubbles().remove(bubble); + player.score += bubble.getBurstScore(); } /** - * Update all HUD elements + * Destroy a bubble colliding with a harpoon. + * + * @param harpoon the harpoon + * @param bubble the bubble */ - private void updateHud(){ - gameObjectManager.getScoreLabel().setScore(player.score); - double progress = (player.score- level.neededOverallScore+ level.neededLevelScore * 1.0) / level.neededLevelScore; - gameObjectManager.getLevelProgressBar().setLevelProgress(Math.min((int)(progress*100),100)); - gameObjectManager.getLevelLabel().setLevel(level.number); - } - - /** - * Switch the current level. - */ - private void switchLevel(){ - if(level.number==99){ - System.out.println("You won!"); - }else{ - level = new Level(level.number+1,10000,(level.number+1)*10000); - updateHud(); + public void destroy(Harpoon harpoon, Bubble bubble){ + if(gameObjectManager.getHarpoons().contains(harpoon) && gameObjectManager.getBubbles().contains(bubble)){ + destroy(harpoon); + destroy(bubble); } } @@ -139,21 +212,15 @@ public class GamePlayManager { * - 60% normal bubble * - 30% hexagonal bubble * - 10% special bubble - * - * TODO: Integrate all different bubbles, not only the normal red bubble - * - * @param size the size of the bubble - * @param speedInPixel the speed of the bubble - * @param position the position of the bubble - * @param spawning the flag if the bubble gets created in spawning mode */ - private void addRandomBubble(double size, double speedInPixel, Position position, boolean spawning){ - int randomNumber = random.nextInt(59); + private void addRandomBubble(){ + int randomNumber = specialBubblePresent ? random.nextInt(90) : random.nextInt(100); ArrayList collidableGameObjects = new ArrayList<>(); collidableGameObjects.add(gameObjectManager.getPlayerObject()); collidableGameObjects.addAll(gameObjectManager.getHarpoons()); + if(randomNumber<60){ - RoundBubble roundBubble = new RoundBubble(gameView, collidableGameObjects,size,speedInPixel,position,spawning); + RoundBubble roundBubble = new RoundBubble(gameView, collidableGameObjects); roundBubble.setGamePlayManager(this); gameObjectManager.getBubbles().add(roundBubble); }else if(randomNumber<90){ @@ -164,15 +231,42 @@ public class GamePlayManager { SpecialBubble specialBubble = new SpecialBubble(gameView, collidableGameObjects); specialBubble.setGamePlayManager(this); gameObjectManager.getBubbles().add(specialBubble); + specialBubblePresent = true; } } /** - * Loose a life and remove all bubbles + * Add bubbles to the game. + * + * @param bubbles the bubbles */ - public void looseLife(){ - player.lives--; - gameObjectManager.getLivesLabel().setLifeCount(player.lives); - gameObjectManager.getBubbles().clear(); + public void addBubbles(Bubble... bubbles){ + ArrayList collidableGameObjects = new ArrayList<>(); + collidableGameObjects.add(gameObjectManager.getPlayerObject()); + collidableGameObjects.addAll(gameObjectManager.getHarpoons()); + for(Bubble bubble: bubbles){ + bubble.setGamePlayManager(this); + bubble.addCollidableGameObject(collidableGameObjects); + gameObjectManager.getBubbles().add(bubble); + } + } + + /** + * Shoot a harpoon starting at a given position. + * + * @param startPosition the start position + * @return if a harpoon was shot or not + */ + public boolean shootHarpoon(Position startPosition){ + if(gameView.timerExpired("ShootHarpoon","GamePlayManager") && gameObjectManager.getHarpoons().size()<2){ + Harpoon harpoon = new Harpoon(gameView,new ArrayList<>()); + harpoon.getPosition().setTo(startPosition.x+16, startPosition.y-15); + harpoon.setGamePlayManager(this); + gameObjectManager.getHarpoons().add(harpoon); + gameObjectManager.getBubbles().forEach(b -> b.addCollidableGameObject(Collections.singletonList(harpoon))); + gameView.setTimer("ShootHarpoon","GamePlayManager",300); + return true; + } + return false; } } diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/LevelManager.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/LevelManager.java new file mode 100644 index 0000000..c791b79 --- /dev/null +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/game/managers/LevelManager.java @@ -0,0 +1,58 @@ +package de.thdeg.greiner.superpangworld.game.managers; + +import de.thdeg.greiner.superpangworld.graphics.helper.Level; + +import java.util.ArrayDeque; +import java.util.Queue; + +/** + * The level manager for creating and providing levels. + */ +public class LevelManager { + + /** The queue to store the generated levels */ + private final Queue levels; + + /** + * Create a level manager. + * + * @param easyDifficulty the difficulty + */ + public LevelManager(boolean easyDifficulty){ + levels = new ArrayDeque<>(); + generateLevels(easyDifficulty); + } + + /** + * Get the next level. If there a no remaining levels an exception is thrown. + * + * @return the next level + * @throws NoMoreLevelsAvailableException if there is no level remaining + */ + public Level getNextLevel() throws NoMoreLevelsAvailableException { + if(levels.isEmpty()){ + throw new NoMoreLevelsAvailableException(); + }else{ + return levels.poll(); + } + } + + /** + * Generate the levels according to the difficulty. + * + * @param easyDifficulty the difficulty + */ + private void generateLevels(boolean easyDifficulty){ + int overallScoreNeeded = 0; + for(int i=0;i<3;i++){ + int scoreNeeded = easyDifficulty ? 1000 + (100*i) : 10000 + (1000*i); + overallScoreNeeded += scoreNeeded; + levels.add(new Level(i+1, scoreNeeded,overallScoreNeeded)); + } + } + + /** + * The exception in case no next level is remaining. + */ + public static class NoMoreLevelsAvailableException extends Exception{} +} diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Bubble.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Bubble.java index 0f95753..f774360 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Bubble.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/Bubble.java @@ -4,6 +4,7 @@ import de.thdeg.greiner.superpangworld.gameview.GameView; import de.thdeg.greiner.superpangworld.graphics.helper.HelperValues; import de.thdeg.greiner.superpangworld.graphics.moveable.Harpoon; import de.thdeg.greiner.superpangworld.graphics.moveable.PlayerObject; +import de.thdeg.greiner.superpangworld.graphics.moveable.SpecialBubble; import java.awt.geom.Point2D; import java.util.*; @@ -13,21 +14,20 @@ import java.util.*; */ public abstract class Bubble extends CollidingGameObject implements MovingGameObject{ - private static final Point2D VELOCITY_RIGHT = new Point2D.Double(3,1); - private static final Point2D VELOCITY_LEFT = new Point2D.Double(-3,1); - - /** Random generator */ - private final Random random; + /** The velocity of a normal right movement */ + public static final Point2D VELOCITY_RIGHT = new Point2D.Double(3,1); + /** The velocity of a normal left movement */ + public static final Point2D VELOCITY_LEFT = new Point2D.Double(-3,1); + /** The random generator */ + protected final Random random; /** Flag, if the bubble is in the spawning phase */ private boolean spawning; /** Spawning speed */ private int spawnSpeed; /** Unique id for the spawn event timer */ - private final long spawnID; - /** Temporary movement action */ - private Position nextPosition; - - private Point2D velocity; + protected final long spawnID; + /** The current bubble velocity */ + protected Point2D velocity; /** * Create a bubble with default values. @@ -50,7 +50,7 @@ public abstract class Bubble extends CollidingGameObject implements MovingGameOb spawnSpeed = 500; gameView.setTimer("spawn"+spawnID,"bubble"+spawnID,spawnSpeed); - velocity = new Point2D.Double(-3.5,1.4); + velocity = random.nextBoolean() ? VELOCITY_LEFT : VELOCITY_RIGHT; } @@ -63,25 +63,28 @@ public abstract class Bubble extends CollidingGameObject implements MovingGameOb * @param speedInPixel the speed in pixel per tick * @param position the position * @param spawning flag, if the bubble is in the spawning phase - * @param moveLeftToRight flag, if the bubble is moving left to right + * @param velocity the initial velocity of the bubble */ - public Bubble(GameView gameView, ArrayList objectsToCollideWith, double size, double speedInPixel, Position position, boolean spawning, boolean moveLeftToRight){ + public Bubble(GameView gameView, ArrayList objectsToCollideWith, double size, double speedInPixel, Position position, boolean spawning, Point2D velocity){ super(gameView,objectsToCollideWith); + random = new Random(); rotation = 90; this.size = size; - width = (int) (12 * size); - height = (int) (12 * size); this.speedInPixel = speedInPixel; this.position.setTo(position.x,position.y); - spawnID = UUID.randomUUID().getLeastSignificantBits(); - random = new Random(); this.spawning = spawning; + this.velocity = velocity; + spawnID = UUID.randomUUID().getLeastSignificantBits(); + + width = (int) (12 * size); + height = (int) (12 * size); + if(spawning){ spawnSpeed = 500; gameView.setTimer("spawn"+spawnID,"bubble"+spawnID,spawnSpeed); } - velocity = new Point2D.Double(3.5,1.4); + } /** @@ -107,16 +110,18 @@ public abstract class Bubble extends CollidingGameObject implements MovingGameOb // Wall bounce if((newLocation.getX() >= GameView.WIDTH - width - HelperValues.FRAME_BORDER_WIDTH) || newLocation.getX() <= HelperValues.FRAME_BORDER_WIDTH){ velocity = new Point2D.Double(velocity.getX() * -1.0, velocity.getY()); + if(this instanceof SpecialBubble){ + SpecialBubble specialBubble = (SpecialBubble) this; + specialBubble.freezeState = !specialBubble.freezeState; + } } - - // Bottom bounce + // Floor bounce if(newLocation.getY() >= HelperValues.FRAME_WINDOW_HEIGHT + HelperValues.FRAME_BORDER_WIDTH - width){ velocity = new Point2D.Double(velocity.getX(), velocity.getY() * -0.95); newLocation = new Point2D.Double(newLocation.getX(), HelperValues.FRAME_WINDOW_HEIGHT + HelperValues.FRAME_BORDER_WIDTH - width); } position.setTo(newLocation.getX(), newLocation.getY()); - } } @@ -126,7 +131,7 @@ public abstract class Bubble extends CollidingGameObject implements MovingGameOb * @return the score to add */ public int getBurstScore(){ - return (int)(size*100); + return (int)(size*1000); } /** @@ -138,31 +143,17 @@ public abstract class Bubble extends CollidingGameObject implements MovingGameOb return this.size; } - /** - * Get the speed in pixel per tick. - * - * @return the speed in pixel per tick - */ - public double getSpeedInPixel(){ - return speedInPixel; - } - - /** - * Get the flag if the bubble is in its spawning phase. - * - * @return true if in spawning phase, else false - */ - public boolean isSpawning(){ - return spawning; - } - @Override public void reactToCollision(CollidableGameObject otherObject) { - if(otherObject instanceof PlayerObject){ + if (otherObject instanceof PlayerObject && !gamePlayManager.movementFroze) { gamePlayManager.looseLife(); - }else if(otherObject instanceof Harpoon && !spawning){ - gamePlayManager.destroy((Harpoon) otherObject); - gamePlayManager.destroy(this); + } else if (otherObject instanceof Harpoon && !spawning) { + gamePlayManager.destroy((Harpoon) otherObject, this); } } + + /** + * Destroys the bubble. + */ + public abstract void destroy(); } diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/CollidingGameObject.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/CollidingGameObject.java index 1a89f11..cef8478 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/CollidingGameObject.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/CollidingGameObject.java @@ -3,6 +3,7 @@ package de.thdeg.greiner.superpangworld.graphics.base; import de.thdeg.greiner.superpangworld.gameview.GameView; import java.util.ArrayList; +import java.util.List; /** * An object that can actively collide with other objects, e.g. a shot. @@ -44,4 +45,8 @@ public abstract class CollidingGameObject extends CollidableGameObject { protected final boolean collidesWith(CollidableGameObject other) { return this.hitBox.intersects(other.hitBox); } + + public void addCollidableGameObject(List objects){ + objectsToCollideWith.addAll(objects); + } } diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/GameObject.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/GameObject.java index abb1f5a..88514c1 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/GameObject.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/base/GameObject.java @@ -27,7 +27,6 @@ public abstract class GameObject implements Cloneable{ /** The responsible GamePlayManager */ protected GamePlayManager gamePlayManager; - /** * Create a game object with default values. * @@ -52,8 +51,10 @@ public abstract class GameObject implements Cloneable{ * Update the status and the position is applicable. */ public void update(){ - if(this instanceof MovingGameObject){ - ((MovingGameObject)this).updatePosition(); + if(this instanceof MovingGameObject ){ + if(!(Bubble.class.isAssignableFrom(this.getClass()) && gamePlayManager.movementFroze)){ + ((MovingGameObject)this).updatePosition(); + } } updateStatus(); } diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/helper/HelperValues.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/helper/HelperValues.java index 31110b2..d25c2ab 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/helper/HelperValues.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/helper/HelperValues.java @@ -2,11 +2,16 @@ package de.thdeg.greiner.superpangworld.graphics.helper; import java.awt.geom.Point2D; +/** + * Storage for helper values to be used throughout the program. + */ public class HelperValues { - public static final int FRAME_BORDER_WIDTH = 8; - public static final int FRAME_WINDOW_HEIGHT = 432; - + /** The width of the frame border */ + public static final double FRAME_BORDER_WIDTH = 8; + /** The height of the main game window */ + public static final double FRAME_WINDOW_HEIGHT = 432; + /** The games gravity */ public static Point2D BUBBLE_GRAVITY = new Point2D.Double(0,0.2); } diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/GameOverlay.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/GameOverlay.java new file mode 100644 index 0000000..48d84ae --- /dev/null +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/immovable/GameOverlay.java @@ -0,0 +1,61 @@ +package de.thdeg.greiner.superpangworld.graphics.immovable; + +import de.thdeg.greiner.superpangworld.gameview.GameView; +import de.thdeg.greiner.superpangworld.graphics.base.GameObject; +import de.thdeg.greiner.superpangworld.graphics.helper.HelperValues; + +import java.awt.*; + +/** + * The game overlay for display text or color on the screen. + */ +public class GameOverlay extends GameObject { + + /** The message to display */ + private String message; + /** The color to display */ + private Color color; + + /** + * Create the game overlay. + * + * @param gameView the game view to display the elements on + */ + public GameOverlay(GameView gameView){ + super(gameView); + } + + /** + * Show a message on the screen. + * + * @param message the message to display + */ + public void showMessage(String message){ + gameView.setTimer("DisplayMessage","Overlay",3000); + this.message = message; + } + + /** + * Display a color of a set amount of time on the main game screen. + * + * @param color the color to display + * @param duration the duration to display + */ + public void flashScreen(Color color, int duration){ + gameView.setTimer("FlashScreen","Overlay",duration); + this.color = color; + } + + @Override + public void addToCanvas() { + if(!gameView.timerExpired("DisplayMessage","Overlay")){ + gameView.addTextToCanvas(message,GameView.WIDTH/2.0, GameView.HEIGHT/2.0,30, Color.BLACK,0); + } + if(!gameView.timerExpired("FlashScreen","Overlay")){ + gameView.addRectangleToCanvas(HelperValues.FRAME_BORDER_WIDTH,HelperValues.FRAME_BORDER_WIDTH,GameView.WIDTH - (2*HelperValues.FRAME_BORDER_WIDTH),HelperValues.FRAME_WINDOW_HEIGHT+1,1,true,color); + } + } + + @Override + protected void updateStatus() {} +} diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/Harpoon.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/Harpoon.java index a8e35fc..600f2cc 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/Harpoon.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/Harpoon.java @@ -5,13 +5,13 @@ import de.thdeg.greiner.superpangworld.graphics.base.*; import java.awt.*; import java.util.ArrayList; -import java.util.UUID; /** * A harpoon which can be fired upwards by the player. */ public class Harpoon extends CollidingGameObject implements MovingGameObject { + /** The pixel string representing a harpoon */ private final static String HARPOON = " B \n"+ " BBB \n"+ @@ -27,7 +27,7 @@ public class Harpoon extends CollidingGameObject implements MovingGameObject { */ public Harpoon(GameView gameView, ArrayList objectsToCollideWith){ super(gameView, objectsToCollideWith); - speedInPixel = 1; + speedInPixel = 2; size = 3; width = (int) (7 * size); height = (int) (5 * size); @@ -46,13 +46,7 @@ public class Harpoon extends CollidingGameObject implements MovingGameObject { @Override public void reactToCollision(CollidableGameObject otherObject) { - if(Bubble.class.isAssignableFrom(otherObject.getClass())){ - Bubble bubble = (Bubble) otherObject; - if(!bubble.isSpawning()){ - gamePlayManager.destroy((Bubble)otherObject); - gamePlayManager.destroy(this); - } - } + } /** diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/HexagonalBubble.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/HexagonalBubble.java index 50257b1..b8975d7 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/HexagonalBubble.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/HexagonalBubble.java @@ -3,7 +3,10 @@ package de.thdeg.greiner.superpangworld.graphics.moveable; import de.thdeg.greiner.superpangworld.gameview.GameView; import de.thdeg.greiner.superpangworld.graphics.base.Bubble; import de.thdeg.greiner.superpangworld.graphics.base.CollidableGameObject; +import de.thdeg.greiner.superpangworld.graphics.base.Position; +import java.awt.*; +import java.awt.geom.Point2D; import java.util.ArrayList; /** @@ -20,25 +23,36 @@ public class HexagonalBubble extends Bubble { public HexagonalBubble(GameView gameView, ArrayList objectsToCollideWith) { super(gameView,objectsToCollideWith); - size=0.6; + size=1; speedInPixel = 2; width = (int) (128 * size); height = (int) (128 * size); - this.hitBox.width = width-20; - this.hitBox.height = height-20; + this.hitBox.width = width; + this.hitBox.height = height; + } + + public HexagonalBubble(GameView gameView, ArrayList objectsToCollideWith, double size, double speedInPixel, Position position, boolean spawning, Point2D velocity){ + super(gameView, objectsToCollideWith, size, speedInPixel, position, spawning, velocity); + + width = (int) (128 * size); + height = (int) (128 * size); + + this.hitBox.width = width; + this.hitBox.height = height; } @Override protected void updateHitBoxPosition() { - hitBox.x = (int) (position.x+10); - hitBox.y = (int) (position.y+10); + hitBox.x = (int) position.x; + hitBox.y = (int) position.y; } @Override public void addToCanvas() { gameView.addImageToCanvas("hexagon.png",position.x,position.y,size,rotation); + gameView.addRectangleToCanvas(hitBox.x,hitBox.y,hitBox.width,hitBox.height,1,false, Color.GREEN); } @Override @@ -51,4 +65,20 @@ public class HexagonalBubble extends Bubble { super.updatePosition(); rotation = (rotation + 1) % 360; } + + @Override + public void destroy() { + if (size > 0.125) { + Position positionLeft = new Position(position.x - (width/2.0/2.0), position.y); + Position positionRight = new Position(position.x + width - (width/2.0/2.0), position.y); + + Point2D.Double velocityLeft = new Point2D.Double(Math.min(this.velocity.getX(),this.velocity.getX() * -1.0),Math.min(this.velocity.getY(),this.velocity.getY() * -1.0)); + Point2D.Double velocityRight = new Point2D.Double(Math.max(this.velocity.getX(),this.velocity.getX() * -1.0),Math.min(this.velocity.getY(),this.velocity.getY() * -1.0)); + + Bubble bubbleLeft = new HexagonalBubble(gameView, new ArrayList<>(), size/2, speedInPixel, positionLeft, false, velocityLeft); + Bubble bubbleRight = new HexagonalBubble(gameView, new ArrayList<>(), size/2, speedInPixel, positionRight, false, velocityRight); + + gamePlayManager.addBubbles(bubbleLeft, bubbleRight); + } + } } diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/PlayerObject.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/PlayerObject.java index e8e5a86..9d5573a 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/PlayerObject.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/PlayerObject.java @@ -3,7 +3,6 @@ package de.thdeg.greiner.superpangworld.graphics.moveable; import de.thdeg.greiner.superpangworld.gameview.GameView; import de.thdeg.greiner.superpangworld.graphics.base.CollidableGameObject; -import java.awt.*; import java.util.Objects; /** @@ -13,10 +12,11 @@ public class PlayerObject extends CollidableGameObject implements Cloneable { /** Flag, if the player is shooting */ private boolean shooting; - + /** Flag, if the player is moving right */ private boolean movingRight; + /** Flag, if the player is moving left */ private boolean movingLeft; - + /** Flag, to rotate between standing and walking when moving around */ private boolean movingStanding; /** diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/RoundBubble.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/RoundBubble.java index c636cd1..98f1e85 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/RoundBubble.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/RoundBubble.java @@ -5,6 +5,7 @@ import de.thdeg.greiner.superpangworld.graphics.base.Bubble; import de.thdeg.greiner.superpangworld.graphics.base.CollidableGameObject; import de.thdeg.greiner.superpangworld.graphics.base.Position; +import java.awt.geom.Point2D; import java.util.ArrayList; @@ -28,6 +29,26 @@ public class RoundBubble extends Bubble { " RRRWWR \n"+ " RRRR \n"; + /** The pixel art for the bubble */ + private final static String WHITE_BUBBLE = + " WWWW \n"+ + " WWWWWW \n"+ + " WWWWWWWW \n"+ + " WWWWWWWWWW \n"+ + "WWWWWWWWWWWW\n"+ + "WWWWWWWWWWWW\n"+ + "WWWWWWWWWWWW\n"+ + "WWWWWWWWWWWW\n"+ + " WWWWWWWWWW \n"+ + " WWWWWWWW \n"+ + " WWWWWW \n"+ + " WWWW \n"; + + /** Flag for switching between red and white if the ball should blink */ + private boolean redBubble; + /** Flag, if the bubble freezes the time when destroyed */ + protected boolean timeFreeze; + /** * Create a round bubble with default values. * @@ -38,6 +59,7 @@ public class RoundBubble extends Bubble { super(gameView,objectsToCollideWith); this.hitBox.width = width-20; this.hitBox.height = height-20; + redBubble = true; } /** @@ -49,11 +71,37 @@ public class RoundBubble extends Bubble { * @param speedInPixel the speed in Pixel per tick * @param position the Position * @param spawning flag, if the bubble is spawning or not + * @param velocity the initial velocity of the bubble */ - public RoundBubble(GameView gameView, ArrayList objectsToCollideWith, double size, double speedInPixel, Position position, boolean spawning){ - super(gameView, objectsToCollideWith, size, speedInPixel, position, spawning); + public RoundBubble(GameView gameView, ArrayList objectsToCollideWith, double size, double speedInPixel, Position position, boolean spawning, Point2D velocity){ + super(gameView, objectsToCollideWith, size, speedInPixel, position, spawning, velocity); this.hitBox.width = (int) (width*0.8); this.hitBox.height = (int) (height*0.8); + redBubble = true; + if(size < 2.5){ + if(random.nextInt(100)<10){ + timeFreeze = true; + } + } + } + + @Override + public void destroy() { + if (size > 1.25) { + Position positionLeft = new Position(position.x - (width/2.0/2.0), position.y); + Position positionRight = new Position(position.x + width - (width/2.0/2.0), position.y); + + Point2D.Double velocityLeft = new Point2D.Double(Math.min(this.velocity.getX(),this.velocity.getX() * -1.0),Math.min(this.velocity.getY(),this.velocity.getY() * -1.0)); + Point2D.Double velocityRight = new Point2D.Double(Math.max(this.velocity.getX(),this.velocity.getX() * -1.0),Math.min(this.velocity.getY(),this.velocity.getY() * -1.0)); + + Bubble bubbleLeft = new RoundBubble(gameView, new ArrayList<>(), size/2, speedInPixel, positionLeft, false, velocityLeft); + Bubble bubbleRight = new RoundBubble(gameView, new ArrayList<>(), size/2, speedInPixel, positionRight, false, velocityRight); + + gamePlayManager.addBubbles(bubbleLeft, bubbleRight); + }else if(timeFreeze){ + gamePlayManager.freezeMovement(1000); + System.out.println("FREEZING"); + } } @Override @@ -67,7 +115,19 @@ public class RoundBubble extends Bubble { */ @Override public void addToCanvas(){ - gameView.addBlockImageToCanvas(RED_BUBBLE, getPosition().x, getPosition().y,size, rotation); + if(gameView.timerExpired("BubbleBlink"+spawnID,"Bubble"+spawnID)){ + redBubble = !redBubble; + gameView.setTimer("BubbleBlink"+spawnID,"Bubble"+spawnID,100); + } + if(!timeFreeze){ + gameView.addBlockImageToCanvas(RED_BUBBLE, getPosition().x, getPosition().y,size, rotation); + }else{ + if(redBubble){ + gameView.addBlockImageToCanvas(RED_BUBBLE, getPosition().x, getPosition().y,size, rotation); + }else{ + gameView.addBlockImageToCanvas(WHITE_BUBBLE, getPosition().x, getPosition().y,size, rotation); + } + } } @Override diff --git a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/SpecialBubble.java b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/SpecialBubble.java index 1ac303d..8ea1453 100644 --- a/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/SpecialBubble.java +++ b/SuperPangWorld/src/de/thdeg/greiner/superpangworld/graphics/moveable/SpecialBubble.java @@ -3,6 +3,7 @@ package de.thdeg.greiner.superpangworld.graphics.moveable; import de.thdeg.greiner.superpangworld.gameview.GameView; import de.thdeg.greiner.superpangworld.graphics.base.Bubble; import de.thdeg.greiner.superpangworld.graphics.base.CollidableGameObject; +import de.thdeg.greiner.superpangworld.graphics.base.Position; import java.util.ArrayList; @@ -26,6 +27,51 @@ public class SpecialBubble extends Bubble { " GGGWWG \n"+ " GGGG \n"; + /** The pixel art for the bubble */ + private final static String STAR = + " OO \n"+ + " OYYO \n"+ + " OYYO \n"+ + " OOYYOO \n"+ + "OOOOOYYYYOOOOO\n"+ + "OYYYYYYYYYYYYO\n"+ + " OOYYYYYYYOO \n"+ + " OOYYYYYYOO \n"+ + " OYYYYYYO \n"+ + " OYYYYYYYYO \n"+ + " OYYYOOYYYO \n"+ + " OYYYO OYYYO \n"+ + " OYOO OOYO \n"+ + " OO OO \n"; + + /** The pixel art for the bubble */ + private final static String CLOCK = + " YY YY \n"+ + "YYYY OOO YYYY\n"+ + "YYYOOWWWOOYYY\n"+ + " YOBWWWWWWOY \n"+ + " OWBWWWBWO \n"+ + " OWWWBWBWWWO \n"+ + " OWWWWBWWWWO \n"+ + " OWWWWWWWWWO \n"+ + " OWWWWWWWO \n"+ + " OWWWWWWWO \n"+ + " OOWWWOO \n"+ + " OOOOO \n"+ + " O O \n"+ + " O O \n"; + + /** Flag, if the bubble is in freeze state or in burst state */ + public boolean freezeState; + /** The height of the star pixel art */ + private final static int STAR_HEIGHT = 14; + /** The width of the star pixel art */ + private final static int STAR_WIDTH = 14; + /** The height of the clock pixel art */ + private final static int CLOCK_HEIGHT = 14; + /** The width of the clock pixel art */ + private final static int CLOCK_WIDTH = 13; + /** * Create a special bubble with default values. * @@ -34,11 +80,21 @@ public class SpecialBubble extends Bubble { */ public SpecialBubble(GameView gameView, ArrayList objectsToCollideWith) { super(gameView,objectsToCollideWith); - + this.freezeState = true; this.hitBox.width = width-20; this.hitBox.height = height-20; } + @Override + public void destroy() { + gamePlayManager.specialBubblePresent = false; + if(freezeState){ + gamePlayManager.freezeMovement(3000); + }else{ + gamePlayManager.destroyAllBubbles(); + } + } + @Override protected void updateHitBoxPosition() { hitBox.x = (int) (position.x+10); @@ -48,6 +104,15 @@ public class SpecialBubble extends Bubble { @Override public void addToCanvas() { gameView.addBlockImageToCanvas(GREEN_BUBBLE,position.x,position.y,size, rotation); + + Position iconPosition = new Position(position.x + (width/2.0),position.y + (width/2.0)); + int IconBlockSize = 3; + if(freezeState){ + gameView.addBlockImageToCanvas(CLOCK,iconPosition.x - (CLOCK_WIDTH*IconBlockSize/2.0),iconPosition.y - (CLOCK_HEIGHT*IconBlockSize/2.0),IconBlockSize, 0); + }else{ + gameView.addBlockImageToCanvas(STAR,iconPosition.x - (STAR_WIDTH*IconBlockSize/2.0),iconPosition.y - (STAR_HEIGHT*IconBlockSize/2.0),IconBlockSize, 0); + } + } @Override diff --git a/out/artifacts/Programmieren_2_jar/Programmieren 2.jar b/out/artifacts/Programmieren_2_jar/Programmieren 2.jar index 23239a898fe36b08206985d6b9fb5a8799f325b5..af34727b88c4be88c751e1d56bfff78d5feceafb 100644 GIT binary patch delta 23374 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 delta 16672 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 P|658ZsHIy diff --git a/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/game/managers/GameObjectManager.class b/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/game/managers/GameObjectManager.class index d60649670ea726c20d5f99b981e1ca7fe8fd7c09..1ef8a2f90160cca79343abb7ea31aed84b3e6b38 100644 GIT binary patch delta 1484 zcmZvc*>ezgG4E;IeD?37 zC%|hw7&4Q(Zm?Bjg*Pj_v@F@{bh-8clLks7yg-x1cHYsL*lO=}MvWS;d-b8kOn=n0(C*gF%a%+#3GdnxL)xR%1$eU7Ou&CtSO|HIdxa=Ct%w$F~;f z+%~2C?=3EIxsb~m*828#r>oYryStrkgL@jKUUPJ&Ik&E(V^6Bn;74yqv~u=DikZ%f zXzZ5>hxkb3nLhb|Hx#X`l9`INn77%Ip|gD+2eAYlW}cjf#QF~tBo3VQiVBXWD<0F( zH2+t&{X*lAXhR&9b2(8t=Za@3lPF^<<;)?@LgtHY0c&`f%_8k2K^w2o%c~q`5noWr z5kbbX88}K>B+11wK9>BNc6NWN7r8{(+7aH{rd0AtiWcG18DWFZQ0C(o`uHjzU*qHJeY}*f zf@Wei{;z*TD~zxw*U%D~DZC*K)vlARUQG#a%3#;9l(p2djwI{lLN^F-qwH^;3~>{m z%fQuWvt9R(b$x=9YM|a9g)vuMof^MQk!F&>;g7l6)A>Vib~xEN4E)JAUAfXiU-EOm}Nb3?81lKBYi6N*gil`MUf`CZH6)fVexQ_dR zD~U%5qz4Wr-i&AC&4VZZ1aHPSLrI6)!~A}4`+jG>@4fk2dbvdZ_IL6#P|4_+UaJ=9 zKo+FZ58U_S@U4O*!hG&n@7*`xW@kiik!%u&ss(N2fP zF@sL?r?y3Hr`zE8czODFWn9-krkLrOzuczILmp{7Hh99*@jsbqit^kn((=3wSt>7e z@_1!%i{WgB6^yOj-J#wRW}u!x;hNRNDU;O7*J8Dfdt;F)6NG-t#UZq9N}-luRLHTK>gQlm(2 zuxx^&DD~D=7MUOrrK!<&CMbxqZ`$7Gh;FR&TZTa)xhTV!8nBbZmq^kwlVrO+FhvG- zISINt5gnR|j)AXm)dHKrT#q*{wkv7vHLlyWBe|YPytXfC?Tw^;DMnD4|J3f&A4;HzxXaE2J diff --git a/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/game/managers/GamePlayManager.class b/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/game/managers/GamePlayManager.class index a846c8d0de3f6beee68216279ffd681643c4366e..5c5b40165bc3c5def8a01d6dcab7637c0867c106 100644 GIT binary patch literal 10238 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 literal 7045 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 diff --git a/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/game/managers/LevelManager$NoMoreLevelsAvailableException.class b/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/game/managers/LevelManager$NoMoreLevelsAvailableException.class new file mode 100644 index 0000000000000000000000000000000000000000..087f1575cc66a697b1b63717f95fb11b3de5830b GIT binary patch literal 565 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 F{{aMU%cB4Q diff --git a/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/base/CollidingGameObject.class b/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/base/CollidingGameObject.class index ed78d6aa1904b621d3f5ed7cacfbfebbb452123e..9f9131c0076f2afd02d8f5158c34bf10c60da373 100644 GIT binary patch delta 597 zcmYk2$xZ@67=)__7-T>ZQE-iWL|hQPfQW$mg1gap#N~jQ$U*et!H1ZuFF`bzc<`=g zpTPJW#_9&i9H#s4>aOqqYd-uxZN}&C+dF_Hjw?poF=?O!Ngw8s63`2mmpRiE=!)d8 z3-^WCUAbt+mP@92bx|&sZk`j4C(Rk=D=VwD=LCZGclqLNIW>MF;4YnC({L-$YQv~& zffJi#`CZ$7fipXW+Mf00N(L7=q=qzHaPnJZov{Y=-p4HU7C5-JQV+mD8*)4iD9wu{ zEb|0-v4T|yRe9l~e~q=Tp`@wQdaP6PlO~YiixhY1@N3FlNAuJleVma zyGvxO2X~*!tgES}8y=bEKdTShbj!K(*daycIOZ;SM)U>li7FDOGKfP3G1Sd0Jeafb dj0VrZF7`;P|FK?)p|nq__R9`f9a7bB^ape^Q9%Fz delta 344 zcmYL^!A`}lD};uDd!=#r|;sc?V#;BG$+#INC~ zN8;D<+2BmmuHgdC8ES%n3ofw?3J9ei35P2t6SK^?5*NwIQo_P*9{nfOmEFK&%Ootd z)gr+rE;O+>ddxLVD(X8VwCQM{L-yzi9n&@Xh7uEMTyrA?Y2h?BdpX~DE=l)GZ=39M fVD@?ST50ZGF?;t`KKUhomxkQR(Nf*%r_KE@P8lB2 diff --git a/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/base/GameObject.class b/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/base/GameObject.class index 1548b34edac846cf020e97fcce200c7047d20f11..103b97b5c727c7afda06e3e44036894cf0d5df46 100644 GIT binary patch delta 1787 zcmZ8gTT@$A7+w41BqxMT1Oy7iwA?RA6{}dGlv*gIMZuzJp}z(I>Q4U0kJbG&N$BK`0kqzK05va$J^Q`DP=m7lkc+k{=T)oz4kSa>2>}5 z?~QK(G~%=Ct_9&RP$W=)`BJI5tYu}lP7e-7LM~|VNZbXl`IlB2aA5~Z43tWgpAY=QQ*D0+oT!wjLbdt3=yBJ= zXTUG96L$+Vn~RR-q(IhqY$h}wiY8cRE+ioOGf{v#iF@G?a8FMR2NR+0SUj8v$D%G4 zyiekOwIowZfkZGd9nU}(9+23L2U%g3Uz^G_O6;*RXB5M|63y5rU>}OaqU@AcQ)`ZE z1sVHQzC~bhbVgNF|O+977KQoDL5sMhUV*WsghrsjOo(6doB( zxQP1+i4!##gQwW-W*eWuIFl->C;-}3by)JVUVFP0lrw}m%`fleAL?vRF zFt6%<$CN}I3G-Jy>6lRrPn##~E#l0VSM2`?_q#5ZiT-%i;m0^Z5}cqDJPv?zGcbLvYeA;IS9*=s%1&evQz=B;?;g}yZuuVMQ6chJ&*t%iO9_G=*s8RyFQoB-Q<$WO@KD$~qr|Tn?fLLtEx_6NAS5 zD;$`Bn*N>8{^MrNfRjH6gJrqIhm(f%8!t#fn)Lav!mcm*e}r3!!O!n=*lkPx4J4gi zJ6F&~q;2asw17j5x)^m?Q6r;nM%`AV_ym{|qG+FB;?}e$H>W*`SMeH&cySc3le1=V&Vt==i@(uB z#`~38-oTsuKWko)-Xs}38R%1LA$ocadPGjopch!jV4%-QuUC2N7*Qxw*PoJ9e2b)7 zHzoBJCR7LRZQ^cq{W+-@HO^AGH!umLv}rx%RHfN1m2y&*vRfz?^*mIiTgqO;^zF*d p+;aG)vM=$F&gM!um+5PG8z!xKeedvFz(>?BB_!}MKEbCb`X3|GCi?&Y delta 1588 zcmYjRTT@$A6#jN{PEK;NgFq>T#wdkyOR7;&D9}>5S)*W4T3QrK(+s+IxNLTWfziD)d9p{^Q?U zzX0gL*Ej8}qTi2N)JyDzN1$SLDG|>l$1~YZZ+%U#)A?K z*r%pllWhSsN$f|nfY{)7*oOdGCEA?G1sg7eB_cSWGVUh-!`h7s^tQFDWmlv6)m@jNEfpT>Uw2~1izsn@5}9V6<00WVsZmUs!LRkzs{I)k`{vl8c!5V&tH zz7~(p#}{X#L-X-$R;`*5&&v|CNU874ynjy5;k>}1(i{S6#uE?=KQ4Igh>G`Ze1H!v ze55lzRvX^m#i#19ug>^FpjrLx-J_O#mEucv$=7*oo^8~?56Npa=-Pa=|Ggxi2hqv-3}7BfEU@9ZvcWEw z2D^;cktgL475N6cb74)52WqTKc++X*d?1u31dXKSs*y}0r3=~mrVBLuWyyC%dzrfiQ?w@DrtiW#c$bzpiud^a1fNltl!w6Q JQ1}Y<{{w#d^5_5n diff --git a/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/helper/HelperValues.class b/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/helper/HelperValues.class index cbbe268c2cb4c07f4727f94ff863c2503f69bf5e..299fc2d1113e8089c31289992e67146471099f5c 100644 GIT binary patch delta 229 zcmX@jdYP5$)W2Q(7#J8V88jwx{kC*rWZ-qq&nqrT%qs~?%qdM}b5H=v0s$j~uv?I$ zuWNj`r=N>|c)W+Jr@Kc8n?p53da@bgW)?L@2GNQ3qLZ1J)Z!!=M1gw5fU-;sQVg67 zLJY!SHX{Qo0~=6A2FTL~(u_cwRcku~<3_NwERY0AGca&4$N@{Vp9YFv9 delta 187 zcmcc2dYYB%)W2Q(7#J8V8Pq0n{TB0NWZ-qq&nqrT%qs~?%qdM}2Fh_vmS+@W1+o}7 zOtxd(%%Z}`AUe@rbTSu{nxX`QC<7yd7*G`xgCqkdgAju-n9az*%D@Jck(wOHB&IG6 z6a(=XfTA)$k_XC`Wsn2%I2h!iYWtWJR1s>qfMzNH<(U{18I*uD7f=^FgEE6E11A71 C_!hklMQI;;2}DjP^dfdH;w1|K8dxbdnSQGs$!YS^qf9(&Ue1^)BWkozyATakMalxFc?Qn z#}G7zdzLVRx+Q96%@cN0c&6WO39rSQwSCufEK>7U-LCrP9`}X$h&RN}-V0F;7_?=( zX$LumJLyti6!PoXVqXDNNXTX?!$@E_ju9QB&>3=lF}h6bM#Js!Jtv~m5uU?eGbCyh zL}D{6eFvcgk_^eB?Y9VROZYyoi3BDX;yYo4Au1sKM*kUsfzxqJ>G%O>7;f|>emr^N z>Wg64ZU~Pdoi4rL9d0^Qa>#UA*m?2J$kRU_qYuf}aFpRD_+^?6b zo)Ar0=~*2=;u6D9)pcA7I}!Tv{lF|pO;%=gMaNalG3bHh_V889_JqYS|4kG#&$RsS zVU4tW>$8%yd@j@s<2uYZe$sJ6vPi0wd%=m;YH6jgDLE|ZxP{vcAXcUXZVmxDo* znxJb6^bE*(R}xJxy@x=v0*%&H+U1l5pe-zZ1p709579mXHg_+O6@f~#2W3$ zUS2tb!SD!=BdjN6Exn9|_lT#)QsV|r9bj@{@dKt0k&_rCn@dRIGA4252)fZjHxy@y zzK)Fu{Z~Slo|6jwd}@5=&j|eDaqw#xqr;MdslaDLw;uSUJjMh{P}oF?C^KwfI|}ob zeC4<8ZW0H${0`^jj-F`)^9C{o7XQYzdc;sJ7!;UHvT zrzj0ziPFD?IozT3E=9kun971uZtVEBc; H4B+YiN4k&b literal 0 HcmV?d00001 diff --git a/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/moveable/Harpoon.class b/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/moveable/Harpoon.class index ecee511cc542a73752912b7a9ca6811200cb8d8f..55140f3fb9f0714d4a4fdb3e51c2408c8c1132a3 100644 GIT binary patch delta 1284 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 delta 930 zcmYjPT~8BH5IuJbTXwk?DV0(x(3V1Fi_}7?Um!(9DJmieh??jIHf@y@B8}iv|A7ha zqlv#kBc;&?UyLutf8l@d(KypDy2-tB=ggfmXXdUw@Uuhz_3ztv09WzsNdMqdXZ}o7 zJ`FnBosbe|;1Za%KZ&6ITWNdm>^b_|y{f}4(ZvzDzh_z7>HKo;(ArT`FNljiPWMXm zz$egpklQX~1w@)rzr=Y))vT4vWD5-SOAH`jKNle*1g{f=0`8aQ8#87e6k;pZR>90? zb}S7c`1$&=CZx zilp|h*`1EL#FRjL);csZyZN!be1@YpBxX3P?e%WKEaZ0cI%aXxi8+Z|m=}ms*|`1H z5z}=jxFfNEw4H4UeEF#U5cay3us8Hj5kaC-DymvRGl5FpJ@U(Rc96YmL`TaIh6m0P zG%_6}bdvEH$IxEAE1|pD=_Ry}R`*%Yb_v0n*IV(zpNY(pff;M}({qqF@~@*g%>h+|4F+ z!&#A7qcrdnAqy{dXV&jYvG|5txid0uc!65xqVGLuaqN-XiQd1@HxKU?`rpa{z z#Ch3$op!ENHREJ7TGJ;;)%lC4jemq1Hk!x-4f4$fd6bBmT-38cuf;&DDN!^M>Afk+ s-Oty$?=s4`ZLoxnEe{s=OGr+ia#cH>pt&XB#$*#`SA+8ju_<`^ADxSZZvX%Q diff --git a/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/moveable/PlayerObject.class b/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/moveable/PlayerObject.class index 64833a1d8e46db44a3534168418498e37cd5d888..bed9869737e8e2ca7990eb4b3ad68ec4e6624ac1 100644 GIT binary patch delta 25 bcmZ3cyi9oms~{uyWHvz?An6Py8wAw=Qw9al delta 25 bcmZ3cyi9oms~{uKWHvz?An6Py8wAw=Qzr$} diff --git a/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/moveable/RoundBubble.class b/out/production/SuperPangWorld/de/thdeg/greiner/superpangworld/graphics/moveable/RoundBubble.class index 08ccdf4201a20e2567a990506a8086ff758d78e8..68de193bbc79b71dd09797d6efab98f5fda44045 100644 GIT binary patch literal 5436 zcmd5=d303O8UNkPWZqm;wd?6W{iFZ&oZ8=g%VYwH2|e_jzGUWo z-*>M~#FvBp_PLP=Q4XE)%G*b(}UwPN`C{R89#D>BiuY zCHbo)y+*|qxKf}js}~dyz0%psrKf8J9=&9qipA#kx#t=?Y8__IunaTZ&^zUcLETJ6 zJ4_>OZH&?PfgOK4CZFSh8~scaKGLd{DpuhdTAS6<2{T2n6ooEs(;7kuBch;A#Tu*? zD4&Y0!yurf^)ah8Z3+0ptr7Y-i1jL>(p@3TNa?$>x_(5Lzw>t0#orXqFP*tU{C1eJO2B>fWy+0mdyj=vKPGrn#MbL3>azC~(&rPY>JX*bO78A|*Yp<}$jTXiaw*V|p?~WtK~gGAiDJtiWQaQAbi6Z`ab=piat; zc_|i6Is7@hc@+s@+FQsg7*R0__L#Yw6&09O8Vf;7xP2ohuqAwOZtbR3xYP4k$5O2$ zDsIPH8Px&1u-e%jQ@U4vblRPGn}WMkydCfG>eUW?=XlQ2S>!%5&swc=vd%E09a(mX zPAjWxsfHll$@uPyH#hgT?%N&0yK#?#dsVy#@AYCfeFn=vBj+cXPgP+@rn8zw@}S*% zo^@J}Y^L|ix+<5@`(-H+3gQDQK8O!dP%fj5rdwmIx;+)lNcz)LOC{hi;k=c?}=QvWCa8s3gHo)Q1GaV$M6w>4Rf}Z^V5_mC!1Hcc`ReF=?ko$ z!MY03gV=|iL3a;`N(%j!rd-L#DV2l zr~nfSd34D+8`8}Y@98FDFG2!gxsE*~VP{c??jTd@$U6L#icjM+0t?tWyp2evc;q5e z+?#9f+@DkNd0F+rtZ8X-Ym>hGqKYT+6r(O{iOqAkHN{##U^Z##5iKWBGlOGee55B& zxt{Fi<9SlTHb!$DSYn|9Of2Nl<$J!!Gy&5^dzc$bo6}ZDAQW$o9csL}v9YbWun!j( zlE6YQ^SiWUo^4p|ZfQNxT$tl;G83dOZsRd;Uq02RXAj6jlN4t5YsoGxYe?KB`mG^@ zKAT6I^cvAjr!elgm1f^zp1N|3gPBYk30>A`p}m}U2ozX4U77KWr_e#CmZneGdXY)w zs36Uhhtd7EW)0h^Wm%^&nAWU(mi~C~Qk~Q;k#>Wgf9pT#a0q#=^Jv1&4hzL0p0j7)4)Q|(E0m>69v&&msRn)z(MzRQp$ zT3&RsSuamUBsH3*MVDxqcHJ5>6S>6!{49i@;};5kDR;(S39Ott*BR*%b6AgZ8)p(Z zo8>O8-!ilG=+WZF=rTG&TX@D#>baF|ra7F?xEHtLu2ZzZO`CXtg*yYgTg0{mxB7}V zXjep&mP~dUmd?}0Zx~R=sf|e^JuHIw9dp5<2#&R;d1q}(YPpJMu&&%FvOz<2rNvs4<5Pzl!f0{I22W?K?bNCLBmltl* zpCxuLeEb8#b!*m6Le!mt!q39;%EW0baj{ApyS&bS8r4sd*M~FwUP>uI10`)mCAMJ& zk4vku17}IS%8`jL;W=WIE>GiJS3>9TJlB4Kuv(zJNXnNK6(O6$^ORj!~|BChaN{z+ObaB;kWHr zK~DnhynpYb-utlu9lS8zL~G(`Lnomw+orh97cbZpFW3}!ZK9s?(rDWrmv;f%LveZC zgCecKR~Z4hT3p_&cujkOu;T?OLwezBq+AK{8kY?!^8XP913vytQZE!L2-i(tr<=Zk z!~A9t#miVA7ZBIe&}%Dk-NTQGsq?~JOT2XrO%qUHvPzmQgfS2%XX2dy4`wk&L;Yx7@Xc{O=| z;Dwmgqfj!iiR#M=EsE=X!~HCQ_e~A#Bq#&!3_KvsE3s33k)4_;)F917HEq?M^xNbv zFYrTeNwI>ZCzm`!aee$ecm^K^9N-w(V~!s~w2pZ7aVY+i@cY;wX6CKLMa< zWv`VzR`x{4(ZUt$!;eWT!B6lq--`(Sl)S&TzkiG0lU706ZkGHjRQ(V5BmRt<{{Y-6 B=vM#$ delta 925 zcmZ8gO-~b16g_YHG1JMkYEvSuk(MIR545$dMU+xe)S?I|S_MB6qK#=Fg;)~N#58Vn z=fZKJZe6%;M2tpF+!_`xUAuGPUof6G9a^=MH*@E_d+xpG%@NO%A%8DD(9mNbjEJc^O1>!iRO~a*j{$+a z`Ay^t0%DzO!d-m7P4OckQ+9d~#gKvhGFja7z>k!CBd+0~fef2T6LwSV;sj-oG>tflV(`Wo4>S-`Nfla z4-6S<}GB<%Vr8) z5(wcGPV-sfn}QsT5?pS^lSCSD@B;eG=R2Z}CL;&V@a~6`_W|Y&B7hhjh~q4gNGlst zIL9~gqCP3*Q<3zrLXLDGYY)431HHD0!KIs25$|jy|JgVo)hL$XK2FmB z3J7A10~akREg!SC6oG|y&uQpZ&j{Z2WwUC<61C;!lBE#3 zY?p2Cs=~}rYF`QFs#-?LmN<#0R?IasR`cvqY|M4djg(#W;=@aAXhmBX5d-Zo z6t3+nxNh32vu2sJE4EOva<*BjTiJf!wX8?hf@gZPS=|-|odyn~iyjnhFX22?==H5J z*S*-hmGkI$$%+eSkAZj4t8if5&U;1fPqyJOdct^Dp+|eLV~=d73D0;%* zC-e^t9K|t(g9V0Qu4Hb^nq{+KxpeZ4!WUch`KvmH+XT?i@x&84Y-? zGzO!(J%V$tRkg}qggQbcIwSSiRu zRiSyv&+cghF`Q9otvFTNvz@ZSXZr`Bo@QNvbHPq}eh%luxM1KDTvWKYujhM;VOm)O zY9e%ffailla`w5%>=gx<4O|iFYD4JP1d-l~F#`#V(-BFi)U?9+{T(6i&V$g3Nrj)I z98(tR{AOe3bYmu!vQKU{6&ewqqSL!1}pp}rox#-bLGWV7GbRRU#5of0iOiK`2 zs`evG2wxbO5kjl$@MtlO5zOLd7-<7@_)_8QzPZ>P357#uKA$K#xd+Kro{U9j+$^t| zES_U(swpsYX~k`Ye*zpV=4tfnMg-t&9VAiYzsp_p&^6dK4y2;mj21|gqOyh1b z?3`0>EOsOb^&Papi;m^v%aG598q*$GaB6POx?$`3*zu`xT0RGGoL6HL>#CI>0e5g0 z3SSd7VS@OZZ8%GOZyU~#lV3dKJ%Vr1yS2|GUfzXsyKsIRws-~da3DmT_bKgrH1iJ_ z8W}zH5^AJn6XB8P=-{urt2e)iLjihEqxXL$Z!-#f9;Osvo{|=5*&_OIi|v02MN*@_ zOxRc4T z+Y5a33=sh@FudEc+l=uYe#hNKKO=jBQ4`C2odbboE-5W&>JRZ*-O`%XF#-lDSpxC# zbDZtPr@0?Caj8Ly2c)Z_xJiekQ@fq#C!vLtbfBSdFi@!A)zv72O-VxklrpdPOazMj zSDddK{3Tx?^#{&n8;jjfdNJ?h8f*dKB^FbmDJy`w-B@9M0h z{wJLj{S2d;HLF>-7WZOpg!d@Iw0Z@{n8+j(IfF9Gz`|;k$HWW5HBaFKcmXe9JhN@KW-~M2cjo)fIp5Az^rFkY{`>0^z%|ooSsB4KJjb+!8HriU3FOp`6<0^T6?N>NI*nSFLfr;>9dl%KOQ5qIYc){Hv2{1&GBqB&5!ReNX#F|tnV1*e;(crMu)8Q&!Qu7sK=^<-G)`=K+P0Bae z;LQ^Ak94TJQY{Df&+ssU#HYh^47H(T3mVnV4A)u6b&y3j|8kPj4Q;EbmulG(*z|OY zuw9)PNi)tEcdgVsl00%;PcJal7O*J<