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/docs/class.puml | 17 +++++---- 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 ++++++++++++++++++ 7 files changed, 112 insertions(+), 29 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 diff --git a/src/docs/class.puml b/src/docs/class.puml index b404102..dfbf5f8 100644 --- a/src/docs/class.puml +++ b/src/docs/class.puml @@ -23,6 +23,11 @@ package viewer { } package context { + interface Updateable { + List update(Context) + static List updateAll(List, Context) + } + class Context { Context(Game,List,GraphicsContext) Game getGame() @@ -52,7 +57,7 @@ package context { GraphicsContext clearScreen() } - class Game { + class Game implements Updateable { Stage final List int indexBoard @@ -91,7 +96,6 @@ package event { class ConfirmEvent implements InputEvent class GameOverEvent implements Event - class ExplosionEvent implements GameEvent { Block source Body source @@ -161,7 +165,7 @@ package block { Block build(BlockType, TileVec2) } - abstract class Block { + abstract class Block implements Updateable { BlockType List Vec2 @@ -180,10 +184,11 @@ package block { class GarbageBlock extends Block class RobotBlock extends Block - class Stage { + class Stage implements Updateable { List Board Stage(Board) + Board getBoard() List getBlocks() List update(Context) bool isCleared() @@ -191,9 +196,7 @@ package block { } package controller { - interface Controller { - List update(Context) - } + interface Controller extends Updateable abstract class BlockController implements Controller { Block 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