From 143e6e0db41c16568d48051fb25d04410895f4c6 Mon Sep 17 00:00:00 2001 From: pacien Date: Fri, 2 Feb 2018 01:59:10 +0100 Subject: Move controller functions for Game and Stage Signed-off-by: pacien --- src/main/java/fr/umlv/java/wallj/context/Game.java | 29 +++++++++++---- .../java/fr/umlv/java/wallj/context/Stage.java | 41 +++++++++++++++++----- .../fr/umlv/java/wallj/controller/Controller.java | 11 ------ .../java/wallj/controller/GameStateController.java | 38 -------------------- .../java/wallj/controller/StageController.java | 17 --------- .../wallj/controller/StagePhysicsController.java | 30 ---------------- 6 files changed, 55 insertions(+), 111 deletions(-) delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/Controller.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/GameStateController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/StageController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java diff --git a/src/main/java/fr/umlv/java/wallj/context/Game.java b/src/main/java/fr/umlv/java/wallj/context/Game.java index 41d51db..2f5b1ca 100644 --- a/src/main/java/fr/umlv/java/wallj/context/Game.java +++ b/src/main/java/fr/umlv/java/wallj/context/Game.java @@ -2,8 +2,10 @@ package fr.umlv.java.wallj.context; import fr.umlv.java.wallj.board.Board; import fr.umlv.java.wallj.controller.Controller; -import fr.umlv.java.wallj.controller.GameStateController; +import fr.umlv.java.wallj.event.ConfirmOrder; import fr.umlv.java.wallj.event.Event; +import fr.umlv.java.wallj.event.Events; +import fr.umlv.java.wallj.event.GameOverEvent; import java.util.*; @@ -14,7 +16,6 @@ import java.util.*; */ public final class Game implements Updateable { private Stage currentStage; - private final List controllers; private int indexBoard; private final List boards; private boolean over; @@ -23,8 +24,6 @@ public final class Game implements Updateable { * @param boards the list of boards charged for the game */ public Game(List boards) { - this.controllers = new LinkedList<>(); - this.controllers.add(new GameStateController()); Objects.requireNonNull(boards); if (boards.isEmpty()) { throw new IllegalArgumentException("The list of boards is empty, not able to create a correct game from this."); @@ -84,11 +83,27 @@ public final class Game implements Updateable { */ @Override public List update(Context context) { + boolean isConfirmOrder = Events.findFirst(context.getEvents(),ConfirmOrder.class).isPresent(); + boolean isGameOverEvent = Events.findFirst(context.getEvents(),GameOverEvent.class).isPresent(); + Game currentGame = context.getGame(); LinkedList events = new LinkedList<>(); - for (Controller controller : controllers) { - events.addAll(controller.update(context)); + if (isGameOverEvent) { + currentGame.setOver(); + } else { + if (isConfirmOrder) { + if (currentGame.getCurrentStage().isCleared()) { // FIXME: use StageClearedEvent + if (currentGame.hasNextBoard()) { //continue + currentGame.nextStage(); + } else { //no more board so game over => exiting + currentGame.setOver(); + } + } else {//retry + currentGame.retryStage(); + } + } } - events.addAll(currentStage.update(context)); + + // FIXME: update underlying stage and merge generated events return events; } diff --git a/src/main/java/fr/umlv/java/wallj/context/Stage.java b/src/main/java/fr/umlv/java/wallj/context/Stage.java index a124888..860f451 100644 --- a/src/main/java/fr/umlv/java/wallj/context/Stage.java +++ b/src/main/java/fr/umlv/java/wallj/context/Stage.java @@ -3,12 +3,11 @@ package fr.umlv.java.wallj.context; import fr.umlv.java.wallj.block.Block; import fr.umlv.java.wallj.board.Board; import fr.umlv.java.wallj.board.BoardConverter; -import fr.umlv.java.wallj.controller.Controller; -import fr.umlv.java.wallj.controller.StagePhysicsController; -import fr.umlv.java.wallj.event.Event; +import fr.umlv.java.wallj.event.*; import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.World; +import java.time.Duration; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -17,15 +16,17 @@ import java.util.Objects; * @author Pacien TRAN-GIRARD */ public class Stage implements Updateable { - private final List controllers = Collections.singletonList(new StagePhysicsController(this)); - private final World world = new World(new Vec2()); + private static final int VELOCITY_TICK_PER_MS = 6; + private static final int POSITION_TICK_PER_MS = 2; + private final World world = new World(new Vec2()); private final Board board; private final List blocks; public Stage(Board board) { this.board = Objects.requireNonNull(board); this.blocks = BoardConverter.boardToWorld(board); + // TODO: link blocks to world } public World getWorld() { @@ -39,7 +40,7 @@ public class Stage implements Updateable { return board; } - public boolean isCleared() { + private boolean isCleared() { // TODO return false; } @@ -50,7 +51,31 @@ public class Stage implements Updateable { */ @Override public List update(Context context) { - // TODO - return null; + updatePhysicalWorld(context.getTimeDelta()); + handleBlockDestruction(context.getEvents()); + handleBlockCreation(context.getEvents()); + return generateEvents(); + } + + private void updatePhysicalWorld(Duration timeDelta) { + int dt = (int) timeDelta.toMillis(); + world.step(dt, dt * VELOCITY_TICK_PER_MS, dt * POSITION_TICK_PER_MS); + } + + private void handleBlockDestruction(List events) { + Events.filter(events, BlockDestroyEvent.class).forEach(event -> { + }); // TODO + } + + private void handleBlockCreation(List events) { + Events.filter(events, BlockCreateEvent.class).forEach(event -> { + }); // TODO + } + + private List generateEvents() { + if (isCleared()) + return Collections.singletonList(new StageClearedEvent()); + else + return Collections.emptyList(); } } diff --git a/src/main/java/fr/umlv/java/wallj/controller/Controller.java b/src/main/java/fr/umlv/java/wallj/controller/Controller.java deleted file mode 100644 index e975bcc..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/Controller.java +++ /dev/null @@ -1,11 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Updateable; - -/** - * @author Pacien TRAN-GIRARD - */ -@FunctionalInterface -public interface Controller extends Updateable { - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java b/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java deleted file mode 100644 index 7f0464c..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java +++ /dev/null @@ -1,38 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.context.Game; -import fr.umlv.java.wallj.event.ConfirmOrder; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.event.GameOverEvent; - -import java.util.LinkedList; -import java.util.List; - -public class GameStateController implements Controller { - - @Override - public List update(Context context) { - boolean isConfirmOrder = Event.findFirst(context.getEvents(),ConfirmOrder.class).isPresent(); - boolean isGameOverEvent = Event.findFirst(context.getEvents(),GameOverEvent.class).isPresent(); - Game currentGame = context.getGame(); - LinkedList events = new LinkedList<>(); - if (isGameOverEvent) { - currentGame.setOver(); - } else { - if (isConfirmOrder) { - if (currentGame.getCurrentStage().isCleared()) { - if (currentGame.hasNextBoard()) { //continue - currentGame.nextStage(); - } else { //no more board so game over => exiting - currentGame.setOver(); - } - } else {//retry - currentGame.retryStage(); - } - } - } - return events; - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/StageController.java b/src/main/java/fr/umlv/java/wallj/controller/StageController.java deleted file mode 100644 index 57a87fd..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/StageController.java +++ /dev/null @@ -1,17 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.event.Event; - -import java.util.Collections; -import java.util.List; - -public class StageController implements Controller { - //TODO - - @Override - public List update(Context context) { - return Collections.emptyList(); - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java b/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java deleted file mode 100644 index 74c1b54..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Stage; -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.event.Event; - -import java.util.List; -import java.util.Objects; - -/** - * @author Pacien TRAN-GIRARD - */ -public class StagePhysicsController implements Controller { - private static final int VELOCITY_TICK_PER_MS = 6; - private static final int POSITION_TICK_PER_MS = 2; - - private final Stage stage; - - public StagePhysicsController(Stage stage) { - this.stage = Objects.requireNonNull(stage); - } - - @Override - public List update(Context context) { - int dt = (int) context.getTimeDelta().toMillis(); - stage.getWorld().step(dt, dt * VELOCITY_TICK_PER_MS, dt * POSITION_TICK_PER_MS); - return null; - } - -} -- cgit v1.2.3