From 5c27749c76d59e2299c67b4676426905c2a17544 Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 1 Feb 2018 12:06:00 +0100 Subject: Add time delta to context Signed-off-by: pacien --- src/main/java/fr/umlv/java/wallj/context/Context.java | 15 +++++++++++++-- src/main/java/fr/umlv/java/wallj/viewer/Viewer.java | 5 ++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/umlv/java/wallj/context/Context.java b/src/main/java/fr/umlv/java/wallj/context/Context.java index bb684b8..a8796e5 100644 --- a/src/main/java/fr/umlv/java/wallj/context/Context.java +++ b/src/main/java/fr/umlv/java/wallj/context/Context.java @@ -2,6 +2,7 @@ package fr.umlv.java.wallj.context; import fr.umlv.java.wallj.event.Event; +import java.time.Duration; import java.util.List; import java.util.Objects; @@ -15,16 +16,19 @@ public final class Context { private final Game game; private final List events; private final GraphicsContext graphicsContext; + private final Duration timeDelta; /** - * @param game the current game + * @param game the current game * @param events the list of events of the tick * @param graphicsContext the current graphics context + * @param timeDelta elapsed time since last update */ - public Context(Game game, List events, GraphicsContext graphicsContext) { + public Context(Game game, List events, GraphicsContext graphicsContext, Duration timeDelta) { this.game = Objects.requireNonNull(game); this.events = Objects.requireNonNull(events); this.graphicsContext = Objects.requireNonNull(graphicsContext); + this.timeDelta = Objects.requireNonNull(timeDelta); } /** @@ -47,4 +51,11 @@ public final class Context { public GraphicsContext getGraphicsContext() { return graphicsContext; } + + /** + * @return the elapsed time since last update + */ + public Duration getTimeDelta() { + return timeDelta; + } } diff --git a/src/main/java/fr/umlv/java/wallj/viewer/Viewer.java b/src/main/java/fr/umlv/java/wallj/viewer/Viewer.java index a87f418..463a461 100644 --- a/src/main/java/fr/umlv/java/wallj/viewer/Viewer.java +++ b/src/main/java/fr/umlv/java/wallj/viewer/Viewer.java @@ -17,12 +17,15 @@ import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; +import java.time.Duration; import java.util.LinkedList; import java.util.List; import java.util.Objects; /** * Link between application and Zen 5 + * + * @author Adam NAILI */ public final class Viewer { @@ -54,7 +57,7 @@ public final class Viewer { InputHandler inputHandler = new InputHandler(applicationContext); ScreenManager screenManager = new ScreenManager(applicationContext, graphics2D); events.addAll(inputHandler.getEvents()); - Context context = new Context(currentGame, events, screenManager.clearScreen()); + Context context = new Context(currentGame, events, screenManager.clearScreen(), Duration.ZERO); // TODO: duration List newEvents = currentGame.update(context); //return new events created from update(); events.clear(); return newEvents; -- cgit v1.2.3 From 48902d6696e40cb100c86fa83b131b4b7a016f52 Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 1 Feb 2018 12:25:04 +0100 Subject: Rename GameController and update class diagram Signed-off-by: pacien --- src/docs/class.puml | 6 ++-- src/main/java/fr/umlv/java/wallj/context/Game.java | 4 +-- .../umlv/java/wallj/controller/GameController.java | 39 ---------------------- .../java/wallj/controller/GameStateController.java | 39 ++++++++++++++++++++++ src/main/resources/.gitkeep | 0 src/test/java/fr/umlv/java/wallj/.gitkeep | 0 src/test/resources/.gitkeep | 0 7 files changed, 43 insertions(+), 45 deletions(-) delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/GameController.java create mode 100644 src/main/java/fr/umlv/java/wallj/controller/GameStateController.java delete mode 100644 src/main/resources/.gitkeep delete mode 100644 src/test/java/fr/umlv/java/wallj/.gitkeep delete mode 100644 src/test/resources/.gitkeep diff --git a/src/docs/class.puml b/src/docs/class.puml index dbfb731..b404102 100644 --- a/src/docs/class.puml +++ b/src/docs/class.puml @@ -25,12 +25,10 @@ package viewer { package context { class Context { Context(Game,List,GraphicsContext) - final Game - final List - final GraphicsContext Game getGame() List getEvents() GraphicsContext getGraphicsContext() + Duration getTimeDelta() } class GraphicsContext { @@ -205,7 +203,7 @@ package controller { class BlockControllerFactory { BlockController build(Block) } - class GameController implements Controller + class GameStateController implements Controller abstract class PhysicsController extends BlockController abstract class DisplayController extends BlockController 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 d5f9873..6bc63ae 100644 --- a/src/main/java/fr/umlv/java/wallj/context/Game.java +++ b/src/main/java/fr/umlv/java/wallj/context/Game.java @@ -2,7 +2,7 @@ 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.GameController; +import fr.umlv.java.wallj.controller.GameStateController; import fr.umlv.java.wallj.event.Event; import fr.umlv.java.wallj.block.Stage; @@ -25,7 +25,7 @@ public final class Game { */ public Game(List boards) { this.controllers = new LinkedList<>(); - this.controllers.add(new GameController()); + 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."); diff --git a/src/main/java/fr/umlv/java/wallj/controller/GameController.java b/src/main/java/fr/umlv/java/wallj/controller/GameController.java deleted file mode 100644 index 456793a..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/GameController.java +++ /dev/null @@ -1,39 +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.ConfirmEvent; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.event.GameOverEvent; - -import java.util.LinkedList; -import java.util.List; - -public class GameController implements Controller { - - @Override - public List update(Context context) { - boolean isConfirmEvent = context.getEvents().stream().anyMatch(event -> event instanceof ConfirmEvent); - boolean isGameOver = context.getEvents().stream().allMatch(event -> event instanceof GameOverEvent); - Game currentGame = context.getGame(); - LinkedList events = new LinkedList<>(); - if (isConfirmEvent) { - //TODO exiting - if (!isGameOver) { - if (currentGame.getCurrentStage().isCleared()) { - if (currentGame.hasNextBoard()) { //continue - currentGame.nextStage(); - } else { - events.add(new GameOverEvent()); - } - } else {//retry - currentGame.retryStage(); - } - } else { - currentGame.setOver(); - } - } - return events; - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java b/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java new file mode 100644 index 0000000..2c548f2 --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java @@ -0,0 +1,39 @@ +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.ConfirmEvent; +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 isConfirmEvent = context.getEvents().stream().anyMatch(event -> event instanceof ConfirmEvent); + boolean isGameOver = context.getEvents().stream().allMatch(event -> event instanceof GameOverEvent); + Game currentGame = context.getGame(); + LinkedList events = new LinkedList<>(); + if (isConfirmEvent) { + //TODO exiting + if (!isGameOver) { + if (currentGame.getCurrentStage().isCleared()) { + if (currentGame.hasNextBoard()) { //continue + currentGame.nextStage(); + } else { + events.add(new GameOverEvent()); + } + } else {//retry + currentGame.retryStage(); + } + } else { + currentGame.setOver(); + } + } + return events; + } + +} diff --git a/src/main/resources/.gitkeep b/src/main/resources/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/fr/umlv/java/wallj/.gitkeep b/src/test/java/fr/umlv/java/wallj/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/resources/.gitkeep b/src/test/resources/.gitkeep deleted file mode 100644 index e69de29..0000000 -- cgit v1.2.3 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 From a9bfd43fffabe4df21429976bb5dd4e2fb93d2db Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 1 Feb 2018 16:04:26 +0100 Subject: Remove useless links Signed-off-by: pacien --- src/docs/class.puml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/docs/class.puml b/src/docs/class.puml index dfbf5f8..0506357 100644 --- a/src/docs/class.puml +++ b/src/docs/class.puml @@ -230,11 +230,6 @@ package controller { class BombDisplayController extends DisplayController } -RobotPhysicsController --> PathFinder -RobotPhysicsController --> BoardConverter - -Stage --> BoardConverter - PhysicsController --() JBox2D Zen5 ()-- Viewer Zen5 ()-- Main -- cgit v1.2.3 From 558af8c25aee52aad4edeaa998511a77704c2c97 Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 1 Feb 2018 16:04:39 +0100 Subject: Dedup Signed-off-by: pacien --- .../java/fr/umlv/java/wallj/controller/StagePhysicsController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java b/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java index 0846584..6719302 100644 --- a/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java +++ b/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java @@ -17,17 +17,15 @@ public class StagePhysicsController implements Controller { 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); + stage.getWorld().step(dt, dt * VELOCITY_TICK_PER_MS, dt * POSITION_TICK_PER_MS); return null; } -- cgit v1.2.3 From cb05ab93e0ca27855a475f6c27a70ec869048f54 Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 1 Feb 2018 18:38:08 +0100 Subject: Refactor blocks and controllers Signed-off-by: pacien --- src/docs/class.puml | 115 +++++++++------------ src/main/java/fr/umlv/java/wallj/block/Block.java | 47 ++------- .../fr/umlv/java/wallj/block/BlockFactory.java | 5 +- .../java/fr/umlv/java/wallj/block/BombBlock.java | 59 +++++++++-- .../fr/umlv/java/wallj/block/GarbageBlock.java | 23 ++++- .../java/fr/umlv/java/wallj/block/JBoxBlock.java | 36 +++++++ .../java/fr/umlv/java/wallj/block/RobotBlock.java | 49 ++++++++- .../java/fr/umlv/java/wallj/block/SolidDef.java | 45 ++++++++ src/main/java/fr/umlv/java/wallj/block/Stage.java | 59 ----------- .../java/fr/umlv/java/wallj/block/TrashBlock.java | 23 ++++- .../java/fr/umlv/java/wallj/block/WallBlock.java | 23 ++++- src/main/java/fr/umlv/java/wallj/context/Game.java | 1 - .../java/fr/umlv/java/wallj/context/Stage.java | 56 ++++++++++ .../java/wallj/controller/BlockController.java | 21 ---- .../wallj/controller/BlockControllerFactory.java | 49 --------- .../wallj/controller/BombDisplayController.java | 35 ------- .../wallj/controller/BombPhysicsController.java | 26 ----- .../wallj/controller/GarbageDisplayController.java | 30 ------ .../wallj/controller/GarbagePhysicsController.java | 25 ----- .../java/wallj/controller/PhysicsController.java | 12 --- .../wallj/controller/RobotDisplayController.java | 30 ------ .../wallj/controller/RobotPhysicsController.java | 26 ----- .../wallj/controller/StagePhysicsController.java | 4 +- .../wallj/controller/TrashDisplayController.java | 30 ------ .../wallj/controller/TrashPhysicsController.java | 25 ----- .../wallj/controller/WallDisplayController.java | 30 ------ .../wallj/controller/WallPhysicsController.java | 26 ----- 27 files changed, 355 insertions(+), 555 deletions(-) create mode 100644 src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java create mode 100644 src/main/java/fr/umlv/java/wallj/block/SolidDef.java delete mode 100644 src/main/java/fr/umlv/java/wallj/block/Stage.java create mode 100644 src/main/java/fr/umlv/java/wallj/context/Stage.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/BlockController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/BlockControllerFactory.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/BombDisplayController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/BombPhysicsController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/GarbageDisplayController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/GarbagePhysicsController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/PhysicsController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/RobotDisplayController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/RobotPhysicsController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/TrashDisplayController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/TrashPhysicsController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/WallDisplayController.java delete mode 100644 src/main/java/fr/umlv/java/wallj/controller/WallPhysicsController.java diff --git a/src/docs/class.puml b/src/docs/class.puml index 0506357..cfc78b1 100644 --- a/src/docs/class.puml +++ b/src/docs/class.puml @@ -1,6 +1,8 @@ @startuml skinparam linetype ortho +skinparam monochrome reverse +skinparam backgroundColor #FFFFFF class Main{ static void main(String[]) @@ -29,7 +31,7 @@ package context { } class Context { - Context(Game,List,GraphicsContext) + Context(Game, List, GraphicsContext) Game getGame() List getEvents() GraphicsContext getGraphicsContext() @@ -37,22 +39,23 @@ package context { } class GraphicsContext { - final Graphics2D - final ScreenInfo + Graphics2D, ScreenInfo + paintCircle(Color, Vec2, float) paintSquare(Color, Vec2, float, float) paintString(Color, Vec2,String) } class InputHandler { - private final ApplicationContext + ApplicationContext + InputHandler(ApplicationContext) List getEvents() } class ScreenManager { - private final ApplicationContext - private final Graphics2D + ApplicationContext, Graphics2D + ScreenManager(ApplicationContext,Graphics2D) GraphicsContext clearScreen() } @@ -63,6 +66,7 @@ package context { int indexBoard final List bool over + Game(List) Stage getStage() bool isOver() @@ -71,6 +75,14 @@ package context { void retryStage() List update(Context context) } + + class Stage implements Updateable { + Stage(Board) + Board getBoard() + List getBlocks() + List update(Context) + bool isCleared() + } } package event { @@ -116,7 +128,6 @@ package board { class BoardValidator { static class Constraint - Board BoardValidator(Board) BoardValidator validate(Predicate, String error) @@ -132,15 +143,12 @@ package board { static final int TILE_DIM static TileVec2 fromVec2(Vec2) - Vec2 TileVec2(col, row) Vec2 toPixelPos() List neighbors() } class PathFinder { - Graph - PathFinder(Board) List findPath(TileVec2 origin, TileVec2 target) } @@ -148,12 +156,8 @@ package board { package block { enum BlockType { - FREE - WALL - TRASH - GARBAGE - ROBOT - BOMB + FREE, WALL, TRASH, + GARBAGE, ROBOT, BOMB boolean isBounding() boolean mustBeReachable() @@ -166,71 +170,48 @@ package block { } abstract class Block implements Updateable { - BlockType - List - Vec2 - - Block(BlockType, List, Vec2) - void setPos(Vec2) - BlockType getBlockType() - Vec2 getPos() + Block(BlockType) + BlockType getType() TileVec2 getTile() - List update(Context) + abstract Vec2 getPos() + abstract void link(World) } - - class WallBlock extends Block - class TrashBlock extends Block - class BombBlock extends Block - class GarbageBlock extends Block - class RobotBlock extends Block - - class Stage implements Updateable { - List - Board - Stage(Board) - Board getBoard() - List getBlocks() - List update(Context) - bool isCleared() + + abstract class JBoxBlock extends Block { + JBoxBlock(BlockType, BodyType, Shape, Vec2) + Vec2 getPos() + void link(World) } -} - -package controller { - interface Controller extends Updateable - - abstract class BlockController implements Controller { - Block - Controller(Block) + + class RobotBlock extends Block { + Vec2 getPos() + void link(World world) + List update(Context context) } - class BlockControllerFactory { - BlockController build(Block) + class WallBlock extends JBoxBlock { + List update(Context context) } - class GameStateController implements Controller - abstract class PhysicsController extends BlockController - abstract class DisplayController extends BlockController - - class WallPhysicsController extends PhysicsController - class WallDisplayController extends DisplayController - - class TrashPhysicsController extends PhysicsController - class TrashDisplayController extends DisplayController + class TrashBlock extends JBoxBlock { + List update(Context context) + } - class GarbagePhysicsController extends PhysicsController - class GarbageDisplayController extends DisplayController + class BombBlock extends JBoxBlock { + List update(Context context) + } - class RobotPhysicsController extends PhysicsController { - List path + class GarbageBlock extends JBoxBlock { + List update(Context context) } +} - class RobotDisplayController extends DisplayController +package controller { + interface Controller extends Updateable - class BombPhysicsController extends PhysicsController - class BombDisplayController extends DisplayController + class GameStateController implements Controller } -PhysicsController --() JBox2D Zen5 ()-- Viewer Zen5 ()-- Main Main --> viewer 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 ba299b4..7ae9c06 100644 --- a/src/main/java/fr/umlv/java/wallj/block/Block.java +++ b/src/main/java/fr/umlv/java/wallj/block/Block.java @@ -1,15 +1,11 @@ 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; import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.World; import java.util.*; -import java.util.stream.Collectors; /** * A block. @@ -17,29 +13,13 @@ import java.util.stream.Collectors; * @author Pacien TRAN-GIRARD */ public abstract class Block implements Updateable { - private final BlockType type; - private List controllers; - private Vec2 pos; /** * @param type type of block - * @param pos initial position */ - Block(BlockType type, Vec2 pos) { + Block(BlockType type) { this.type = Objects.requireNonNull(type); - this.pos = Objects.requireNonNull(pos).clone(); - } - - void setControllers(List l) { - controllers = Collections.unmodifiableList(new LinkedList<>(Objects.requireNonNull(l))); - } - - /** - * @param pos new position to set - */ - public void setPos(Vec2 pos) { - this.pos = Objects.requireNonNull(pos).clone(); } /** @@ -49,29 +29,20 @@ public abstract class Block implements Updateable { return type; } - /** - * @return the current position - */ - public Vec2 getPos() { - return pos.clone(); - } - /** * @return the current tile position */ public TileVec2 getTile() { - return TileVec2.of(pos); + return TileVec2.of(getPos()); } /** - * @param ctx execution context - * @return list of generated events + * @return the current position */ - @Override - public List update(Context ctx) { - return controllers.stream() - .flatMap(controller -> controller.update(ctx).stream()) - .collect(Collectors.toList()); - } + public abstract Vec2 getPos(); + /** + * @param world a JBox2D world + */ + public abstract void link(World world); } diff --git a/src/main/java/fr/umlv/java/wallj/block/BlockFactory.java b/src/main/java/fr/umlv/java/wallj/block/BlockFactory.java index 951d182..acd280f 100644 --- a/src/main/java/fr/umlv/java/wallj/block/BlockFactory.java +++ b/src/main/java/fr/umlv/java/wallj/block/BlockFactory.java @@ -1,7 +1,6 @@ package fr.umlv.java.wallj.block; import fr.umlv.java.wallj.board.TileVec2; -import fr.umlv.java.wallj.controller.BlockControllerFactory; import org.jbox2d.common.Vec2; /** @@ -30,9 +29,7 @@ public final class BlockFactory { } public static Block build(BlockType type, TileVec2 pos) { - Block block = forType(type, pos.toVec2()); - if (block != null) block.setControllers(BlockControllerFactory.build(block)); - return block; + return forType(type, pos.toVec2()); } private BlockFactory() { diff --git a/src/main/java/fr/umlv/java/wallj/block/BombBlock.java b/src/main/java/fr/umlv/java/wallj/block/BombBlock.java index de7a3b9..f58f1cc 100644 --- a/src/main/java/fr/umlv/java/wallj/block/BombBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/BombBlock.java @@ -1,28 +1,69 @@ 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.GraphicsContext; +import fr.umlv.java.wallj.event.Event; import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.BodyType; + +import java.awt.*; +import java.time.Duration; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; /** * A bomb block. * * @author Pacien TRAN-GIRARD + * @author Adam NAILI */ -public class BombBlock extends Block { - - private static final int INITIAL_TIMER = 1; // sec +public class BombBlock extends JBoxBlock { + private static final Duration TIME_INCREMENT = Duration.ofSeconds(1); + private static final Duration MIN_TIME = Duration.ofSeconds(1); + private static final Duration MAX_TIME = Duration.ofSeconds(9); - private int timer = INITIAL_TIMER; + private Duration timer = MIN_TIME; BombBlock(Vec2 pos) { - super(BlockType.BOMB, pos); + super(BlockType.BOMB, BodyType.STATIC, SolidDef.squareShape(), pos); + } + + private void incrementTimer() { + timer = timer.compareTo(MAX_TIME) <= 0 ? timer.plus(TIME_INCREMENT) : MIN_TIME; + } + + private void decrementTimer(Duration d) { + if (timer.isNegative()) throw new IllegalStateException("This bomb has already exploded."); + timer = timer.minus(d); } - public void setTimer(int sec) { - timer = sec; + @Override + public List update(Context context) { + if (containsUpdateEvent(context.getEvents())) incrementTimer(); + paint(context.getGraphicsContext()); + return consume(context.getTimeDelta()); } - public int getTimer() { - return timer; + private boolean containsUpdateEvent(List events) { + return false; // TODO: contains PutBombEvent with same current tile location? } + private List consume(Duration timeDelta) { + decrementTimer(timeDelta); + + if (timer.isNegative()) + return Collections.unmodifiableList(Arrays.asList()); // TODO: BombExplosionEvent and BlockRemoveEvent + else + return Collections.emptyList(); + } + + private void paint(GraphicsContext graphicsContext) { + graphicsContext.paintCircle(Color.BLACK, getPos(), TileVec2.TILE_DIM); + Vec2 textPosition = getPos(); + textPosition.x += TileVec2.TILE_DIM / 4.0f; + textPosition.y += 3 * TileVec2.TILE_DIM / 4.0f; + graphicsContext.paintString(Color.RED, textPosition, Long.toString(timer.getSeconds())); + } } diff --git a/src/main/java/fr/umlv/java/wallj/block/GarbageBlock.java b/src/main/java/fr/umlv/java/wallj/block/GarbageBlock.java index 7794daf..a8635ec 100644 --- a/src/main/java/fr/umlv/java/wallj/block/GarbageBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/GarbageBlock.java @@ -1,16 +1,35 @@ 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.GraphicsContext; +import fr.umlv.java.wallj.event.Event; import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.BodyType; + +import java.awt.*; +import java.util.Collections; +import java.util.List; /** * A garbage block. * * @author Pacien TRAN-GIRARD */ -public class GarbageBlock extends Block { +public class GarbageBlock extends JBoxBlock { + private static final Color COLOR = new Color(102, 51, 0); GarbageBlock(Vec2 pos) { - super(BlockType.GARBAGE, pos); + super(BlockType.GARBAGE, BodyType.DYNAMIC, SolidDef.circleShape(), pos); + } + + @Override + public List update(Context context) { + paint(context.getGraphicsContext()); + return Collections.emptyList(); } + private void paint(GraphicsContext graphicsContext) { + graphicsContext.paintCircle(COLOR, getPos(), TileVec2.TILE_DIM); + } } diff --git a/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java b/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java new file mode 100644 index 0000000..48edbdc --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java @@ -0,0 +1,36 @@ +package fr.umlv.java.wallj.block; + +import org.jbox2d.collision.shapes.Shape; +import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.*; + +import java.util.Objects; + +/** + * @author Pacien TRAN-GIRARD + */ +public abstract class JBoxBlock extends Block { + private final BodyDef bodyDef; + private final FixtureDef fixtureDef; + private Body body; + + JBoxBlock(BlockType blockType, BodyType bodyType, Shape bodyShape, Vec2 pos) { + super(blockType); + bodyDef = SolidDef.bodyDefOf(Objects.requireNonNull(bodyType), Objects.requireNonNull(pos)); + fixtureDef = SolidDef.fixtureDefOf(Objects.requireNonNull(bodyShape)); + } + + @Override + public Vec2 getPos() { + if (body == null) throw new IllegalStateException("Uninitialised block."); + return body.getPosition().clone(); + } + + @Override + public void link(World world) { + if (body != null) throw new IllegalStateException("Block is already linked."); + body = world.createBody(bodyDef); + body.createFixture(fixtureDef); + body.setUserData(this); + } +} diff --git a/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java b/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java index 297b846..065f367 100644 --- a/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java @@ -1,6 +1,15 @@ 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.GraphicsContext; +import fr.umlv.java.wallj.event.Event; import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.World; + +import java.awt.*; +import java.util.Collections; +import java.util.List; /** * A robot block. @@ -8,9 +17,47 @@ import org.jbox2d.common.Vec2; * @author Pacien TRAN-GIRARD */ public class RobotBlock extends Block { + // TODO: define robot moving speed + + private Vec2 pos; + private List path = Collections.emptyList(); RobotBlock(Vec2 pos) { - super(BlockType.ROBOT, pos); + super(BlockType.ROBOT); + this.pos = pos; + } + + @Override + public Vec2 getPos() { + return pos.clone(); + } + + @Override + public void link(World world) { + // no-op + } + + @Override + public List update(Context context) { + updatePath(context.getEvents()); + if (!path.isEmpty()) move(); + paint(context.getGraphicsContext()); + return setupBomb(context.getEvents()); } + private List setupBomb(List events) { + return Collections.emptyList(); // TODO: return a SetupBombEvent at current location if an order was received + } + + private void updatePath(List events) { + // TODO: update path if received a new target event (using the pathfinder) + } + + private void move() { + // TODO: follow the current path + } + + private void paint(GraphicsContext graphicsContext) { + graphicsContext.paintCircle(Color.BLUE, getPos(), TileVec2.TILE_DIM / 2); + } } diff --git a/src/main/java/fr/umlv/java/wallj/block/SolidDef.java b/src/main/java/fr/umlv/java/wallj/block/SolidDef.java new file mode 100644 index 0000000..bfc1743 --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/block/SolidDef.java @@ -0,0 +1,45 @@ +package fr.umlv.java.wallj.block; + +import fr.umlv.java.wallj.board.TileVec2; +import org.jbox2d.collision.shapes.CircleShape; +import org.jbox2d.collision.shapes.PolygonShape; +import org.jbox2d.collision.shapes.Shape; +import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.BodyDef; +import org.jbox2d.dynamics.BodyType; +import org.jbox2d.dynamics.FixtureDef; + +/** + * @author Pacien TRAN-GIRARD + */ +public final class SolidDef { + public static BodyDef bodyDefOf(BodyType bodyType, Vec2 pos) { + BodyDef def = new BodyDef(); + def.type = bodyType; + def.position = pos; + return def; + } + + public static FixtureDef fixtureDefOf(Shape shape) { + FixtureDef def = new FixtureDef(); + def.shape = shape; + def.restitution = 1.0f; + return def; + } + + public static PolygonShape squareShape() { + PolygonShape shape = new PolygonShape(); + shape.setAsBox(TileVec2.TILE_DIM, TileVec2.TILE_DIM); + return shape; + } + + public static CircleShape circleShape() { + CircleShape shape = new CircleShape(); + shape.m_radius = TileVec2.TILE_DIM / 2; + return shape; + } + + private SolidDef() { + // static class + } +} diff --git a/src/main/java/fr/umlv/java/wallj/block/Stage.java b/src/main/java/fr/umlv/java/wallj/block/Stage.java deleted file mode 100644 index cbb75e5..0000000 --- a/src/main/java/fr/umlv/java/wallj/block/Stage.java +++ /dev/null @@ -1,59 +0,0 @@ -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 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 final Board board; - private final List blocks; - - public Stage(Board 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 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; - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/block/TrashBlock.java b/src/main/java/fr/umlv/java/wallj/block/TrashBlock.java index 4503f27..84e993d 100644 --- a/src/main/java/fr/umlv/java/wallj/block/TrashBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/TrashBlock.java @@ -1,16 +1,33 @@ 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.GraphicsContext; +import fr.umlv.java.wallj.event.Event; import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.BodyType; + +import java.awt.*; +import java.util.Collections; +import java.util.List; /** * A trash block. * * @author Pacien TRAN-GIRARD */ -public class TrashBlock extends Block { - +public class TrashBlock extends JBoxBlock { TrashBlock(Vec2 pos) { - super(BlockType.TRASH, pos); + super(BlockType.TRASH, BodyType.STATIC, SolidDef.squareShape(), pos); } + @Override + public List update(Context context) { + paint(context.getGraphicsContext()); + return Collections.emptyList(); + } + + private void paint(GraphicsContext graphicsContext) { + graphicsContext.paintRectangle(Color.RED, getPos(), TileVec2.TILE_DIM, TileVec2.TILE_DIM); + } } diff --git a/src/main/java/fr/umlv/java/wallj/block/WallBlock.java b/src/main/java/fr/umlv/java/wallj/block/WallBlock.java index cd0ddad..584c052 100644 --- a/src/main/java/fr/umlv/java/wallj/block/WallBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/WallBlock.java @@ -1,16 +1,33 @@ 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.GraphicsContext; +import fr.umlv.java.wallj.event.Event; import org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.*; + +import java.awt.*; +import java.util.Collections; +import java.util.List; /** * A wall block. * * @author Pacien TRAN-GIRARD */ -public class WallBlock extends Block { - +public class WallBlock extends JBoxBlock { WallBlock(Vec2 pos) { - super(BlockType.WALL, pos); + super(BlockType.WALL, BodyType.STATIC, SolidDef.squareShape(), pos); } + @Override + public List update(Context context) { + paint(context.getGraphicsContext()); + return Collections.emptyList(); + } + + private void paint(GraphicsContext graphicsContext) { + graphicsContext.paintRectangle(Color.BLACK, getPos(), TileVec2.TILE_DIM, TileVec2.TILE_DIM); + } } 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 182f121..3ef725e 100644 --- a/src/main/java/fr/umlv/java/wallj/context/Game.java +++ b/src/main/java/fr/umlv/java/wallj/context/Game.java @@ -4,7 +4,6 @@ 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.Event; -import fr.umlv.java.wallj.block.Stage; import java.util.*; diff --git a/src/main/java/fr/umlv/java/wallj/context/Stage.java b/src/main/java/fr/umlv/java/wallj/context/Stage.java new file mode 100644 index 0000000..a124888 --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/context/Stage.java @@ -0,0 +1,56 @@ +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 org.jbox2d.common.Vec2; +import org.jbox2d.dynamics.World; + +import java.util.Collections; +import java.util.List; +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 final Board board; + private final List blocks; + + public Stage(Board 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 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; + } +} diff --git a/src/main/java/fr/umlv/java/wallj/controller/BlockController.java b/src/main/java/fr/umlv/java/wallj/controller/BlockController.java deleted file mode 100644 index 3e27df5..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/BlockController.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.Block; - -import java.util.List; -import java.util.Objects; - -public abstract class BlockController implements Controller { - - private final Block block; - - BlockController(Block block) { - this.block = Objects.requireNonNull(block); - } - - //TODO Check UML to implement BlockController - public abstract List update(Context context); - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/BlockControllerFactory.java b/src/main/java/fr/umlv/java/wallj/controller/BlockControllerFactory.java deleted file mode 100644 index d32dfe9..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/BlockControllerFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.block.*; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * A block controller factory. - * "I am the man who arranges the blocks that descend upon me from up above..." - * - * @author Pacien TRAN-GIRARD - */ -public final class BlockControllerFactory { - - /** - * @implNote no Lists.of in JDK8 - */ - private static List listOf(BlockController... controllers) { - return Collections.unmodifiableList(Arrays.asList(controllers)); - } - - /** - * Builds the controllers for the given block. - * - * @param b block - * @return list of controllers - */ - public static List build(Block b) { - if (b instanceof WallBlock) - return listOf(new WallPhysicsController((WallBlock) b), new WallDisplayController((WallBlock) b)); - if (b instanceof TrashBlock) - return listOf(new TrashPhysicsController((TrashBlock) b), new TrashDisplayController((TrashBlock) b)); - if (b instanceof GarbageBlock) - return listOf(new GarbagePhysicsController((GarbageBlock) b), new GarbageDisplayController((GarbageBlock) b)); - if (b instanceof RobotBlock) - return listOf(new RobotPhysicsController((RobotBlock) b), new RobotDisplayController((RobotBlock) b)); - if (b instanceof BombBlock) - return listOf(new BombPhysicsController((BombBlock) b), new BombDisplayController((BombBlock) b)); - - return Collections.emptyList(); - } - - private BlockControllerFactory() { - // static class - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/BombDisplayController.java b/src/main/java/fr/umlv/java/wallj/controller/BombDisplayController.java deleted file mode 100644 index 0c067e1..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/BombDisplayController.java +++ /dev/null @@ -1,35 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.board.TileVec2; -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.context.GraphicsContext; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.BombBlock; -import org.jbox2d.common.Vec2; - -import java.awt.*; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class BombDisplayController extends DisplayController { - - private final BombBlock bomb; - - BombDisplayController(BombBlock bomb) { - super(bomb); - this.bomb = Objects.requireNonNull(bomb); - } - - @Override - public List update(Context context) { - GraphicsContext graphicsContext = context.getGraphicsContext(); - graphicsContext.paintCircle(Color.BLACK, bomb.getPos(), TileVec2.TILE_DIM); - Vec2 textPosition = bomb.getPos(); - textPosition.x += TileVec2.TILE_DIM / 4.0f; - textPosition.y += 3 * TileVec2.TILE_DIM / 4.0f; - graphicsContext.paintString(Color.RED, textPosition, Integer.toString(bomb.getTimer())); - return Collections.emptyList(); - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/BombPhysicsController.java b/src/main/java/fr/umlv/java/wallj/controller/BombPhysicsController.java deleted file mode 100644 index 2a7c44a..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/BombPhysicsController.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.BombBlock; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class BombPhysicsController extends PhysicsController { - - private final BombBlock bomb; - - BombPhysicsController(BombBlock bomb) { - super(bomb); - this.bomb = Objects.requireNonNull(bomb); - } - - @Override - public List update(Context context) { - //TODO - return Collections.emptyList(); - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/GarbageDisplayController.java b/src/main/java/fr/umlv/java/wallj/controller/GarbageDisplayController.java deleted file mode 100644 index 8951d16..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/GarbageDisplayController.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.board.TileVec2; -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.context.GraphicsContext; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.GarbageBlock; - -import java.awt.*; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class GarbageDisplayController extends DisplayController { - - private final GarbageBlock garbage; - - GarbageDisplayController(GarbageBlock garbage) { - super(garbage); - this.garbage = Objects.requireNonNull(garbage); - } - - @Override - public List update(Context context) { - GraphicsContext graphicsContext = context.getGraphicsContext(); - graphicsContext.paintCircle(new Color(102, 51, 0), garbage.getPos(),TileVec2.TILE_DIM); - return Collections.emptyList(); - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/GarbagePhysicsController.java b/src/main/java/fr/umlv/java/wallj/controller/GarbagePhysicsController.java deleted file mode 100644 index f8a7c36..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/GarbagePhysicsController.java +++ /dev/null @@ -1,25 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.GarbageBlock; - -import java.util.List; -import java.util.Objects; - -public class GarbagePhysicsController extends PhysicsController { - - private final GarbageBlock garbage; - - GarbagePhysicsController(GarbageBlock garbage) { - super(garbage); - this.garbage = Objects.requireNonNull(garbage); - } - - @Override - public List update(Context context) { - //TODO - return null; - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/PhysicsController.java b/src/main/java/fr/umlv/java/wallj/controller/PhysicsController.java deleted file mode 100644 index 6be9bf0..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/PhysicsController.java +++ /dev/null @@ -1,12 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.block.Block; - -public abstract class PhysicsController extends BlockController { - - PhysicsController(Block block) { - super(block); - } - - //TODO -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/RobotDisplayController.java b/src/main/java/fr/umlv/java/wallj/controller/RobotDisplayController.java deleted file mode 100644 index 4272ae7..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/RobotDisplayController.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.board.TileVec2; -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.context.GraphicsContext; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.RobotBlock; - -import java.awt.*; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class RobotDisplayController extends DisplayController { - - private final RobotBlock robot; - - RobotDisplayController(RobotBlock robot) { - super(robot); - this.robot = Objects.requireNonNull(robot); - } - - @Override - public List update(Context context) { - GraphicsContext graphicsContext = context.getGraphicsContext(); - graphicsContext.paintCircle(Color.BLUE,robot.getPos(),TileVec2.TILE_DIM/2); - return Collections.emptyList(); - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/RobotPhysicsController.java b/src/main/java/fr/umlv/java/wallj/controller/RobotPhysicsController.java deleted file mode 100644 index 8b43f23..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/RobotPhysicsController.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.RobotBlock; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class RobotPhysicsController extends PhysicsController { - - private final RobotBlock robot; - - RobotPhysicsController(RobotBlock robot) { - super(robot); - this.robot = Objects.requireNonNull(robot); - } - - @Override - public List update(Context context) { - //TODO - 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 index 6719302..74c1b54 100644 --- a/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java +++ b/src/main/java/fr/umlv/java/wallj/controller/StagePhysicsController.java @@ -1,10 +1,8 @@ package fr.umlv.java.wallj.controller; -import fr.umlv.java.wallj.block.Stage; +import fr.umlv.java.wallj.context.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; diff --git a/src/main/java/fr/umlv/java/wallj/controller/TrashDisplayController.java b/src/main/java/fr/umlv/java/wallj/controller/TrashDisplayController.java deleted file mode 100644 index 594b63b..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/TrashDisplayController.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.board.TileVec2; -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.context.GraphicsContext; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.TrashBlock; - -import java.awt.*; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class TrashDisplayController extends DisplayController { - - private final TrashBlock trash; - - TrashDisplayController(TrashBlock trash) { - super(trash); - this.trash = Objects.requireNonNull(trash); - } - - @Override - public List update(Context context) { - GraphicsContext graphicsContext = context.getGraphicsContext(); - graphicsContext.paintRectangle(Color.RED,trash.getPos(), TileVec2.TILE_DIM,TileVec2.TILE_DIM); - return Collections.emptyList(); - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/TrashPhysicsController.java b/src/main/java/fr/umlv/java/wallj/controller/TrashPhysicsController.java deleted file mode 100644 index 323f044..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/TrashPhysicsController.java +++ /dev/null @@ -1,25 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.TrashBlock; - -import java.util.List; -import java.util.Objects; - -public class TrashPhysicsController extends PhysicsController { - - private final TrashBlock trash; - - TrashPhysicsController(TrashBlock trash) { - super(trash); - this.trash = Objects.requireNonNull(trash); - } - - @Override - public List update(Context context) { - //TODO - return null; - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/WallDisplayController.java b/src/main/java/fr/umlv/java/wallj/controller/WallDisplayController.java deleted file mode 100644 index b90324e..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/WallDisplayController.java +++ /dev/null @@ -1,30 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.board.TileVec2; -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.context.GraphicsContext; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.WallBlock; - -import java.awt.*; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class WallDisplayController extends BlockController { - - private final WallBlock wall; - - WallDisplayController(WallBlock wall) { - super(wall); - this.wall = Objects.requireNonNull(wall); - } - - @Override - public List update(Context context) { - GraphicsContext graphicsContext = context.getGraphicsContext(); - graphicsContext.paintRectangle(Color.BLACK,wall.getPos(), TileVec2.TILE_DIM,TileVec2.TILE_DIM); - return Collections.emptyList(); - } - -} diff --git a/src/main/java/fr/umlv/java/wallj/controller/WallPhysicsController.java b/src/main/java/fr/umlv/java/wallj/controller/WallPhysicsController.java deleted file mode 100644 index ee48ec5..0000000 --- a/src/main/java/fr/umlv/java/wallj/controller/WallPhysicsController.java +++ /dev/null @@ -1,26 +0,0 @@ -package fr.umlv.java.wallj.controller; - -import fr.umlv.java.wallj.context.Context; -import fr.umlv.java.wallj.event.Event; -import fr.umlv.java.wallj.block.WallBlock; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -public class WallPhysicsController extends PhysicsController { - - private final WallBlock wall; - - WallPhysicsController(WallBlock wall) { - super(wall); - this.wall = Objects.requireNonNull(wall); - } - - @Override - public List update(Context context) { - //TODO - return Collections.emptyList(); - } - -} -- cgit v1.2.3 From 1a1d90fc6edc85fc3d6440db3a5d582a69a5441d Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 1 Feb 2018 18:39:59 +0100 Subject: Use copy constructor for JBox vectors Signed-off-by: pacien --- src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java | 2 +- src/main/java/fr/umlv/java/wallj/block/RobotBlock.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java b/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java index 48edbdc..06ecca3 100644 --- a/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java @@ -23,7 +23,7 @@ public abstract class JBoxBlock extends Block { @Override public Vec2 getPos() { if (body == null) throw new IllegalStateException("Uninitialised block."); - return body.getPosition().clone(); + return new Vec2(body.getPosition()); } @Override diff --git a/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java b/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java index 065f367..45c75da 100644 --- a/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java @@ -29,7 +29,7 @@ public class RobotBlock extends Block { @Override public Vec2 getPos() { - return pos.clone(); + return new Vec2(pos); } @Override -- cgit v1.2.3 From 735be27e8802740cf0986bb6d14e720234889aae Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 1 Feb 2018 20:29:40 +0100 Subject: Rename events/orders ; Partial impl. of robot event handling Signed-off-by: pacien --- src/docs/class.puml | 20 +++++++--------- .../java/fr/umlv/java/wallj/block/RobotBlock.java | 25 ++++++++++++++----- .../fr/umlv/java/wallj/context/InputHandler.java | 8 +++---- .../java/wallj/controller/GameStateController.java | 4 ++-- .../fr/umlv/java/wallj/event/AddBombEvent.java | 21 ---------------- .../fr/umlv/java/wallj/event/BombSetupEvent.java | 28 ++++++++++++++++++++++ .../fr/umlv/java/wallj/event/BombSetupOrder.java | 10 ++++++++ .../fr/umlv/java/wallj/event/ConfirmEvent.java | 10 -------- .../fr/umlv/java/wallj/event/ConfirmOrder.java | 10 ++++++++ .../fr/umlv/java/wallj/event/DropBombEvent.java | 10 -------- src/main/java/fr/umlv/java/wallj/event/Event.java | 11 ++++++++- .../fr/umlv/java/wallj/event