diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2014-09-14 22:35:07 +0200 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2014-09-14 22:35:07 +0200 |
commit | 0602d795f427652b5059269656e73a861b7091ac (patch) | |
tree | dc72cef6793ae119b409f79bbac97db353b6f938 | |
parent | bc6842f94f8c04723acb2573254995e7b5d3373a (diff) | |
download | RustAndDust-0602d795f427652b5059269656e73a861b7091ac.zip RustAndDust-0602d795f427652b5059269656e73a861b7091ac.tar.gz |
HexMap: stack tiles on hexes, taking care of position rotation and z index
-rw-r--r-- | core/src/ch/asynk/tankontank/actors/HexMap.java | 81 |
1 files changed, 72 insertions, 9 deletions
diff --git a/core/src/ch/asynk/tankontank/actors/HexMap.java b/core/src/ch/asynk/tankontank/actors/HexMap.java index a6ee636..801ae2c 100644 --- a/core/src/ch/asynk/tankontank/actors/HexMap.java +++ b/core/src/ch/asynk/tankontank/actors/HexMap.java @@ -1,10 +1,15 @@ package ch.asynk.tankontank.actors; +import java.util.ArrayDeque; + +import com.badlogic.gdx.Gdx; + import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.scenes.scene2d.Actor; 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 { @@ -19,23 +24,79 @@ public class HexMap extends Image private int cols; private int rows; - public Vector2 cell = new Vector2(); + private ArrayDeque<Tile>[][] cells; + @SuppressWarnings("unchecked") public HexMap(int cols, int rows, Texture texture) { super(texture); - this.cols = cols; - this.rows = rows; + 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 void centerActorOn(Actor actor, int col, int row) + public Tile getTopTileAt(GridPoint2 cell) { - int x = x0 + (int) ((col * w) + ((w - actor.getWidth()) / 2)); - int y = y0 + (int) ((row * H) + ((h - actor.getWidth()) / 2)); - actor.setPosition(x, y); + return getTopTileAt(cell.x, cell.y); } - public void selectCell(float cx, float cy) + private Tile getTopTileAt(int col, int row) + { + if ((col < 0) || (row < 0)) return null; + ArrayDeque<Tile> st = cells[row][col]; + if ((st == null) || (st.size() == 0)) return null; + return st.getFirst(); + } + + public Vector2 getTilePosAt(Tile tile, GridPoint3 cell) + { + return getTilePosAt(tile, cell.x, cell.y); + } + + private Vector2 getTilePosAt(Tile tile, int col, int row) + { + float x = x0 + ((col * w) + ((w - tile.getHeight()) / 2)); + float y = y0 + ((row * H) + ((h - tile.getWidth()) / 2)); + if ((row % 2) == 1) x += dw; + return new Vector2(x, y); + } + + private void removeTileFrom(Tile tile, int col, int row) + { + if ((col> 0) && (row > 0)) { + ArrayDeque<Tile> st = cells[row][col]; + if ((st == null) || (st.size() == 0)) + Gdx.app.error("GameScreen", "remove tile from " + col + ";" + row + " but tile stack is empty"); + else + st.remove(tile); + } + } + + public void setTileOn(Tile tile, GridPoint3 cell) + { + setTileOn(tile, cell.x, cell.y, cell.z); + } + + private void setTileOn(Tile tile, int col, int row, int angle) + { + GridPoint3 prev = tile.cell; + if (prev != null) removeTileFrom(tile, prev.x, prev.y); + + Vector2 pos = getTilePosAt(tile, col, row); + tile.setPosition(pos.x, pos.y); + tile.setRotation(angle); + + ArrayDeque<Tile> st = cells[row][col]; + if (st == null) st = cells[row][col] = new ArrayDeque<Tile>(); + st.push(tile); + tile.setZIndex(st.size()); + } + + public GridPoint2 getCellAt(GridPoint2 cell, float cx, float cy) { // compute row int row; @@ -83,5 +144,7 @@ public class HexMap extends Image cell.set(-1, -1); else cell.set(col, row); + + return cell; } } |