diff --git a/bin/de/bricked/resources/textures/powerups/1.png b/bin/de/bricked/resources/textures/powerups/1.png index ce483cc81df758cb80c62f179fd3cde36751b30b..0a38b3fbb1f7995a25035bf0471ad52569c4f2ab 100644 Binary files a/bin/de/bricked/resources/textures/powerups/1.png and b/bin/de/bricked/resources/textures/powerups/1.png differ diff --git a/bin/de/bricked/resources/textures/powerups/4.png b/bin/de/bricked/resources/textures/powerups/4.png new file mode 100644 index 0000000000000000000000000000000000000000..7c3792036b05fe71d2139e4e98d25b1fe743176b Binary files /dev/null and b/bin/de/bricked/resources/textures/powerups/4.png differ diff --git a/bin/de/bricked/resources/textures/powerups/5.png b/bin/de/bricked/resources/textures/powerups/5.png new file mode 100644 index 0000000000000000000000000000000000000000..778eccf091e8ac2f071b043ba1ca9e549c5bb1fa Binary files /dev/null and b/bin/de/bricked/resources/textures/powerups/5.png differ diff --git a/notes/textures/PowerUp-Template.pdn b/notes/textures/PowerUp-Template.pdn new file mode 100644 index 0000000000000000000000000000000000000000..0e03eff55daf88165bb59976e85ce24effafdc17 Binary files /dev/null and b/notes/textures/PowerUp-Template.pdn differ diff --git a/src/de/bricked/game/Game.java b/src/de/bricked/game/Game.java index 85ca1b8f2088a649b9b97cb4f3d18f290a8bf7f0..cf8119ba4f60f914d1f6b7a09fdc48d2560b99f6 100644 --- a/src/de/bricked/game/Game.java +++ b/src/de/bricked/game/Game.java @@ -418,4 +418,14 @@ public class Game return null; } } + + public Point2D getNewSpeedDirection(Point2D oldDirection, double speed) + { + double influenceX = 0.5; + + double newXSpeed = speed * influenceX; + double newYSpeed = Math.sqrt(speed * speed - newXSpeed * newXSpeed); + + return new Point2D(-newXSpeed, -newYSpeed); + } } \ No newline at end of file diff --git a/src/de/bricked/game/board/Board.java b/src/de/bricked/game/board/Board.java index 3db453f4e8f248c2d363f8463cc8c64baacb561e..4a2928dda2a337956374963529e306e5cbea74fe 100644 --- a/src/de/bricked/game/board/Board.java +++ b/src/de/bricked/game/board/Board.java @@ -8,6 +8,8 @@ import de.bricked.game.bricks.Brick; import de.bricked.game.bricks.BrickType; import de.bricked.game.powerups.ExtraLifePowerUp; import de.bricked.game.powerups.PowerUp; +import de.bricked.game.powerups.ball.ExplodeBallPowerUp; +import de.bricked.game.powerups.ball.NoCollisionBallPowerUp; import de.bricked.ui.LevelController; public class Board @@ -48,15 +50,17 @@ public class Board case 3: break; case 4: + currentPowerUp = new ExplodeBallPowerUp(); break; case 5: + currentPowerUp = new NoCollisionBallPowerUp(); break; case 6: break; - default: + default: break; } - + switch(brickValue) { case "N": diff --git a/src/de/bricked/game/powerups/ExtraLifePowerUp.java b/src/de/bricked/game/powerups/ExtraLifePowerUp.java index 420f47aae2eb5f603182360d2f6fb7e8c1762b48..37b7d5edcdac1e2cadd6b025bae1858a37c0c0a8 100644 --- a/src/de/bricked/game/powerups/ExtraLifePowerUp.java +++ b/src/de/bricked/game/powerups/ExtraLifePowerUp.java @@ -1,17 +1,23 @@ package de.bricked.game.powerups; +import de.bricked.game.Game; +import de.bricked.ui.LevelController; public class ExtraLifePowerUp extends PowerUp { - public ExtraLifePowerUp() { - super(PowerUpType.valueOf("EXTRA_LIFE").getId(), -1); + super(PowerUpType.valueOf("EXTRA_LIFE").getId(), 10); } - @Override - public void activate() - { + @Override + public void activate(LevelController levelController, Game game) + { + //TODO + } - } -} + @Override + public void deactivate(LevelController levelController, Game game) + { + } +} \ No newline at end of file diff --git a/src/de/bricked/game/powerups/PowerUp.java b/src/de/bricked/game/powerups/PowerUp.java index cabfed3675e4e91e1844942d1a08322e3367c542..d96641874faf96afe40bc0117a67f4f3d38cf165 100644 --- a/src/de/bricked/game/powerups/PowerUp.java +++ b/src/de/bricked/game/powerups/PowerUp.java @@ -1,15 +1,18 @@ package de.bricked.game.powerups; +import de.bricked.game.Game; +import de.bricked.ui.LevelController; + public abstract class PowerUp { protected int id; - protected int duration; + protected int durationInSeconds; protected final double speed = 2.0; - public PowerUp(int id, int duration) + public PowerUp(int id, int durationInSeconds) { this.id = id; - this.duration = duration; + this.durationInSeconds = durationInSeconds; } public int getID() @@ -19,13 +22,20 @@ public abstract class PowerUp public boolean isPermanent() { - return (duration == -1); - } + return (durationInSeconds == -1); + } + + public int getDurationInSeconds() + { + return durationInSeconds; + } public double getSpeed() { return speed; } - public abstract void activate(); + public abstract void activate(LevelController levelController, Game game); + + public abstract void deactivate(LevelController levelController, Game game); } \ No newline at end of file diff --git a/src/de/bricked/game/powerups/PowerUpType.java b/src/de/bricked/game/powerups/PowerUpType.java index e6802a342a29c2f9f5152c7bc451e57fe0eb2b70..6bc52e10ebd8a9ff010692b8ac2172e5796939f9 100644 --- a/src/de/bricked/game/powerups/PowerUpType.java +++ b/src/de/bricked/game/powerups/PowerUpType.java @@ -7,8 +7,7 @@ public enum PowerUpType FASTER_BALL(2), SLOWER_BALL(3), EXPLODE_BALL(4), - THROUGH_BALL(5), - SPLIT_BALL(6); + NO_COLLISION_BALL(5); private int id; diff --git a/src/de/bricked/game/powerups/ball/DecreaseBallSizePowerUp.java b/src/de/bricked/game/powerups/ball/DecreaseBallSizePowerUp.java deleted file mode 100644 index eb4850dca9a551e60b055bab3b97880fcdc6f10d..0000000000000000000000000000000000000000 --- a/src/de/bricked/game/powerups/ball/DecreaseBallSizePowerUp.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.bricked.game.powerups.ball; - - -import de.bricked.game.balls.Ball; -import de.bricked.game.powerups.PowerUp; - -public class DecreaseBallSizePowerUp extends PowerUp -{ - private Ball ball; - - public DecreaseBallSizePowerUp(int id, int duration, Ball ball) - { - super(id, duration); - this.ball = ball; - } - - @Override - public void activate() - { - - } -} diff --git a/src/de/bricked/game/powerups/ball/ExplodeBallPowerUp.java b/src/de/bricked/game/powerups/ball/ExplodeBallPowerUp.java new file mode 100644 index 0000000000000000000000000000000000000000..a7eb86e7e7de233799df0593c942bbdf7269bff0 --- /dev/null +++ b/src/de/bricked/game/powerups/ball/ExplodeBallPowerUp.java @@ -0,0 +1,27 @@ +package de.bricked.game.powerups.ball; + +import de.bricked.game.Game; +import de.bricked.game.balls.Ball; +import de.bricked.game.balls.BallType; +import de.bricked.game.powerups.PowerUp; +import de.bricked.game.powerups.PowerUpType; +import de.bricked.ui.LevelController; + +public class ExplodeBallPowerUp extends PowerUp +{ + public ExplodeBallPowerUp() + { + super(PowerUpType.valueOf("EXPLODE_BALL").getId(), -1); + } + + @Override + public void activate(LevelController levelController, Game game) + { + levelController.changeBall(new Ball(BallType.EXPLOSIVE)); + } + + @Override + public void deactivate(LevelController levelController, Game game) + { + } +} \ No newline at end of file diff --git a/src/de/bricked/game/powerups/ball/IncreaseBallSizePowerUp.java b/src/de/bricked/game/powerups/ball/IncreaseBallSizePowerUp.java deleted file mode 100644 index c40a021896943cff7df9c925a1faec7574539056..0000000000000000000000000000000000000000 --- a/src/de/bricked/game/powerups/ball/IncreaseBallSizePowerUp.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.bricked.game.powerups.ball; - - -import de.bricked.game.balls.Ball; -import de.bricked.game.powerups.PowerUp; - -public class IncreaseBallSizePowerUp extends PowerUp -{ - private Ball ball; - - public IncreaseBallSizePowerUp(int id, int duration, Ball ball) - { - super(id, duration); - this.ball = ball; - } - - @Override - public void activate() - { - - } -} diff --git a/src/de/bricked/game/powerups/ball/NoCollisionBallPowerUp.java b/src/de/bricked/game/powerups/ball/NoCollisionBallPowerUp.java new file mode 100644 index 0000000000000000000000000000000000000000..099006d8e6703b87ea37b7dd7b45092d1700e4a4 --- /dev/null +++ b/src/de/bricked/game/powerups/ball/NoCollisionBallPowerUp.java @@ -0,0 +1,27 @@ +package de.bricked.game.powerups.ball; + +import de.bricked.game.Game; +import de.bricked.game.balls.Ball; +import de.bricked.game.balls.BallType; +import de.bricked.game.powerups.PowerUp; +import de.bricked.game.powerups.PowerUpType; +import de.bricked.ui.LevelController; + +public class NoCollisionBallPowerUp extends PowerUp +{ + public NoCollisionBallPowerUp() + { + super(PowerUpType.valueOf("NO_COLLISION_BALL").getId(), -1); + } + + @Override + public void activate(LevelController levelController, Game game) + { + levelController.changeBall(new Ball(BallType.NO_COLLISION)); + } + + @Override + public void deactivate(LevelController levelController, Game game) + { + } +} \ No newline at end of file diff --git a/src/de/bricked/game/powerups/paddle/DecreasePaddleSizePowerUp.java b/src/de/bricked/game/powerups/paddle/DecreasePaddleSizePowerUp.java index a62639024677ed32ddb2ebdabdc7295306bbdc2f..214145d5e25fc4f0f878af4d2b525b24021d503e 100644 --- a/src/de/bricked/game/powerups/paddle/DecreasePaddleSizePowerUp.java +++ b/src/de/bricked/game/powerups/paddle/DecreasePaddleSizePowerUp.java @@ -1,8 +1,10 @@ package de.bricked.game.powerups.paddle; +import de.bricked.game.Game; import de.bricked.game.paddle.Paddle; import de.bricked.game.paddle.PaddleSize; import de.bricked.game.powerups.PowerUp; +import de.bricked.ui.LevelController; public class DecreasePaddleSizePowerUp extends PowerUp @@ -16,8 +18,13 @@ public class DecreasePaddleSizePowerUp extends PowerUp } @Override - public void activate() + public void activate(LevelController levelController, Game game) { paddle.setPaddleSize(PaddleSize.getNextSmaller(paddle.getPaddleSize())); } + + @Override + public void deactivate(LevelController levelController, Game game) + { + } } diff --git a/src/de/bricked/game/powerups/paddle/IncreasePaddleSizePowerUp.java b/src/de/bricked/game/powerups/paddle/IncreasePaddleSizePowerUp.java index 75f3c6aaf3b72673928b21820d06d664fbcb775b..00a6cb3e0b400402c6a1fc35bb6c2711333d910d 100644 --- a/src/de/bricked/game/powerups/paddle/IncreasePaddleSizePowerUp.java +++ b/src/de/bricked/game/powerups/paddle/IncreasePaddleSizePowerUp.java @@ -1,8 +1,10 @@ package de.bricked.game.powerups.paddle; +import de.bricked.game.Game; import de.bricked.game.paddle.Paddle; import de.bricked.game.paddle.PaddleSize; import de.bricked.game.powerups.PowerUp; +import de.bricked.ui.LevelController; public class IncreasePaddleSizePowerUp extends PowerUp @@ -16,8 +18,13 @@ public class IncreasePaddleSizePowerUp extends PowerUp } @Override - public void activate() + public void activate(LevelController levelController, Game game) { paddle.setPaddleSize(PaddleSize.getNextBigger(paddle.getPaddleSize())); } + + @Override + public void deactivate(LevelController levelController, Game game) + { + } } diff --git a/src/de/bricked/resources/textures/powerups/1.png b/src/de/bricked/resources/textures/powerups/1.png index ce483cc81df758cb80c62f179fd3cde36751b30b..0a38b3fbb1f7995a25035bf0471ad52569c4f2ab 100644 Binary files a/src/de/bricked/resources/textures/powerups/1.png and b/src/de/bricked/resources/textures/powerups/1.png differ diff --git a/src/de/bricked/resources/textures/powerups/4.png b/src/de/bricked/resources/textures/powerups/4.png new file mode 100644 index 0000000000000000000000000000000000000000..7c3792036b05fe71d2139e4e98d25b1fe743176b Binary files /dev/null and b/src/de/bricked/resources/textures/powerups/4.png differ diff --git a/src/de/bricked/resources/textures/powerups/5.png b/src/de/bricked/resources/textures/powerups/5.png new file mode 100644 index 0000000000000000000000000000000000000000..778eccf091e8ac2f071b043ba1ca9e549c5bb1fa Binary files /dev/null and b/src/de/bricked/resources/textures/powerups/5.png differ diff --git a/src/de/bricked/ui/LevelController.java b/src/de/bricked/ui/LevelController.java index 9125b36abfe53d62d980c3a1ce1150c59298a236..6aa4b4890c3c2046a9837086883f3b181fdc4ae6 100644 --- a/src/de/bricked/ui/LevelController.java +++ b/src/de/bricked/ui/LevelController.java @@ -17,6 +17,7 @@ import de.bricked.game.bricks.Brick; import de.bricked.game.bricks.BrickType; import de.bricked.game.paddle.Paddle; import de.bricked.game.powerups.PowerUp; +import de.bricked.utils.CountdownTimer; import fontAwesome.FontIcon; import fontAwesome.FontIconType; import javafx.animation.AnimationTimer; @@ -94,28 +95,31 @@ public class LevelController private double oldMousePosition; private static ArrayList<Label> brickLabels; private ArrayList<Label> movingPowerUps; + private ArrayList<Label> timedPowerUps; - private void startGame() - { - anchorPaneGame.heightProperty().removeListener(heightListener); - anchorPaneGame.widthProperty().removeListener(widthListener); + private void startGame() + { + resetPowerUps(); + + anchorPaneGame.heightProperty().removeListener(heightListener); + anchorPaneGame.widthProperty().removeListener(widthListener); - // start random into left or right direction - int random = new Random().nextInt(2); - if(random == 0) - { - game.getBall().startBallToRight(); - } - else - { - game.getBall().startBallToLeft(); - } + // start random into left or right direction + int random = new Random().nextInt(2); + if(random == 0) + { + game.getBall().startBallToRight(); + } + else + { + game.getBall().startBallToLeft(); + } - timer.start(); - Logger.log(LogLevel.INFO, "ball start"); + timer.start(); + Logger.log(LogLevel.INFO, "ball start"); - gameState = GameState.RUNNING; - } + gameState = GameState.RUNNING; + } public void init(Stage stage, LevelSelectController levelSelectController, Game game) { @@ -123,18 +127,18 @@ public class LevelController this.levelSelectController = levelSelectController; this.game = game; game.setBoard(new Board(game)); - game.setLevelController(this); - - anchorPane.setOnMouseClicked(new EventHandler<MouseEvent>() - { - @Override - public void handle(MouseEvent event) - { - startGame(); - event.consume(); - anchorPaneGame.requestFocus(); - } - }); + game.setLevelController(this); + + anchorPane.setOnMouseClicked(new EventHandler<MouseEvent>() + { + @Override + public void handle(MouseEvent event) + { + startGame(); + event.consume(); + anchorPaneGame.requestFocus(); + } + }); anchorPane.setOnKeyReleased(new EventHandler<KeyEvent>() { @@ -249,6 +253,9 @@ public class LevelController buttonBack.setGraphic(iconBack); vboxPowerUps.setStyle("-fx-border-color: #333333; -fx-border-width: 2px;"); + vboxPowerUps.setPadding(new Insets(3)); + vboxPowerUps.setAlignment(Pos.TOP_CENTER); + vboxPowerUps.setSpacing(7); vboxLives.setStyle("-fx-border-color: #333333; -fx-border-width: 2px;"); vboxLives.setPadding(new Insets(3)); vboxLives.setAlignment(Pos.BOTTOM_CENTER); @@ -290,7 +297,8 @@ public class LevelController @Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { - initBall(); + initBall(BallType.NORMAL); + initTimer(); gamePaneHeight = newValue.doubleValue(); } }; @@ -313,7 +321,8 @@ public class LevelController labelFPS.setStyle("-fx-text-fill: #FF0000"); resetMultiplicator(); - movingPowerUps = new ArrayList<>(); + + resetPowerUps(); gameState = GameState.WAITING; } @@ -372,7 +381,7 @@ public class LevelController if(hitLocation != null) { resetMultiplicator(); - + if(hitLocation.equals(HitLocation.LIFE_LOST)) { game.setLivesRemaining(game.getLivesRemaining() - 1); @@ -382,6 +391,7 @@ public class LevelController { // game over + resetPowerUps(); gameState = GameState.STOPPED; timer.stop(); @@ -403,7 +413,8 @@ public class LevelController // reset paddle and ball initPaddle(); - initBall(); + initBall(BallType.NORMAL); + initTimer(); } } else @@ -451,13 +462,13 @@ public class LevelController // ball doesn't collide with border --> check collision with paddle else { - hitLocation = game.collides(ballPosition, paddlePosition, paddle.getWidth(), paddle.getHeight(), true); + hitLocation = game.collides(ballPosition, paddlePosition, paddle.getWidth(), paddle.getHeight(), true); if(hitLocation != null && (hitLocation.equals(HitLocation.PADDLE) || hitLocation.equals(HitLocation.CORNER))) - { + { game.getBall().setDirection(game.reflectOnPaddle(game.getBall().getDirection(), game.getDistanceToPaddleCenter(ballPosition, paddlePosition, paddle.getWidth()))); correctBallPosition(hitLocation, ballPosition, paddlePosition, paddle.getWidth(), paddle.getHeight()); - + resetMultiplicator(); } // ball doesn't collide with paddle --> check collision with bricks @@ -485,12 +496,12 @@ public class LevelController } } } - - //move powerups + + // move powerups movePowerUps(); - //check timed powerups + // check timed powerups checkPowerUps(); - } + } }; } @@ -564,8 +575,8 @@ public class LevelController { labelBrick.setStyle("-fx-background-image: url(\"de/bricked/resources/textures/bricks/" + brick.getCurrentTextureID() + ".png\");" + "-fx-background-position: center center;" + "-fx-background-repeat: no-repeat;" + "-fx-background-size: cover"); } - }); - ft.play(); + }); + ft.play(); } else { @@ -575,14 +586,14 @@ public class LevelController private void refreshLiveCounter() { - vboxLives.getChildren().clear(); + vboxLives.getChildren().clear(); for(int i = 0; i < game.getLivesRemaining() - 1; i++) { ImageView iv = new ImageView(new Image("de/bricked/resources/textures/paddle/paddle-extra-small.png")); iv.setFitWidth(30); iv.setFitHeight(120 / MAX_LIVES); - vboxLives.getChildren().add(iv); + vboxLives.getChildren().add(iv); } } @@ -599,11 +610,11 @@ public class LevelController AnchorPane.setBottomAnchor(labelPaddle, paddle.getHeight()); } - private void initBall() + private void initBall(BallType ballType) { anchorPaneGame.getChildren().remove(stackPaneBall); - game.setBall(new Ball(BallType.NORMAL)); + game.setBall(new Ball(ballType)); // create circle for ball final Circle circle = new Circle(game.getBall().getBallRadius(), Color.web(game.getBall().getType().getColor())); @@ -613,8 +624,6 @@ public class LevelController stackPaneBall.setTranslateX(gamePaneWidth / 2 - game.getBall().getBallRadius()); stackPaneBall.setTranslateY(anchorPaneGame.getHeight() - paddle.getHeight() * 2 - game.getBall().getBallRadius() * 2); anchorPaneGame.getChildren().add(stackPaneBall); - - initTimer(); } private void resetMultiplicator() @@ -627,9 +636,9 @@ public class LevelController } public void increaseMultiplicator(int points) - { - game.increaseMultiplicator(); - game.increasePointsSinceLastMultiplicatorReset(points); + { + game.increaseMultiplicator(); + game.increasePointsSinceLastMultiplicatorReset(points); labelMultiplicator.setText("x" + game.getMultiplicator()); } @@ -674,20 +683,21 @@ public class LevelController game.getBall().setDirection(game.reflectBall(hitLocation, game.getBall().getDirection())); correctBallPosition(hitLocation, ballPosition, brickPosition, stackPaneBrick.getWidth(), stackPaneBrick.getHeight()); - } - + } + int points = game.getBoard().hitBrick(i, k, game.getBall()); - //brick has been destroyed + // brick has been destroyed if(points > 0) - { + { game.setTotalPoints(game.getTotalPoints() + points); labelPoints.setText(String.valueOf(game.getTotalPoints())); labelBlocksRemaining.setText(game.getBoard().getNumberOfRemainingBricks() + " Bricks remaining"); - } + } if(game.getBoard().getNumberOfRemainingBricks() == 0) { // level done + resetPowerUps(); gameState = GameState.STOPPED; resetMultiplicator(); timer.stop(); @@ -706,12 +716,12 @@ public class LevelController } } } - + public void showAnimatedPoints(int row, int col, int points) { double xPosition = (gamePaneWidth / Board.WIDTH) * (col); double yPosition = (gamePaneHeight / Board.HEIGHT) * (row); - + Label labelNotification = new Label("+" + points); labelNotification.setTranslateX(xPosition); labelNotification.setTranslateY(yPosition); @@ -730,25 +740,25 @@ public class LevelController translateTransition.setFromY(yPosition); translateTransition.setToY(yPosition - (gamePaneHeight / Board.HEIGHT)); translateTransition.setCycleCount(1); - translateTransition.setAutoReverse(false); + translateTransition.setAutoReverse(false); ParallelTransition parallelTransition = new ParallelTransition(); parallelTransition.getChildren().addAll(fadeTransition, translateTransition); - parallelTransition.setCycleCount(1); + parallelTransition.setCycleCount(1); parallelTransition.setOnFinished(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { - anchorPaneGame.getChildren().remove(labelNotification); + anchorPaneGame.getChildren().remove(labelNotification); } }); parallelTransition.play(); } - + public void addMovingPowerUp(int row, int col, PowerUp powerUp) - { + { Label labelPowerUp = new Label(); labelPowerUp.setStyle("-fx-background-image: url(\"de/bricked/resources/textures/powerups/" + powerUp.getID() + ".png\");" + "-fx-background-position: center center;" + "-fx-background-repeat: no-repeat;" + "-fx-background-size: cover"); labelPowerUp.setAlignment(Pos.CENTER); @@ -756,54 +766,100 @@ public class LevelController labelPowerUp.setPrefWidth(gamePaneWidth / Board.WIDTH); labelPowerUp.setPrefHeight(gamePaneHeight / Board.HEIGHT); - + anchorPaneGame.getChildren().add(labelPowerUp); - labelPowerUp.setTranslateX(col * (gamePaneWidth/Board.WIDTH)); - labelPowerUp.setTranslateY(row * (gamePaneHeight/Board.HEIGHT)); - + labelPowerUp.setTranslateX(col * (gamePaneWidth / Board.WIDTH)); + labelPowerUp.setTranslateY(row * (gamePaneHeight / Board.HEIGHT)); + movingPowerUps.add(labelPowerUp); } - + private void movePowerUps() - { + { for(Iterator<Label> iterator = movingPowerUps.iterator(); iterator.hasNext();) { Label currentLabel = iterator.next(); - PowerUp currentPowerUp = (PowerUp)currentLabel.getUserData(); - currentLabel.setTranslateY(currentLabel.getTranslateY() + currentPowerUp.getSpeed()); - - //check collision with paddle + PowerUp currentPowerUp = (PowerUp)currentLabel.getUserData(); + currentLabel.setTranslateY(currentLabel.getTranslateY() + currentPowerUp.getSpeed()); + + // check collision with paddle Point2D labelPosition = new Point2D(currentLabel.getTranslateX(), currentLabel.getTranslateY()); Point2D paddlePosition = new Point2D(labelPaddle.getLayoutX() + labelPaddle.getTranslateX(), labelPaddle.getLayoutY() + labelPaddle.getTranslateY()); - - HitLocation hitLocation = game.collides(labelPosition, paddlePosition, paddle.getWidth(), paddle.getHeight(), true); + + HitLocation hitLocation = game.collides(labelPosition, paddlePosition, paddle.getWidth(), paddle.getHeight(), true); if(hitLocation != null && (hitLocation.equals(HitLocation.PADDLE) || hitLocation.equals(HitLocation.CORNER))) - { - //TODO activate method - //TODO check if timed + { + // TODO activate method Logger.log(LogLevel.DEBUG, "Collected PowerUp with ID = " + currentPowerUp.getID()); - currentPowerUp.activate(); + if(!currentPowerUp.isPermanent()) + { + addTimedPowerUp(currentPowerUp); + } + currentPowerUp.activate(this, game); anchorPaneGame.getChildren().remove(currentLabel); - iterator.remove(); + iterator.remove(); continue; - } - + } + if(currentLabel.getTranslateY() + currentLabel.getHeight() >= gamePaneHeight) { - //power up reached bottom wall + // power up reached bottom wall anchorPaneGame.getChildren().remove(currentLabel); - iterator.remove(); + iterator.remove(); } } } - + + // TODO if there is already one item of this type? + private void addTimedPowerUp(PowerUp powerUp) + { + Label labelPowerUp = new Label(String.valueOf(powerUp.getDurationInSeconds())); + labelPowerUp.setStyle("-fx-background-image: url(\"de/bricked/resources/textures/powerups/" + powerUp.getID() + ".png\");" + "-fx-background-position: center center;" + "-fx-background-repeat: no-repeat;" + "-fx-background-size: contain;" + "-fx-font-size: 16;" + "-fx-font-weight: bold;" + + "-fx-tect-fill: #cc0000;"); + labelPowerUp.setAlignment(Pos.CENTER); + labelPowerUp.setUserData(powerUp); + + labelPowerUp.setPrefWidth(35); + labelPowerUp.setPrefHeight(20); + + vboxPowerUps.getChildren().add(labelPowerUp); + + timedPowerUps.add(labelPowerUp); + + new CountdownTimer(powerUp.getDurationInSeconds(), labelPowerUp); + } + private void checkPowerUps() { - //TODO check timed powerups -// for(Iterator<PowerUp> iterator = game.getActivatedPowerUps().iterator(); iterator.hasNext();) -// { -// ) -// } + for(Iterator<Label> iterator = timedPowerUps.iterator(); iterator.hasNext();) + { + Label currentLabel = iterator.next(); + if(currentLabel.getText().equals("0")) + { + vboxPowerUps.getChildren().remove(currentLabel); + iterator.remove(); + } + } + } + + private void resetPowerUps() + { + movingPowerUps = new ArrayList<>(); + timedPowerUps = new ArrayList<>(); + vboxPowerUps.getChildren().clear(); + } + + public void changeBall(Ball newBall) + { + double translateX = stackPaneBall.getTranslateX(); + double translateY = stackPaneBall.getTranslateY(); + Point2D direction = game.getBall().getDirection(); + game.setBall(newBall); + + initBall(game.getBall().getType()); + stackPaneBall.setTranslateX(translateX); + stackPaneBall.setTranslateY(translateY); + game.getBall().setDirection(game.getNewSpeedDirection(direction, newBall.getType().getSpeedFactor())); } public void showLabelFPS(boolean value) @@ -825,7 +881,7 @@ public class LevelController } public void back() - { + { if(timer != null) { timer.stop(); @@ -836,7 +892,7 @@ public class LevelController game.resetMultiplicator(); game.resetPointsSinceLastMultiplicatorReset(); game.setBoard(null); - game.setLevelController(null); + game.setLevelController(null); game.setMovingPowerUps(new ArrayList<>()); game.setActivatedPowerUps(new ArrayList<>()); diff --git a/src/de/bricked/utils/CountdownTimer.java b/src/de/bricked/utils/CountdownTimer.java new file mode 100644 index 0000000000000000000000000000000000000000..e6e30c9773cb33cf2ca2fc479e088dd4245c10ba --- /dev/null +++ b/src/de/bricked/utils/CountdownTimer.java @@ -0,0 +1,42 @@ +package de.bricked.utils; + +import java.util.Timer; +import java.util.TimerTask; + +import javafx.application.Platform; +import javafx.scene.control.Label; + +public class CountdownTimer +{ + private int count; + + public CountdownTimer(int seconds, Label label) + { + this.count = seconds; + + Timer timer = new Timer(); + TimerTask task = new TimerTask() + { + @Override + public void run() + { + Platform.runLater(()->{ + try + { + label.setText(String.valueOf(count)); + } + catch(Exception e) + { + + } + }); + if(count > 0) + count--; + + if(count == 0) + timer.cancel(); + } + }; + timer.schedule(task, 0, 1000); + } +} \ No newline at end of file diff --git a/src/de/bricked/utils/FileUtils.java b/src/de/bricked/utils/FileUtils.java index 6570764251f3203747b3e5b8f7d5154d82c2eff4..3727a554b4a97eda94f8800e5d9cb4c0b2937e73 100644 --- a/src/de/bricked/utils/FileUtils.java +++ b/src/de/bricked/utils/FileUtils.java @@ -1,17 +1,15 @@ package de.bricked.utils; -import de.bricked.game.levels.LevelPackHandler; -import logger.LogLevel; -import logger.Logger; -import tools.PathUtils; - import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; +import logger.LogLevel; +import logger.Logger; + public class FileUtils { private static String getContentsFromInputStream(InputStream inputStream) throws Exception