diff options
| author | Jérémy Zurcher <jeremy@asynk.ch> | 2018-10-02 09:57:41 +0200 | 
|---|---|---|
| committer | Jérémy Zurcher <jeremy@asynk.ch> | 2018-10-02 09:57:41 +0200 | 
| commit | dd08d9539409966205441ecc90ef1054e73c26b5 (patch) | |
| tree | 80a4d4935ca8fcc8f1682e3e561601831ab06e4e | |
| parent | 4a464543960fec0649091a634a35c286301841fb (diff) | |
| download | gdx-boardgame-dd08d9539409966205441ecc90ef1054e73c26b5.zip gdx-boardgame-dd08d9539409966205441ecc90ef1054e73c26b5.tar.gz | |
welcome MenuScreen, BoardScreen and UiScreen
| -rw-r--r-- | test/src/ch/asynk/gdx/board/test/Assets.java | 4 | ||||
| -rw-r--r-- | test/src/ch/asynk/gdx/board/test/BoardScreen.java | 331 | ||||
| -rw-r--r-- | test/src/ch/asynk/gdx/board/test/GameBoard.java | 142 | ||||
| -rw-r--r-- | test/src/ch/asynk/gdx/board/test/GameHud.java | 156 | ||||
| -rw-r--r-- | test/src/ch/asynk/gdx/board/test/GameScreen.java | 220 | ||||
| -rw-r--r-- | test/src/ch/asynk/gdx/board/test/GdxBoardTest.java | 42 | ||||
| -rw-r--r-- | test/src/ch/asynk/gdx/board/test/MenuScreen.java | 180 | ||||
| -rw-r--r-- | test/src/ch/asynk/gdx/board/test/UiScreen.java | 210 | 
8 files changed, 751 insertions, 534 deletions
| diff --git a/test/src/ch/asynk/gdx/board/test/Assets.java b/test/src/ch/asynk/gdx/board/test/Assets.java index c3d76ab..112d2ae 100644 --- a/test/src/ch/asynk/gdx/board/test/Assets.java +++ b/test/src/ch/asynk/gdx/board/test/Assets.java @@ -58,7 +58,7 @@ public class Assets extends ch.asynk.gdx.tabletop.Assets          unload(LOADING);      } -    public void loadGame() +    public void loadApp()      {          load(MAP_00, Texture.class);          load(CHESS, Texture.class); @@ -70,7 +70,7 @@ public class Assets extends ch.asynk.gdx.tabletop.Assets          load(FONT_25, BitmapFont.class, params25);      } -    public void unloadGame() +    public void unloadApp()      {          unload(MAP_00);          unload(CHESS); diff --git a/test/src/ch/asynk/gdx/board/test/BoardScreen.java b/test/src/ch/asynk/gdx/board/test/BoardScreen.java new file mode 100644 index 0000000..3ef9dea --- /dev/null +++ b/test/src/ch/asynk/gdx/board/test/BoardScreen.java @@ -0,0 +1,331 @@ +package ch.asynk.gdx.tabletop.test; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.InputAdapter; +import com.badlogic.gdx.InputMultiplexer; +import com.badlogic.gdx.input.GestureDetector; +import com.badlogic.gdx.input.GestureDetector.GestureAdapter; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.math.Vector3; + +import ch.asynk.gdx.tabletop.Camera; +import ch.asynk.gdx.tabletop.Board; +import ch.asynk.gdx.tabletop.board.BoardFactory; +import ch.asynk.gdx.tabletop.ui.Button; + +public class BoardScreen implements Screen +{ +    private static final String DOM = "BoardScreen"; +    private static final float INPUT_DELAY = 0.1f;              // filter out touches after gesture +    private static final float ZOOM_SCROLL_FACTOR = .1f; +    private static final float ZOOM_GESTURE_FACTOR = .01f; + +    private static final boolean DEBUG = true; + +    private class MyBoard +    { +        private final Assets assets; +        private final Texture sherman; +        private final Vector2 v; +        public Texture map; +        public Board board; +        public int dx; +        public int dy; +        public int w; +        public int h; +        public float r; + +        public MyBoard(final Assets assets) +        { +            this.assets = assets; +            this.sherman = assets.getTexture(assets.SHERMAN); +            this.v = new Vector2(); +        } + +        public void draw(SpriteBatch batch) +        { +            batch.draw(map, dx, dy, map.getWidth()/2, map.getHeight()/2, map.getWidth(), map.getHeight(), 1, 1, r, 0, 0, map.getWidth(), map.getHeight(), false, false); +            batch.draw(sherman, v.x - (sherman.getWidth() / 2), v.y - (sherman.getHeight() / 2)); +        } + +        public void reset() +        { +            board.centerOf(0, 0, v); +        } + +        public boolean touch(float x, float y) +        { +            board.toBoard(x, y, v); +            GdxBoardTest.debug("BoardGame", String.format("touchDown [%d;%d] => [%d;%d]", (int)x, (int)y, (int)v.x, (int)v.y)); +            board.centerOf((int)v.x, (int)v.y, v); +            GdxBoardTest.debug("BoardGame", String.format("                  => [%d;%d]", (int)v.x, (int)v.y)); +            return true; +        } + +        public void setHEX_V() +        { +            map = assets.getTexture(assets.MAP_00); +            r = 0; +            dx = 0; +            dy = 0; +            w = map.getWidth(); +            h = map.getHeight(); +            board = BoardFactory.getBoard(BoardFactory.BoardType.HEX, 110, 50, 103, BoardFactory.BoardOrientation.VERTICAL); +        } + +        public void setHEX_H() +        { +            map = assets.getTexture(assets.MAP_00); +            r = 90; +            dx = - ( map.getWidth() - map.getHeight() ) / 2; +            dy = - dx; +            w = map.getHeight(); +            h = map.getWidth(); +            board = BoardFactory.getBoard(BoardFactory.BoardType.HEX, 110, 103, 50, BoardFactory.BoardOrientation.HORIZONTAL); +        } + +        public void setSQUARE() +        { +            map = assets.getTexture(assets.CHESS); +            r = 0; +            dx = 0; +            dy = 0; +            w = map.getWidth(); +            h = map.getHeight(); +            board = BoardFactory.getBoard(BoardFactory.BoardType.SQUARE, 83, 5, 5); +        } + +        public void setTRI_H() +        { +            map = assets.getTexture(assets.TRI); +            r = 0; +            dx = 0; +            dy = 0; +            w = map.getWidth(); +            h = map.getHeight(); +            board = BoardFactory.getBoard(BoardFactory.BoardType.TRIANGLE, 150, 109, 53, BoardFactory.BoardOrientation.HORIZONTAL); +        } + +        public void setTRI_V() +        { +            map = assets.getTexture(assets.TRI); +            r = 90; +            dx = - ( map.getWidth() - map.getHeight() ) / 2; +            dy = - dx; +            w = map.getHeight(); +            h = map.getWidth(); +            board = BoardFactory.getBoard(BoardFactory.BoardType.TRIANGLE, 150, 16, 110, BoardFactory.BoardOrientation.VERTICAL); +        } +    } + +    private final GdxBoardTest app; +    private final MyBoard board; +    private final Camera camera; +    private final SpriteBatch batch; +    private final Button btn; + +    private final Vector2 dragPos = new Vector2(); +    private final Vector3 boardTouch = new Vector3(); +    private final Vector3 hudTouch = new Vector3(); + +    private boolean paused; +    private float inputDelay; +    private boolean inputBlocked; + +    public enum State +    { +        HEX_V, HEX_H, SQUARE, TRI_H, TRI_V, DONE; +        public State next() +        { +            switch(this) { +                case HEX_V: +                    return HEX_H; +                case HEX_H: +                    return SQUARE; +                case SQUARE: +                    return TRI_H; +                case TRI_H: +                    return TRI_V; +                case TRI_V: +                    return DONE; +                default: +                    return HEX_V; +            } +        } +    } +    private State state; + +    public BoardScreen(final GdxBoardTest app) +    { +        this.app = app; +        this.board = new MyBoard(app.assets); +        this.batch = new SpriteBatch(); +        this.camera = new Camera(10, board.w, board.h, 1.0f, 0.3f, false); +        this.btn = new Button( +                app.assets.getFont(app.assets.FONT_25), +                app.assets.getNinePatch(app.assets.PATCH, 23, 23, 23 ,23), +                15); +        this.btn.write("next"); +        Gdx.input.setInputProcessor(getMultiplexer(this)); +        setState(State.HEX_V); +        this.inputBlocked = false; +        this.inputDelay = 0f; +        this.paused = false; +    } + +    @Override public void render(float delta) +    { +        if (paused) return; + +        if (inputBlocked) { +            inputDelay -= delta; +            if (inputDelay <= 0f) +                inputBlocked = false; +        } + +        Gdx.gl.glClearColor(0, 0, 0, 1); +        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + +        camera.applyMapViewport(); +        batch.setProjectionMatrix(camera.combined); +        batch.begin(); +        board.draw(batch); +        batch.end(); + +        camera.applyHudViewport(); +        batch.setProjectionMatrix(camera.getHudMatrix()); +        batch.begin(); +        btn.draw(batch); +        batch.end(); +    } + +    @Override public void resize(int width, int height) +    { +        GdxBoardTest.debug("BoardScrean", String.format("resize (%d,%d)",width, height)); +        camera.updateViewport(width, height); +    } + +    @Override public void dispose() +    { +        GdxBoardTest.debug("BoardScrean", "dispose()"); +        batch.dispose(); +    } + +    @Override public void show() +    { +        GdxBoardTest.debug("BoardScrean", "show()"); +        paused = false; +    } + +    @Override public void hide() +    { +        GdxBoardTest.debug("BoardScrean", "hide()"); +        paused = true; +    } + +    @Override public void pause() +    { +        GdxBoardTest.debug("pause() "); +        paused = true; +    } + +    @Override public void resume() +    { +        GdxBoardTest.debug("resume() "); +        resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); +        paused = false; +    } + +    private void zoom(float dz) +    { +        camera.zoom(dz); +        resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); +    } + +    private void nextState() +    { +        setState(this.state.next()); +    } + +    private void setState(State state) +    { +        switch (state) { +            case HEX_V: +                board.setHEX_V(); +                break; +            case HEX_H: +                board.setHEX_H(); +                break; +            case SQUARE: +                board.setSQUARE(); +                break; +            case TRI_H: +                board.setTRI_H(); +                break; +            case TRI_V: +                board.setTRI_V(); +                break; +            case DONE: +                this.app.switchToMenu(); +                return; +        } +        board.reset(); +        this.camera.setDimension(board.w, board.h); +        zoom(1); +        this.state = state; +    } + +    private InputMultiplexer getMultiplexer(final BoardScreen screen) +    { +        final InputMultiplexer multiplexer = new InputMultiplexer(); +        multiplexer.addProcessor(new InputAdapter() { +            @Override public boolean scrolled(int amount) +            { +                zoom(amount * ZOOM_SCROLL_FACTOR); +                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); +                    camera.unproject(x, y, boardTouch); +                    camera.unprojectHud(x, y, hudTouch); +                    if (btn.touch(hudTouch.x, hudTouch.y)) { +                        nextState(); +                    } else { +                        board.touch(boardTouch.x, boardTouch.y); +                    } +                } +                return true; +            } +            @Override public boolean touchDragged(int x, int y, int pointer) +            { +                int dx = (int) (dragPos.x - x); +                int dy = (int) (dragPos.y - y); +                dragPos.set(x, y); +                camera.translate(dx, dy); +                return true; +            } +        }); +        multiplexer.addProcessor(new GestureDetector(new GestureAdapter() { +            @Override public boolean zoom(float initialDistance, float distance) +            { +                if (initialDistance > distance) +                    screen.zoom(ZOOM_GESTURE_FACTOR); +                else +                    screen.zoom(-ZOOM_GESTURE_FACTOR); +                inputBlocked = true; +                inputDelay = INPUT_DELAY; +                return true; +            } +        })); + +        return multiplexer; +    } +} diff --git a/test/src/ch/asynk/gdx/board/test/GameBoard.java b/test/src/ch/asynk/gdx/board/test/GameBoard.java deleted file mode 100644 index 801e947..0000000 --- a/test/src/ch/asynk/gdx/board/test/GameBoard.java +++ /dev/null @@ -1,142 +0,0 @@ -package ch.asynk.gdx.tabletop.test; - -import com.badlogic.gdx.graphics.g2d.Batch; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.utils.Disposable; -import com.badlogic.gdx.math.Vector2; - -import ch.asynk.gdx.tabletop.Touchable; -import ch.asynk.gdx.tabletop.Board; -import ch.asynk.gdx.tabletop.board.BoardFactory; - -public class GameBoard implements Disposable, Touchable -{ -    private final Assets assets; -    private Texture map; -    private Texture sherman; -    private Board board; - -    private int dx; -    private int dy; -    private int w; -    private int h; -    private float r; - -    private Vector2 v; - -    public GameBoard(final Assets assets) -    { -        this.assets = assets; -        this.v = new Vector2(); -        this.sherman = assets.getTexture(assets.SHERMAN); -        setState(GameScreen.State.UI); -    } - -    @Override public void dispose() -    { -        map.dispose(); -    } - -    @Override public boolean touch(float x, float y) -    { -        board.toBoard(x, y, v); -        GdxBoardTest.debug("BoardGame", String.format("touchDown [%d;%d] => [%d;%d]", (int)x, (int)y, (int)v.x, (int)v.y)); -        board.centerOf((int)v.x, (int)v.y, v); -        GdxBoardTest.debug("BoardGame", String.format("                  => [%d;%d]", (int)v.x, (int)v.y)); -        return true; -    } - -    public void setState(GameScreen.State state) -    { -        switch (state) { -            case UI: -            case HEX_V: -                setHEX_V(); -                break; -            case HEX_H: -                setHEX_H(); -                break; -            case SQUARE: -                setSQUARE(); -                break; -            case TRI_H: -                setTRI_H(); -                break; -            case TRI_V: -                setTRI_V(); -                break; -        } -        board.centerOf(0, 0, v); -    } - -    private void setHEX_V() -    { -        this.map = assets.getTexture(assets.MAP_00); -        r = 0; -        dx = 0; -        dy = 0; -        w = this.map.getWidth(); -        h = this.map.getHeight(); -        this.board = BoardFactory.getBoard(BoardFactory.BoardType.HEX, 110, 50, 103, BoardFactory.BoardOrientation.VERTICAL); -    } - -    private void setHEX_H() -    { -        this.map = assets.getTexture(assets.MAP_00); -        r = 90; -        dx = - ( this.map.getWidth() - this.map.getHeight() ) / 2; -        dy = - dx; -        w = this.map.getHeight(); -        h = this.map.getWidth(); -        this.board = BoardFactory.getBoard(BoardFactory.BoardType.HEX, 110, 103, 50, BoardFactory.BoardOrientation.HORIZONTAL); -    } - -    private void setSQUARE() -    { -        this.map = assets.getTexture(assets.CHESS); -        r = 0; -        dx = 0; -        dy = 0; -        w = map.getWidth(); -        h = map.getHeight(); -        this.board = BoardFactory.getBoard(BoardFactory.BoardType.SQUARE, 83, 5, 5); -    } - -    private void setTRI_H() -    { -        this.map = assets.getTexture(assets.TRI); -        r = 0; -        dx = 0; -        dy = 0; -        w = map.getWidth(); -        h = map.getHeight(); -        this.board = BoardFactory.getBoard(BoardFactory.BoardType.TRIANGLE, 150, 109, 53, BoardFactory.BoardOrientation.HORIZONTAL); -    } - -    private void setTRI_V() -    { -        this.map = assets.getTexture(assets.TRI); -        r = 90; -        dx = - ( this.map.getWidth() - this.map.getHeight() ) / 2; -        dy = - dx; -        w = map.getHeight(); -        h = map.getWidth(); -        this.board = BoardFactory.getBoard(BoardFactory.BoardType.TRIANGLE, 150, 16, 110, BoardFactory.BoardOrientation.VERTICAL); -    } - -    public int getWidth() -    { -        return w; -    } - -    public int getHeight() -    { -        return h; -    } - -    public void draw(Batch batch) -    { -        batch.draw(map, dx, dy, map.getWidth()/2, map.getHeight()/2, map.getWidth(), map.getHeight(), 1, 1, r, 0, 0, map.getWidth(), map.getHeight(), false, false); -        batch.draw(sherman, v.x - (sherman.getWidth() / 2), v.y - (sherman.getHeight() / 2)); -    } -} diff --git a/test/src/ch/asynk/gdx/board/test/GameHud.java b/test/src/ch/asynk/gdx/board/test/GameHud.java deleted file mode 100644 index f401bf9..0000000 --- a/test/src/ch/asynk/gdx/board/test/GameHud.java +++ /dev/null @@ -1,156 +0,0 @@ -package ch.asynk.gdx.tabletop.test; - -import java.util.function.Supplier; - -import com.badlogic.gdx.graphics.g2d.Batch; -import com.badlogic.gdx.graphics.g2d.Sprite; -import com.badlogic.gdx.graphics.g2d.NinePatch; -import com.badlogic.gdx.graphics.g2d.BitmapFont; -import com.badlogic.gdx.graphics.glutils.ShapeRenderer; -import com.badlogic.gdx.utils.Disposable; - -import ch.asynk.gdx.tabletop.ui.Button; -import ch.asynk.gdx.tabletop.ui.Alignment; -import ch.asynk.gdx.tabletop.ui.Root; -import ch.asynk.gdx.tabletop.Touchable; - -public class GameHud implements Disposable, Touchable -{ -    private final Sprite corner; -    private final Root root; -    private final Button hello; -    private final Button next; -    private GameScreen.State state; -    private final Supplier<GameScreen.State> nextState; - -    public GameHud(final Assets assets, GameScreen.State state, Supplier<GameScreen.State> nextState) -    { -        this.state = state; -        this.nextState = nextState; -        this.corner = new Sprite(assets.getTexture(assets.CORNER)); - -        NinePatch patch = assets.getNinePatch(assets.PATCH, 23, 23, 23 ,23); -        BitmapFont font = assets.getFont(assets.FONT_25); - -        this.root = new Root(2); -        this.root.setPadding(30); - -        this.hello = new Button(font, patch, 10, 15); -        this.hello.write("Hello"); -        this.root.add(this.hello); - -        this.next = new Button(font, patch, 20); -        this.next.write("NEXT"); -        this.next.setPosition(50, 50); -        this.next.setAlignment(Alignment.MIDDLE_CENTER); -        this.next.setLabelAlignment(Alignment.MIDDLE_CENTER); -        this.root.add(this.next); -    } - -    @Override public void dispose() -    { -        corner.getTexture().dispose(); -    } - -    @Override public boolean touch(float x, float y) -    { -        if (root.touch(x, y)) { -            GdxBoardTest.debug("GameHud", String.format("touchDown : %f %f", x, y)); -            if (root.touched() == this.next) -                onNext(); -            return true; -        } -        return false; -    } - -    public void resize(float width, float height) -    { -        this.root.resize(width, height); -    } - -    public void onNext() -    { -        this.state = nextState.get(); -        switch (this.state) { -            case UI: -                updateNext(50, Alignment.MIDDLE_CENTER); -                this.root.add(this.hello); -                break; -            case HEX_V: -                updateNext(0, Alignment.BOTTOM_RIGHT); -                this.root.remove(this.hello); -                break; -            default: -                break; -        } -    } - -    private void updateNext(int p, Alignment a) -    { -        this.next.setPosition(p, p); -        this.next.setAlignment(a); -    } - -    public void draw(Batch batch) -    { -        switch (this.state) { -            case UI: -                drawButtons(batch); -                drawCorners(batch); -                break; -            default: -                drawRoot(batch); -                break; -        } -    } - -    private void drawRoot(Batch batch) -    { -        root.draw(batch); -    } - -    private void drawCorners(Batch batch) -    { -        float right = root.getX() + root.getWidth() - corner.getWidth(); -        float top = root.getY() + root.getHeight() - corner.getHeight(); -        corner.setRotation(0); -        corner.setPosition(root.getX(), top); -        corner.draw(batch); -        corner.setRotation(90); -        corner.setPosition(root.getX(), root.getY()); -        corner.draw(batch); -        corner.setRotation(180); -        corner.setPosition(right, root.getY()); -        corner.draw(batch); -        corner.setPosition(right, top); -        corner.setRotation(270); -        corner.draw(batch); -    } - -    private void drawButtons(Batch batch) -    { -        hello.setAlignment(Alignment.TOP_LEFT); -        hello.setLabelAlignment(Alignment.BOTTOM_RIGHT); -        root.draw(batch); -        drawHello(batch, Alignment.TOP_CENTER, Alignment.BOTTOM_CENTER); -        drawHello(batch, Alignment.TOP_RIGHT, Alignment.BOTTOM_LEFT); -        drawHello(batch, Alignment.MIDDLE_LEFT, Alignment.MIDDLE_RIGHT); -        drawHello(batch, Alignment.MIDDLE_CENTER, Alignment.MIDDLE_CENTER); -        drawHello(batch, Alignment.MIDDLE_RIGHT, Alignment.MIDDLE_LEFT); -        drawHello(batch, Alignment.BOTTOM_LEFT, Alignment.TOP_RIGHT); -        drawHello(batch, Alignment.BOTTOM_CENTER, Alignment.TOP_CENTER); -        drawHello(batch, Alignment.BOTTOM_RIGHT, Alignment.TOP_LEFT); -    } - -    private void drawHello(Batch batch, Alignment alignment1, Alignment alignment2) -    { -        hello.setAlignment(alignment1); -        hello.setLabelAlignment(alignment2); -        hello.draw(batch); -    } - -    public void drawDebug(ShapeRenderer debugShapes) -    { -        root.drawDebug(debugShapes); -    } -} diff --git a/test/src/ch/asynk/gdx/board/test/GameScreen.java b/test/src/ch/asynk/gdx/board/test/GameScreen.java deleted file mode 100644 index 7f038d6..0000000 --- a/test/src/ch/asynk/gdx/board/test/GameScreen.java +++ /dev/null @@ -1,220 +0,0 @@ -package ch.asynk.gdx.tabletop.test; - -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.Screen; -import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.graphics.glutils.ShapeRenderer; -import com.badlogic.gdx.Input; -import com.badlogic.gdx.InputAdapter; -import com.badlogic.gdx.InputMultiplexer; -import com.badlogic.gdx.input.GestureDetector; -import com.badlogic.gdx.input.GestureDetector.GestureAdapter; -import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.math.Vector3; - -import ch.asynk.gdx.tabletop.Camera; - -public class GameScreen implements Screen -{ -    private static final float INPUT_DELAY = 0.1f;              // filter out touches after gesture -    private static final float ZOOM_SCROLL_FACTOR = .1f; -    private static final float ZOOM_GESTURE_FACTOR = .01f; - -    private static final boolean DEBUG = true; - -    private final GdxBoardTest app; -    private final GameHud hud; -    private final GameBoard board; -    private final Camera camera; -    private final SpriteBatch batch; -    private ShapeRenderer debugShapes = null; - -    private final Vector2 dragPos = new Vector2(); -    private final Vector3 boardTouch = new Vector3(); -    private final Vector3 hudTouch = new Vector3(); - -    private boolean paused; -    private float inputDelay; -    private boolean inputBlocked; - -    public enum State -    { -        UI, HEX_V, HEX_H, SQUARE, TRI_H, TRI_V; -        public State next() -        { -            switch(this) { -                case UI: -                    return HEX_V; -                case HEX_V: -                    return HEX_H; -                case HEX_H: -                    return SQUARE; -                case SQUARE: -                    return TRI_H; -                case TRI_H: -                    return TRI_V; -                case TRI_V: -                    return UI; -                default: -                    return UI; -            } -        } -    } -    private State state; - -    public GameScreen(final GdxBoardTest app) -    { -        this.app = app; -        this.hud = new GameHud(app.assets, State.UI, () -> nextState()); -        this.board = new GameBoard(app.assets); -        this.batch = new SpriteBatch(); -        this.camera = new Camera(10, board.getWidth(), board.getHeight(), 1.0f, 0.3f, false); -        Gdx.input.setInputProcessor(getMultiplexer(this)); -        this.paused = false; -        this.inputDelay = 0f; -        this.inputBlocked = false; -        this.state = State.UI; -        if (DEBUG) this.debugShapes = new ShapeRenderer(); -    } - -    public State nextState() -    { -        this.state = this.state.next(); -        this.board.setState(this.state); -        this.camera.setDimension(board.getWidth(), board.getHeight()); -        zoom(1); -        return this.state; -    } - -    @Override public void render(float delta) -    { -        if (paused) return; - -        if (inputBlocked) { -            inputDelay -= delta; -            if (inputDelay <= 0f) -                inputBlocked = false; -        } - -        Gdx.gl.glClearColor(0, 0, 0, 1); -        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - -        camera.applyMapViewport(); -        batch.setProjectionMatrix(camera.combined); -        batch.begin(); -        board.draw(batch); -        batch.end(); - -        camera.applyHudViewport(); -        batch.setProjectionMatrix(camera.getHudMatrix()); -        batch.begin(); -        hud.draw(batch); -        batch.end(); - -        if (DEBUG && this.state == State.UI) { -            Gdx.gl.glEnable(GL20.GL_BLEND); -            debugShapes.setAutoShapeType(true); -            debugShapes.setProjectionMatrix(camera.getHudMatrix()); -            debugShapes.begin(); -            hud.drawDebug(debugShapes); -            debugShapes.end(); -        } - -    } - -    @Override public void resize(int width, int height) -    { -        GdxBoardTest.debug("GameScreen", String.format("resize (%d,%d)",width, height)); -        camera.updateViewport(width, height); -        hud.resize(camera.getHud().width, camera.getHud().height); -    } - -    @Override public void dispose() -    { -        GdxBoardTest.debug("GameScreen", "dispose()"); -        batch.dispose(); -        if (debugShapes != null) debugShapes.dispose(); -        hud.dispose(); -        board.dispose(); -    } - -    @Override public void show() -    { -        GdxBoardTest.debug("GameScreen", "show()"); -        paused = false; -    } - -    @Override public void hide() -    { -        GdxBoardTest.debug("GameScreen", "hide()"); -        paused = true; -    } - -    @Override public void pause() -    { -        GdxBoardTest.debug("pause() "); -        paused = true; -    } - -    @Override public void resume() -    { -        GdxBoardTest.debug("resume() "); -        resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); -        paused = false; -    } - -    private void zoom(float dz) -    { -        camera.zoom(dz); -        resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); -    } - -    private InputMultiplexer getMultiplexer(final GameScreen screen) -    { -        final InputMultiplexer multiplexer = new InputMultiplexer(); -        multiplexer.addProcessor(new InputAdapter() { -            @Override public boolean scrolled(int amount) -            { -                screen.zoom(amount * ZOOM_SCROLL_FACTOR); -                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); -                    camera.unproject(x, y, boardTouch); -                    camera.unprojectHud(x, y, hudTouch); -                    if (!hud.touch(hudTouch.x, hudTouch.y)) { -                        if (state != State.UI) -                            board.touch(boardTouch.x, boardTouch.y); -                    } -                } -                return true; -            } -            @Override public boolean touchDragged(int x, int y, int pointer) -            { -                int dx = (int) (dragPos.x - x); -                int dy = (int) (dragPos.y - y); -                dragPos.set(x, y); -                camera.translate(dx, dy); -                return true; -            } -        }); -        multiplexer.addProcessor(new GestureDetector(new GestureAdapter() { -            @Override public boolean zoom(float initialDistance, float distance) -            { -                if (initialDistance > distance) -                    screen.zoom(ZOOM_GESTURE_FACTOR); -                else -                    screen.zoom(-ZOOM_GESTURE_FACTOR); -                inputBlocked = true; -                inputDelay = INPUT_DELAY; -                return true; -            } -        })); - -        return multiplexer; -    } -} diff --git a/test/src/ch/asynk/gdx/board/test/GdxBoardTest.java b/test/src/ch/asynk/gdx/board/test/GdxBoardTest.java index 072b4d6..7e6bcd4 100644 --- a/test/src/ch/asynk/gdx/board/test/GdxBoardTest.java +++ b/test/src/ch/asynk/gdx/board/test/GdxBoardTest.java @@ -6,13 +6,16 @@ import com.badlogic.gdx.Screen;  public class GdxBoardTest extends Game  { -    public static final String DOM = "GdxBoardTest"; +    private static final String DOM = "GdxBoardTest";      private enum State      {          NONE,          LOADING, -        GAME, +        MENU, +        UI, +        BOARD, +        EXIT      }      private State state; @@ -28,7 +31,8 @@ public class GdxBoardTest extends Game      @Override public void dispose()      { -        switchToNone(); +        debug("dispose()"); +        assets.clear();          assets.dispose();      } @@ -53,9 +57,8 @@ public class GdxBoardTest extends Game              error("switch from and to " + state);              return;          } -        switch(state) { -            case LOADING: assets.unloadLoading(); break; -            case GAME: assets.unloadGame(); break; +        if (state == State.LOADING) { +            assets.unloadLoading();          }          if (state != State.NONE) {              getScreen().dispose(); @@ -64,20 +67,31 @@ public class GdxBoardTest extends Game          this.state = nextState;      } -    public void switchToNone() -    { -        switchTo(null, State.NONE); -    } -      public void switchToLoading()      {          assets.loadLoading();          assets.finishLoading(); -        switchTo(new LoadingScreen(this, () -> assets.loadGame(), () -> switchToGame()), State.LOADING); +        switchTo(new LoadingScreen(this, () -> assets.loadApp(), () -> switchToMenu()), State.LOADING); +    } + +    public void switchToMenu() +    { +        switchTo(new MenuScreen(this), State.MENU); +    } + +    public void switchToUi() +    { +        switchTo(new UiScreen(this), State.UI); +    } + +    public void switchToBoard() +    { +        switchTo(new BoardScreen(this), State.BOARD);      } -    public void switchToGame() +    public void switchToExit()      { -        switchTo(new GameScreen(this), State.GAME); +        Gdx.app.exit(); +        switchTo(null, State.EXIT);      }  } diff --git a/test/src/ch/asynk/gdx/board/test/MenuScreen.java b/test/src/ch/asynk/gdx/board/test/MenuScreen.java new file mode 100644 index 0000000..892182a --- /dev/null +++ b/test/src/ch/asynk/gdx/board/test/MenuScreen.java @@ -0,0 +1,180 @@ +package ch.asynk.gdx.tabletop.test; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.InputAdapter; +import com.badlogic.gdx.InputMultiplexer; +import com.badlogic.gdx.math.Vector3; + +import ch.asynk.gdx.tabletop.ui.Alignment; +import ch.asynk.gdx.tabletop.ui.Menu; +import ch.asynk.gdx.tabletop.ui.Root; + +public class MenuScreen implements Screen +{ +    private static final String DOM = "MenuScreen"; + +    private final GdxBoardTest app; +    private final OrthographicCamera cam; +    private final SpriteBatch batch; +    private final Texture bg; +    private final Sprite corner; +    private final Root root; +    private final Menu menu; +    private boolean paused; + +    private final float WORLD_RATIO = 0.5f; +    private final int PADDING = 15; + +    private final Vector3 touch = new Vector3(); + +    public MenuScreen(final GdxBoardTest app) +    { +        this.app = app; +        this.batch = new SpriteBatch(); +        final Assets assets = app.assets; +        this.bg = assets.getTexture(assets.MAP_00); +        this.corner = new Sprite(assets.getTexture(assets.CORNER)); + +        this.root = new Root(1); +        this.menu = new Menu( +                assets.getFont(assets.FONT_25), +                assets.getNinePatch(assets.PATCH, 23, 23, 23 ,23), +                "Menu", new String[]{"UI","Board","Exit"}); +        this.menu.setAlignment(Alignment.MIDDLE_CENTER); +        this.menu.setPaddings(5, 5); +        this.menu.setSpacings(10, 5); +        this.menu.setPadding(20); +        this.menu.setLabelsOffset(10); +        this.root.add(this.menu); + +        this.cam = new OrthographicCamera(bg.getWidth() * WORLD_RATIO, bg.getHeight() * WORLD_RATIO); +        this.cam.position.set(bg.getWidth() / 2f, bg.getHeight() / 2f, 0); +        this.cam.update(); + +        Gdx.input.setInputProcessor(getMultiplexer(this)); +        this.paused = false; +    } + +    @Override public void render(float delta) +    { +        if (paused) return; + +        Gdx.gl.glClearColor(1, 1, 1, 1); +        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + +        cam.update(); +        batch.setProjectionMatrix(cam.combined); +        batch.begin(); +        batch.draw(bg, 0, 0); +        drawCorners(batch); +        root.draw(batch); +        batch.end(); +    } + +    private void drawCorners(SpriteBatch batch) +    { +        float right = root.getX() + root.getWidth() - corner.getWidth(); +        float top = root.getY() + root.getHeight() - corner.getHeight(); +        corner.setRotation(0); +        corner.setPosition(root.getX(), top); +        corner.draw(batch); +        corner.setRotation(90); +        corner.setPosition(root.getX(), root.getY()); +        corner.draw(batch); +        corner.setRotation(180); +        corner.setPosition(right, root.getY()); +        corner.draw(batch); +        corner.setPosition(right, top); +        corner.setRotation(270); +        corner.draw(batch); +    } + +    @Override public void resize(int width, int height) +    { +        GdxBoardTest.debug(DOM, String.format("resize (%d,%d)",width, height)); +        if (width >= height) { +            cam.viewportWidth = bg.getWidth(); +            cam.viewportHeight = bg.getHeight() / (float)width * (float)height; +        } else { +            cam.viewportHeight = bg.getHeight(); +            cam.viewportWidth = bg.getWidth() / (float)height * (float)width; +        } +        cam.viewportWidth *= WORLD_RATIO; +        cam.viewportHeight *= WORLD_RATIO; +        cam.update(); +        root.resize( +                cam.position.x - (cam.viewportWidth / 2f) + PADDING, +                cam.position.y - (cam.viewportHeight / 2f) + PADDING, +                cam.viewportWidth - 2 * PADDING, +                cam.viewportHeight - 2 * PADDING +                ); +    } + +    @Override public void dispose() +    { +        GdxBoardTest.debug(DOM, "dispose()"); +        batch.dispose(); +    } + +    @Override public void show() +    { +        GdxBoardTest.debug(DOM, "show()"); +        paused = false; +    } + +    @Override public void hide() +    { +        GdxBoardTest.debug(DOM, "hide()"); +        paused = true; +    } + +    @Override public void pause() +    { +        GdxBoardTest.debug(DOM, "pause() "); +        paused = true; +    } + +    @Override public void resume() +    { +        GdxBoardTest.debug(DOM, "resume() "); +        resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); +        paused = false; +    } + +    private InputMultiplexer getMultiplexer(final MenuScreen screen) +    { +        final InputMultiplexer multiplexer = new InputMultiplexer(); +        multiplexer.addProcessor(new InputAdapter() { +            @Override public boolean touchDown(int x, int y, int pointer, int button) +            { +                if (button == Input.Buttons.LEFT) { +                    touch.set(x, y, 0); +                    cam.unproject(touch); +                    if (root.touch(touch.x, touch.y)) { +                        switch(menu.touched()) { +                            case 0: +                                app.switchToUi(); +                                break; +                            case 1: +                                app.switchToBoard(); +                                break; +                            case 2: +                                app.switchToExit(); +                                break; +                        } +                    } +                } +                return true; +            } +        }); + +        return multiplexer; +    } +} diff --git a/test/src/ch/asynk/gdx/board/test/UiScreen.java b/test/src/ch/asynk/gdx/board/test/UiScreen.java new file mode 100644 index 0000000..f321391 --- /dev/null +++ b/test/src/ch/asynk/gdx/board/test/UiScreen.java @@ -0,0 +1,210 @@ +package ch.asynk.gdx.tabletop.test; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.InputAdapter; +import com.badlogic.gdx.InputMultiplexer; +import com.badlogic.gdx.math.Vector3; + +import ch.asynk.gdx.tabletop.ui.Alignment; +import ch.asynk.gdx.tabletop.ui.Button; +import ch.asynk.gdx.tabletop.ui.Root; + +public class UiScreen implements Screen +{ +    private static final String DOM = "UiScreen"; + +    private final GdxBoardTest app; +    private final OrthographicCamera cam; +    private final SpriteBatch batch; +    private final Texture bg; +    private final Root root; +    private final Button hello; +    private boolean paused; + +    private final float WORLD_RATIO = 0.5f; +    private final float PADDING = 15f; + +    private final Vector3 touch = new Vector3(); + +    public enum State +    { +        POSITIONS, DONE; +        public State next() +        { +            switch(this) { +                case POSITIONS: +                    return DONE; +                default: +                    return POSITIONS; +            } +        } +    } +    private State state; + +    public UiScreen(final GdxBoardTest app) +    { +        this.app = app; +        this.batch = new SpriteBatch(); +        this.bg = app.assets.getTexture(app.assets.MAP_00); + +        final NinePatch patch = app.assets.getNinePatch(app.assets.PATCH, 23, 23, 23 ,23); +        final BitmapFont font = app.assets.getFont(app.assets.FONT_25); + +        this.root = new Root(1); +        this.hello = new Button(font, patch, 10, 15); +        this.hello.write("Hello"); +        this.root.add(this.hello); + +        this.cam = new OrthographicCamera(bg.getWidth() * WORLD_RATIO, bg.getHeight() * WORLD_RATIO); +        this.cam.position.set(bg.getWidth() / 2f, bg.getHeight() / 2f, 0); +        this.cam.update(); + +        Gdx.input.setInputProcessor(getMultiplexer()); +        this.paused = false; +        setState(State.POSITIONS); +    } + +    @Override public void render(float delta) +    { +        if (paused) return; + +        Gdx.gl.glClearColor(1, 1, 1, 1); +        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + +        cam.update(); +        batch.setProjectionMatrix(cam.combined); +        batch.begin(); +        draw(batch); +        batch.end(); +    } + +    private void draw(Batch batch) +    { +        batch.draw(bg, 0, 0); +        switch (state) { +            case POSITIONS: +                drawButtons(batch); +                break; +        } +    } + +    private void drawButtons(Batch batch) +    { +        hello.write("hello"); +        hello.setAlignment(Alignment.TOP_LEFT); +        hello.setLabelAlignment(Alignment.BOTTOM_RIGHT); +        root.draw(batch); +        drawHello(batch, Alignment.TOP_CENTER, Alignment.BOTTOM_CENTER); +        drawHello(batch, Alignment.TOP_RIGHT, Alignment.BOTTOM_LEFT); +        drawHello(batch, Alignment.MIDDLE_LEFT, Alignment.MIDDLE_RIGHT); +        drawHello(batch, Alignment.MIDDLE_RIGHT, Alignment.MIDDLE_LEFT); +        drawHello(batch, Alignment.BOTTOM_LEFT, Alignment.TOP_RIGHT); +        drawHello(batch, Alignment.BOTTOM_CENTER, Alignment.TOP_CENTER); +        drawHello(batch, Alignment.BOTTOM_RIGHT, Alignment.TOP_LEFT); +        hello.write("next"); +        drawHello(batch, Alignment.MIDDLE_CENTER, Alignment.MIDDLE_CENTER); +    } + +    private void drawHello(Batch batch, Alignment alignment1, Alignment alignment2) +    { +        hello.setAlignment(alignment1); +        hello.setLabelAlignment(alignment2); +        hello.draw(batch); +    } + +    @Override public void resize(int width, int height) +    { +        GdxBoardTest.debug(DOM, String.format("resize (%d,%d)",width, height)); +        if (width >= height) { +            cam.viewportWidth = bg.getWidth(); +            cam.viewportHeight = bg.getHeight() / (float)width * (float)height; +        } else { +            cam.viewportHeight = bg.getHeight(); +            cam.viewportWidth = bg.getWidth() / (float)height * (float)width; +        } +        cam.viewportWidth *= WORLD_RATIO; +        cam.viewportHeight *= WORLD_RATIO; +        cam.update(); +        root.resize( +                cam.position.x - (cam.viewportWidth / 2f) + PADDING, +                cam.position.y - (cam.viewportHeight / 2f) + PADDING, +                cam.viewportWidth - 2 * PADDING, +                cam.viewportHeight - 2 * PADDING +                ); +    } + +    @Override public void dispose() +    { +        GdxBoardTest.debug(DOM, "dispose()"); +        batch.dispose(); +    } + +    @Override public void show() +    { +        GdxBoardTest.debug(DOM, "show()"); +        paused = false; +    } + +    @Override public void hide() +    { +        GdxBoardTest.debug(DOM, "hide()"); +        paused = true; +    } + +    @Override public void pause() +    { +        GdxBoardTest.debug(DOM, "pause() "); +        paused = true; +    } + +    @Override public void resume() +    { +        GdxBoardTest.debug(DOM, "resume() "); +        resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); +        paused = false; +    } + +    private void touch() +    { +        if (root.touch(touch.x, touch.y)) { +            setState(state.next()); +        } +    } + +    private InputMultiplexer getMultiplexer() +    { +        final InputMultiplexer multiplexer = new InputMultiplexer(); +        multiplexer.addProcessor(new InputAdapter() { +            @Override public boolean touchDown(int x, int y, int pointer, int button) +            { +                if (button == Input.Buttons.LEFT) { +                    touch.set(x, y, 0); +                    cam.unproject(touch); +                    touch(); +                } +                return true; +            } +        }); + +        return multiplexer; +    } + +    private void setState(State state) +    { +        switch (state) { +            case DONE: +                app.switchToMenu(); +        } +        this.state = state; +    } +} | 
