diff options
Diffstat (limited to 'core/src/ch/asynk')
| -rw-r--r-- | core/src/ch/asynk/tankontank/game/HexMap.java | 157 | ||||
| -rw-r--r-- | core/src/ch/asynk/tankontank/game/HexMapImage.java | 163 | ||||
| -rw-r--r-- | core/src/ch/asynk/tankontank/game/PawnImage.java | 4 | 
3 files changed, 175 insertions, 149 deletions
| diff --git a/core/src/ch/asynk/tankontank/game/HexMap.java b/core/src/ch/asynk/tankontank/game/HexMap.java index 32f3fb6..e1f3d7b 100644 --- a/core/src/ch/asynk/tankontank/game/HexMap.java +++ b/core/src/ch/asynk/tankontank/game/HexMap.java @@ -1,163 +1,26 @@  package ch.asynk.tankontank.game; -import java.util.ArrayDeque; - -import com.badlogic.gdx.Gdx; - -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.scenes.scene2d.ui.Image; -  import com.badlogic.gdx.math.Vector2;  import com.badlogic.gdx.math.GridPoint2;  import com.badlogic.gdx.math.GridPoint3; -public class HexMap extends Image +public interface HexMap  { -    static final int x0 = 83;       // map offset -    static final int y0 = 182;      // map offset -    static final int h = 110;       // hex side -    static final float dh = 53.6f;  // hex top     should be h/2 -    static final int w = 189;       // hex width -    static final int dw = 94;       // half hex    should be w/2 -    static final float H = h + dh;  // total height -    static final float slope = (dh / (float) dw); - -    private int cols; -    private int rows; -    private ArrayDeque<Pawn>[][] cells; - -    @SuppressWarnings("unchecked") -    public HexMap(int cols, int rows, Texture texture) -    { -        super(texture); -        cells = new ArrayDeque[rows][]; -        for (int i = 0; i < rows; i++) { -            if ((i % 2) == 1) cells[i] = new ArrayDeque[cols - 1]; -            else cells[i] = new ArrayDeque[cols]; -        } -        this.cols = cols - 1; -        this.rows = rows - 1; -    } - -    public Pawn getTopPawnAt(GridPoint2 cell) -    { -        return getTopPawnAt(cell.x, cell.y); -    } - -    private Pawn getTopPawnAt(int col, int row) -    { -        if ((col < 0) || (row < 0)) return null; -        ArrayDeque<Pawn> st = cells[row][col]; -        if ((st == null) || (st.size() == 0)) return null; -        return st.getFirst(); -    } - -    public void setImageCenterAt(Image image, GridPoint2 cell) -    { -        float x = x0 + ((cell.x * w) + (w / 2)); -        float y = y0 + ((cell.y * H) + (h / 2)); -        if ((cell.y % 2) == 1) x += dw; -        image.setCenterPosition(x, y); -    } - -    // public Vector2 getPawnPosAt(Pawn pawn, GridPoint2 cell) -    // { -    //     return getPawnPosAt(pawn, cell.x, cell.y); -    // } - -    public Vector2 getPawnPosAt(Pawn pawn, GridPoint3 cell) -    { -        return getPawnPosAt(pawn, cell.x, cell.y); -    } - -    private Vector2 getPawnPosAt(Pawn pawn, int col, int row) -    { -        float x = x0 + ((col * w) + ((w - pawn.getHeight()) / 2)); -        float y = y0 + ((row * H) + ((h - pawn.getWidth()) / 2)); -        if ((row % 2) == 1) x += dw; -        return new Vector2(x, y); -    } - -    private void removePawnFrom(Pawn pawn, int col, int row) -    { -        if ((col> 0) && (row > 0)) { -            ArrayDeque<Pawn> st = cells[row][col]; -            if ((st == null) || (st.size() == 0)) -                Gdx.app.error("GameScreen", "remove pawn from " + col + ";" + row + " but pawn stack is empty"); -            else -                st.remove(pawn); -        } -    } - -    public void setPawnOn(Pawn pawn, GridPoint3 cell) -    { -        setPawnOn(pawn, cell.x, cell.y, cell.z); -    } +    // Gfx related -    private void setPawnOn(Pawn pawn, int col, int row, int angle) -    { -        GridPoint3 prev = pawn.getBoardPosition(); -        if (prev != null) removePawnFrom(pawn, prev.x, prev.y); +    public float getHeight(); -        Vector2 pos = getPawnPosAt(pawn, col, row); -        pawn.setPosition(pos.x, pos.y); -        pawn.setRotation(angle); +    public float getWidth(); -        ArrayDeque<Pawn> st = cells[row][col]; -        if (st == null) st = cells[row][col] = new ArrayDeque<Pawn>(); -        st.push(pawn); -        pawn.setZIndex(st.size()); -    } +    // Map related -    public GridPoint2 getCellAt(GridPoint2 cell, float cx, float cy) -    { -        // compute row -        int row; -        boolean oddRow = true; -        float y = (cy - y0); -        if (y < 0.f) { -            row = -1; -        } else { -            row = (int) (y / H); -            oddRow = ((row % 2) == 1); -        } +    public Pawn getTopPawnAt(GridPoint2 hex); -        // compute col -        int col; -        float x = (cx - x0); -        if (oddRow) x -= dw; -        if (x < 0.f) { -            col = -1; -        } else { -            col = (int) (x / w); -        } +    public Vector2 getHexCenterAt(GridPoint2 hex); -        // check upper boundaries -        float dy = (y - (row * H)); -        if (dy > h) { -            dy -= h; -            float dx = (x - (col * w)); -            if (dx < dw) { -                if ((dx * slope) < dy) { -                    row += 1; -                    if (!oddRow) col -= 1; -                    oddRow = !oddRow; -                } -            } else { -                if (((w - dx) * slope) < dy) { -                    row += 1; -                    if (oddRow) col += 1; -                    oddRow = !oddRow; -                } -            } -        } +    public Vector2 getPawnPosAt(Pawn pawn, GridPoint3 hex); -        // validate cell -        if ((col < 0) || (row < 0) || (row > rows) || (col > cols) || (oddRow && ((col +1)> cols))) -            cell.set(-1, -1); -        else -            cell.set(col, row); +    public void setPawnAt(Pawn pawn, GridPoint3 hex); -        return cell; -    } +    public GridPoint2 getHexAt(GridPoint2 hex, float x, float y);  } diff --git a/core/src/ch/asynk/tankontank/game/HexMapImage.java b/core/src/ch/asynk/tankontank/game/HexMapImage.java new file mode 100644 index 0000000..60e218f --- /dev/null +++ b/core/src/ch/asynk/tankontank/game/HexMapImage.java @@ -0,0 +1,163 @@ +package ch.asynk.tankontank.game; + +import java.util.ArrayDeque; + +import com.badlogic.gdx.Gdx; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.ui.Image; + +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.math.GridPoint2; +import com.badlogic.gdx.math.GridPoint3; + +public class HexMapImage extends Image implements HexMap +{ +    static final int x0 = 83;       // map offset +    static final int y0 = 182;      // map offset +    static final int h = 110;       // hex side +    static final float dh = 53.6f;  // hex top     should be h/2 +    static final int w = 189;       // hex width +    static final int dw = 94;       // half hex    should be w/2 +    static final float H = h + dh;  // total height +    static final float slope = (dh / (float) dw); + +    private int cols; +    private int rows; +    private ArrayDeque<Pawn>[][] cells; + +    @SuppressWarnings("unchecked") +    public HexMapImage(int cols, int rows, Texture texture) +    { +        super(texture); +        cells = new ArrayDeque[rows][]; +        for (int i = 0; i < rows; i++) { +            if ((i % 2) == 1) cells[i] = new ArrayDeque[cols - 1]; +            else cells[i] = new ArrayDeque[cols]; +        } +        this.cols = cols - 1; +        this.rows = rows - 1; +    } + +    public Pawn getTopPawnAt(GridPoint2 cell) +    { +        return getTopPawnAt(cell.x, cell.y); +    } + +    private Pawn getTopPawnAt(int col, int row) +    { +        if ((col < 0) || (row < 0)) return null; +        ArrayDeque<Pawn> st = cells[row][col]; +        if ((st == null) || (st.size() == 0)) return null; +        return st.getFirst(); +    } + +    public Vector2 getHexCenterAt(GridPoint2 cell) +    { +        float x = x0 + ((cell.x * w) + (w / 2)); +        float y = y0 + ((cell.y * H) + (h / 2)); +        if ((cell.y % 2) == 1) x += dw; +        return new Vector2(x, y); +    } + +    // public Vector2 getPawnPosAt(Pawn pawn, GridPoint2 cell) +    // { +    //     return getPawnPosAt(pawn, cell.x, cell.y); +    // } + +    public Vector2 getPawnPosAt(Pawn pawn, GridPoint3 cell) +    { +        return getPawnPosAt(pawn, cell.x, cell.y); +    } + +    private Vector2 getPawnPosAt(Pawn pawn, int col, int row) +    { +        float x = x0 + ((col * w) + ((w - pawn.getHeight()) / 2)); +        float y = y0 + ((row * H) + ((h - pawn.getWidth()) / 2)); +        if ((row % 2) == 1) x += dw; +        return new Vector2(x, y); +    } + +    private void removePawnFrom(Pawn pawn, int col, int row) +    { +        if ((col> 0) && (row > 0)) { +            ArrayDeque<Pawn> st = cells[row][col]; +            if ((st == null) || (st.size() == 0)) +                Gdx.app.error("GameScreen", "remove pawn from " + col + ";" + row + " but pawn stack is empty"); +            else +                st.remove(pawn); +        } +    } + +    public void setPawnAt(Pawn pawn, GridPoint3 cell) +    { +        setPawnAt(pawn, cell.x, cell.y, cell.z); +    } + +    private void setPawnAt(Pawn pawn, int col, int row, int angle) +    { +        GridPoint3 prev = pawn.getBoardPosition(); +        if (prev != null) removePawnFrom(pawn, prev.x, prev.y); + +        Vector2 pos = getPawnPosAt(pawn, col, row); +        pawn.setPosition(pos.x, pos.y); +        pawn.setRotation(angle); + +        ArrayDeque<Pawn> st = cells[row][col]; +        if (st == null) st = cells[row][col] = new ArrayDeque<Pawn>(); +        st.push(pawn); +        pawn.setZIndex(st.size()); +    } + +    public GridPoint2 getHexAt(GridPoint2 cell, float cx, float cy) +    { +        // compute row +        int row; +        boolean oddRow = true; +        float y = (cy - y0); +        if (y < 0.f) { +            row = -1; +        } else { +            row = (int) (y / H); +            oddRow = ((row % 2) == 1); +        } + +        // compute col +        int col; +        float x = (cx - x0); +        if (oddRow) x -= dw; +        if (x < 0.f) { +            col = -1; +        } else { +            col = (int) (x / w); +        } + +        // check upper boundaries +        float dy = (y - (row * H)); +        if (dy > h) { +            dy -= h; +            float dx = (x - (col * w)); +            if (dx < dw) { +                if ((dx * slope) < dy) { +                    row += 1; +                    if (!oddRow) col -= 1; +                    oddRow = !oddRow; +                } +            } else { +                if (((w - dx) * slope) < dy) { +                    row += 1; +                    if (oddRow) col += 1; +                    oddRow = !oddRow; +                } +            } +        } + +        // validate cell +        if ((col < 0) || (row < 0) || (row > rows) || (col > cols) || (oddRow && ((col +1)> cols))) +            cell.set(-1, -1); +        else +            cell.set(col, row); + +        return cell; +    } +} diff --git a/core/src/ch/asynk/tankontank/game/PawnImage.java b/core/src/ch/asynk/tankontank/game/PawnImage.java index f98f86b..0f7a77d 100644 --- a/core/src/ch/asynk/tankontank/game/PawnImage.java +++ b/core/src/ch/asynk/tankontank/game/PawnImage.java @@ -46,7 +46,7 @@ public class PawnImage extends Image implements Pawn          if ((hex.x == -1) || (hex.y == -1)) {              resetMoves();          } else { -            map.setPawnOn(this, hex); +            map.setPawnAt(this, hex);              path.push(hex);          }      } @@ -65,7 +65,7 @@ public class PawnImage extends Image implements Pawn          seq.addAction( Actions.run(new Runnable() {              @Override              public void run() { -                map.setPawnOn(self, finalHex); +                map.setPawnAt(self, finalHex);                  path.push(finalHex);              }          })); | 
