From 0602d795f427652b5059269656e73a861b7091ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Zurcher?= Date: Sun, 14 Sep 2014 22:35:07 +0200 Subject: HexMap: stack tiles on hexes, taking care of position rotation and z index --- core/src/ch/asynk/tankontank/actors/HexMap.java | 81 ++++++++++++++++++++++--- 1 file 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[][] 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 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 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 st = cells[row][col]; + if (st == null) st = cells[row][col] = new ArrayDeque(); + 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; } } -- cgit v1.1-2-g2b99