From a1942c8cfebd7c850e2cc3ecf94aa6dd8039409f Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 1 Feb 2018 15:47:44 +0100 Subject: Add stage controller and Updateable interface Signed-off-by: pacien --- src/main/java/fr/umlv/java/wallj/block/Block.java | 4 ++- src/main/java/fr/umlv/java/wallj/block/Stage.java | 41 +++++++++++++++------- src/main/java/fr/umlv/java/wallj/context/Game.java | 5 +-- .../fr/umlv/java/wallj/context/Updateable.java | 28 +++++++++++++++ .../fr/umlv/java/wallj/controller/Controller.java | 12 +++---- .../wallj/controller/StagePhysicsController.java | 34 ++++++++++++++++++ 6 files changed, 102 insertions(+), 22 deletions(-) create mode 100644 src/main/java/fr/umlv/java/wallj/context/Updateable.java create mode 100644 src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java (limited to 'src/main/java') diff --git a/src/main/java/fr/umlv/java/wallj/block/Block.java b/src/main/java/fr/umlv/java/wallj/block/Block.java index d3c349e..ba299b4 100644 --- a/src/main/java/fr/umlv/java/wallj/block/Block.java +++ b/src/main/java/fr/umlv/java/wallj/block/Block.java @@ -2,6 +2,7 @@ package fr.umlv.java.wallj.block; import fr.umlv.java.wallj.board.TileVec2; import fr.umlv.java.wallj.context.Context; +import fr.umlv.java.wallj.context.Updateable; import fr.umlv.java.wallj.controller.BlockController; import fr.umlv.java.wallj.controller.Controller; import fr.umlv.java.wallj.event.Event; @@ -15,7 +16,7 @@ import java.util.stream.Collectors; * * @author Pacien TRAN-GIRARD */ -public abstract class Block { +public abstract class Block implements Updateable { private final BlockType type; private List controllers; @@ -66,6 +67,7 @@ public abstract class Block { * @param ctx execution context * @return list of generated events */ + @Override public List update(Context ctx) { return controllers.stream() .flatMap(controller -> controller.update(ctx).stream()) diff --git a/src/main/java/fr/umlv/java/wallj/block/Stage.java b/src/main/java/fr/umlv/java/wallj/block/Stage.java index d34af97..cbb75e5 100644 --- a/src/main/java/fr/umlv/java/wallj/block/Stage.java +++ b/src/main/java/fr/umlv/java/wallj/block/Stage.java @@ -1,42 +1,59 @@ package fr.umlv.java.wallj.block; import fr.umlv.java.wallj.board.Board; +import fr.umlv.java.wallj.board.BoardConverter; import fr.umlv.java.wallj.context.Context; +import fr.umlv.java.wallj.context.Updateable; +import fr.umlv.java.wallj.controller.Controller; +import fr.umlv.java.wallj.controller.StagePhysicsController; import fr.umlv.java.wallj.event.Event; +import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.World; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Objects; /** - * @author + * @author Pacien TRAN-GIRARD */ -public class Stage { - //TODO Class Stage - private final Board currentBoard; +public class Stage implements Updateable { + private final List controllers = Collections.singletonList(new StagePhysicsController(this)); + private final World world = new World(new Vec2()); + + private final Board board; + private final List blocks; public Stage(Board board) { - currentBoard = Objects.requireNonNull(board); + this.board = Objects.requireNonNull(board); + this.blocks = BoardConverter.boardToWorld(board); + } + + public World getWorld() { + return world; } /** * @return the current board of the game */ - public Board getCurrentBoard() { - return currentBoard; + public Board getBoard() { + return board; + } + + public boolean isCleared() { + // TODO + return false; } /** * @param context the current context * @return a list of new events to perform */ + @Override public List update(Context context) { //TODO return null; } - public boolean isCleared() { - // TODO - return false; - } - } 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 6bc63ae..182f121 100644 --- a/src/main/java/fr/umlv/java/wallj/context/Game.java +++ b/src/main/java/fr/umlv/java/wallj/context/Game.java @@ -13,7 +13,7 @@ import java.util.*; * * @author Adam NAILI */ -public final class Game { +public final class Game implements Updateable { private Stage currentStage; private final List controllers; private int indexBoard; @@ -75,13 +75,14 @@ public final class Game { } public void retryStage() { - currentStage = new Stage(currentStage.getCurrentBoard()); + currentStage = new Stage(currentStage.getBoard()); } /** * @param context the current context * @return a list of new events */ + @Override public List update(Context context) { LinkedList events = new LinkedList<>(); for (Controller controller : controllers) { diff --git a/src/main/java/fr/umlv/java/wallj/context/Updateable.java b/src/main/java/fr/umlv/java/wallj/context/Updateable.java new file mode 100644 index 0000000..468fe2c --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/context/Updateable.java @@ -0,0 +1,28 @@ +package fr.umlv.java.wallj.context; + +import fr.umlv.java.wallj.event.Event; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Pacien TRAN-GIRARD + */ +public interface Updateable { + /** + * @param context an update context + * @return a list of generated events + */ + List update(Context context); + + /** + * @param updateables list of updateables + * @param context an update context + * @return a list of collected generated events + */ + static List updateAll(List updateables, Context context) { + return updateables.stream() + .flatMap(u -> u.update(context).stream()) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/fr/umlv/java/wallj/controller/Controller.java b/src/main/java/fr/umlv/java/wallj/controller/Controller.java index a40fb36..e975bcc 100644 --- a/src/main/java/fr/umlv/java/wallj/controller/Controller.java +++ b/src/main/java/fr/umlv/java/wallj/controller/Controller.java @@ -1,13 +1,11 @@ package fr.umlv.java.wallj.controller; -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.event.Event; - -import java.util.List; +import fr.umlv.java.wallj.context.Updateable; /** - * @author + * @author Pacien TRAN-GIRARD */ -public interface Controller { - List update(Context context); +@FunctionalInterface +public interface Controller extends Updateable { + } diff --git a/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java b/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java new file mode 100644 index 0000000..0846584 --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java @@ -0,0 +1,34 @@ +package fr.umlv.java.wallj.controller; + +import fr.umlv.java.wallj.block.Stage; +import fr.umlv.java.wallj.context.Context; +import fr.umlv.java.wallj.event.Event; +import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.World; + +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; + private final World world; + + public StagePhysicsController(Stage stage) { + this.stage = Objects.requireNonNull(stage); + this.world = new World(new Vec2()); + } + + @Override + public List update(Context context) { + int dt = (int) context.getTimeDelta().toMillis(); + world.step(dt, dt * VELOCITY_TICK_PER_MS, dt * POSITION_TICK_PER_MS); + return null; + } + +} -- cgit v1.2.3