diff options
Diffstat (limited to 'test/src/ch/asynk/gdx')
5 files changed, 88 insertions, 28 deletions
diff --git a/test/src/ch/asynk/gdx/boardgame/test/AbstractScreen.java b/test/src/ch/asynk/gdx/boardgame/test/AbstractScreen.java index 4c51780..b3963fb 100644 --- a/test/src/ch/asynk/gdx/boardgame/test/AbstractScreen.java +++ b/test/src/ch/asynk/gdx/boardgame/test/AbstractScreen.java @@ -135,7 +135,7 @@ public abstract class AbstractScreen implements Screen paused = false; } - protected abstract void onTouch(int x, int y); + protected abstract void onTouch(int x, int y, boolean down); protected abstract void onZoom(float dz); protected abstract void onDragged(int dx, int dy); private InputMultiplexer getMultiplexer() @@ -147,19 +147,31 @@ public abstract class AbstractScreen implements Screen onZoom(amount * ZOOM_SCROLL_FACTOR); return true; } + + @Override public boolean touchUp(int x, int y, int pointer, int button) + { + if (inputBlocked) return true; + if (button == Input.Buttons.LEFT) { + dragPos.set(x, y); + onTouch(x, y, false); + } + return true; + } + @Override public boolean touchDown(int x, int y, int pointer, int button) { if (inputBlocked) return true; if (button == Input.Buttons.LEFT) { dragPos.set(x, y); - onTouch(x, y); + onTouch(x, y, true); } return true; } + @Override public boolean touchDragged(int x, int y, int pointer) { - int dx = (int) (dragPos.x - x); - int dy = (int) (dragPos.y - y); + int dx = (int) (x - dragPos.x); + int dy = (int) (y - dragPos.y); dragPos.set(x, y); onDragged(dx, dy); return true; diff --git a/test/src/ch/asynk/gdx/boardgame/test/AnimationsScreen.java b/test/src/ch/asynk/gdx/boardgame/test/AnimationsScreen.java index 4013273..fc6fc30 100644 --- a/test/src/ch/asynk/gdx/boardgame/test/AnimationsScreen.java +++ b/test/src/ch/asynk/gdx/boardgame/test/AnimationsScreen.java @@ -1,7 +1,6 @@ package ch.asynk.gdx.boardgame.test; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.Texture; @@ -223,5 +222,5 @@ public class AnimationsScreen extends AbstractScreen @Override protected void onZoom(float dz) { } @Override protected void onDragged(int dx, int dy) { } - @Override protected void onTouch(int x, int y) { } + @Override protected void onTouch(int x, int y, boolean down) { } } diff --git a/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java b/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java index 086133d..6d762fa 100644 --- a/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java +++ b/test/src/ch/asynk/gdx/boardgame/test/BoardScreen.java @@ -1,7 +1,6 @@ package ch.asynk.gdx.boardgame.test; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.Texture; @@ -29,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; @@ -40,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(); @@ -60,38 +61,75 @@ public class BoardScreen extends AbstractScreen public void reset() { - pos.set(0, 0); tilesToDraw.clear(); + v.set(0, 0); + pos.set(0, 0); + handleAdjacents(); board.centerOf(0, 0, v); panzer.centerOn(v.x, v.y); 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); + if (!board.isOnMap((int)v.x, (int)v.y)) + return false; + if (down) { + Tile tile = getTile((int)v.x, (int)v.y); + if (!dragging && panzer.isOn(tile)) { + dragging = true; + clearAdjacents(); + } else { + touchInfo(x, y); + 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) { + touchInfo(x, y); + handleAdjacents(); + panzer.dropOnBoard(board, v); + GdxBoardTest.debug("BoardScreen", String.format(" => [%d;%d]", (int)v.x, (int)v.y)); + dragging = false; + } + } + return true; + } + + private void touchInfo(float x, float y) + { 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))); float d0 = board.distance((int)pos.x, (int)pos.y, (int)v.x, (int)v.y, Board.Geometry.TCHEBYCHEV); float d1 = board.distance((int)pos.x, (int)pos.y, (int)v.x, (int)v.y, Board.Geometry.TAXICAB); 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)); + GdxBoardTest.debug("BoardScreen", String.format(" from [%d;%d] => %d :: %d :: %f", (int)pos.x, (int)pos.y, (int)d0, (int)d1, d2)); + } + + public boolean drag(float dx, float dy) + { + if (dragging) { + panzer.translate(dx, dy); + return true; } - return true; + return false; } - private void handleAdjacents() + 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) { @@ -108,6 +146,7 @@ public class BoardScreen extends AbstractScreen private Tile getTile(int x, int y) { + if (!board.isOnMap(x, y)) return null; return tileStorage.getTile(x, y, board::genKey, this::buildTile); } @@ -206,10 +245,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( @@ -264,17 +305,25 @@ 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) + @Override protected void onTouch(int x, int y, boolean down) { - cam.unproject(x, y, boardTouch); - cam.unprojectHud(x, y, hudTouch); - if (btn.touch(hudTouch.x, hudTouch.y) != null) { - setState(state.next()); + if (down) { + cam.unproject(x, y, boardTouch); + cam.unprojectHud(x, y, hudTouch); + if (btn.touch(hudTouch.x, hudTouch.y) != null) { + setState(state.next()); + } else { + board.touch(boardTouch.x, boardTouch.y, true); + } } else { - board.touch(boardTouch.x, boardTouch.y); + cam.unproject(x, y, boardTouch); + board.touch(boardTouch.x, boardTouch.y, false); } } diff --git a/test/src/ch/asynk/gdx/boardgame/test/MenuScreen.java b/test/src/ch/asynk/gdx/boardgame/test/MenuScreen.java index b0a312a..fafb9e0 100644 --- a/test/src/ch/asynk/gdx/boardgame/test/MenuScreen.java +++ b/test/src/ch/asynk/gdx/boardgame/test/MenuScreen.java @@ -69,7 +69,7 @@ public class MenuScreen extends AbstractScreen @Override protected void onZoom(float dz) { } @Override protected void onDragged(int dx, int dy) { } - @Override protected void onTouch(int x, int y) + @Override protected void onTouch(int x, int y, boolean down) { hudTouch.set(x, y, 0); camera.unproject(hudTouch); diff --git a/test/src/ch/asynk/gdx/boardgame/test/UiScreen.java b/test/src/ch/asynk/gdx/boardgame/test/UiScreen.java index b490b05..4120fac 100644 --- a/test/src/ch/asynk/gdx/boardgame/test/UiScreen.java +++ b/test/src/ch/asynk/gdx/boardgame/test/UiScreen.java @@ -200,7 +200,7 @@ public class UiScreen extends AbstractScreen } @Override protected void onZoom(float dz) { } - @Override protected void onTouch(int x, int y) + @Override protected void onTouch(int x, int y, boolean down) { hudTouch.set(x, y, 0); camera.unproject(hudTouch); |