diff options
-rw-r--r-- | test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java | 58 |
1 files changed, 48 insertions, 10 deletions
diff --git a/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java b/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java index 2c568cb..c5306d3 100644 --- a/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java +++ b/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java @@ -28,6 +28,7 @@ public class BoardScreen extends AbstractScreen private final Piece panzer; private final Vector2 pos; private final Vector2 v; + private boolean dragging; public Texture map; public Board board; public TileStorage tileStorage; @@ -39,6 +40,7 @@ public class BoardScreen extends AbstractScreen public MyBoard(final Assets assets) { + this.dragging = false; this.assets = assets; this.pos = new Vector2(); this.v = new Vector2(); @@ -68,7 +70,7 @@ public class BoardScreen extends AbstractScreen panzer.setRotation(Orientation.DEFAULT.r()); } - public boolean touch(float x, float y) + public boolean touch(float x, float y, boolean down) { board.toBoard(x, y, v); GdxBoardTest.debug("BoardScreen", String.format("touchDown [%d;%d] => [%d;%d] => %d", (int)x, (int)y, (int)v.x, (int)v.y, board.genKey((int)v.x, (int)v.y))); @@ -77,22 +79,50 @@ public class BoardScreen extends AbstractScreen float d2 = board.distance((int)pos.x, (int)pos.y, (int)v.x, (int)v.y, Board.Geometry.EUCLIDEAN); if (board.isOnMap((int)v.x, (int)v.y)) { GdxBoardTest.debug("BoardScreen", String.format(" from [%d;%d] => %d :: %d :: %f", (int)pos.x, (int)pos.y, (int)d0, (int)d1, d2)); - pos.set(v); - handleAdjacents(); - board.centerOf((int)v.x, (int)v.y, v); - panzer.centerOn(v.x, v.y); - panzer.setRotation(Orientation.fromR(panzer.getRotation()).left().r()); - GdxBoardTest.debug("BoardScreen", String.format(" => [%d;%d]", (int)v.x, (int)v.y)); + if (down) { + Tile tile = getTile((int)v.x, (int)v.y); + if (!dragging && panzer.isOn(tile)) { + dragging = true; + clearAdjacents(); + } else { + pos.set(v); + handleAdjacents(); + board.centerOf((int)v.x, (int)v.y, v); + panzer.centerOn(v.x, v.y); + panzer.setRotation(Orientation.fromR(panzer.getRotation()).left().r()); + GdxBoardTest.debug("BoardScreen", String.format(" => [%d;%d]", (int)v.x, (int)v.y)); + } + } else { + if (dragging) { + handleAdjacents(); + panzer.dropOnBoard(board, v); + dragging = false; + } + } } return true; } - private void handleAdjacents() + public boolean drag(float dx, float dy) + { + if (dragging) { + panzer.translate(dx, dy); + return true; + } + return false; + } + + private void clearAdjacents() { for (Tile tile : board.getAdjacents()) { if (tile != null) tile.enableOverlay(12, false); } + } + + private void handleAdjacents() + { + clearAdjacents(); board.buildAdjacents((int)v.x, (int)v.y, this::getTile); for (Tile tile : board.getAdjacents()) { if (tile != null) { @@ -208,10 +238,12 @@ public class BoardScreen extends AbstractScreen private final MyBoard board; private final Button btn; private final Root root; + private final Vector2 relative; public BoardScreen(final GdxBoardTest app) { super(app, ""); + this.relative = new Vector2(); this.board = new MyBoard(app.assets); this.camera = this.cam = new Camera(10, board.w, board.h, 1.0f, 0.3f, false); this.btn = new Button( @@ -266,7 +298,10 @@ public class BoardScreen extends AbstractScreen @Override protected void onDragged(int dx, int dy) { - cam.translate(dx, dy); + cam.unprojectTranslation(dx, dy, relative); + if (!board.drag(relative.x, relative.y)) { + cam.translate(dx, dy); + } } @Override protected void onTouch(int x, int y, boolean down) @@ -277,8 +312,11 @@ public class BoardScreen extends AbstractScreen if (btn.touch(hudTouch.x, hudTouch.y) != null) { setState(state.next()); } else { - board.touch(boardTouch.x, boardTouch.y); + board.touch(boardTouch.x, boardTouch.y, true); } + } else { + cam.unproject(x, y, boardTouch); + board.touch(boardTouch.x, boardTouch.y, false); } } |