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 (limited to 'src') 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