summaryrefslogtreecommitdiffstats
path: root/core/src
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2014-09-27 23:35:05 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2014-09-27 23:35:05 +0200
commit619a78c85048be3a92253d680fcb48b5c8a7d820 (patch)
treee5df03ad0a0a6b1d1601a4a00269a14c508b2bc0 /core/src
parent90540cdf46b9a04af48926bcba2d971a54b6d640 (diff)
downloadRustAndDust-619a78c85048be3a92253d680fcb48b5c8a7d820.zip
RustAndDust-619a78c85048be3a92253d680fcb48b5c8a7d820.tar.gz
go from orthogonal coordinates to skew coordinates
- X axis follows the north, tiles in the same row have the same Y - Y axis follows the south-west, tiles in that column have the same X this complicates the transormation from tiles coordinates into array offset, but eases movement computation and should be more than usefull for line of sight computaion
Diffstat (limited to 'core/src')
-rw-r--r--core/src/ch/asynk/tankontank/engine/Board.java48
-rw-r--r--core/src/ch/asynk/tankontank/engine/SearchBoard.java86
2 files changed, 60 insertions, 74 deletions
diff --git a/core/src/ch/asynk/tankontank/engine/Board.java b/core/src/ch/asynk/tankontank/engine/Board.java
index a923fb4..f64e294 100644
--- a/core/src/ch/asynk/tankontank/engine/Board.java
+++ b/core/src/ch/asynk/tankontank/engine/Board.java
@@ -176,15 +176,15 @@ public abstract class Board extends Image implements Disposable
public Tile getTile(int col, int row)
{
- return tiles[col + (row * cfg.cols)];
+ int idx = ((col - ((row + 1) / 2))) + (row * cfg.cols);
+ // Gdx.app.debug("Board", " getTile: " + col + " ; " + row + " -> " + idx);
+ return tiles[idx];
}
public int distance(int col0, int row0, int col1, int row1)
{
int a = (row1 - row0);
- // transform into a system where all tiles in the same row have the same value of X
- // and all tiles in the same column have the same value of Y non-staggering coordinates
- int b = ((col1 + ((row1 + 1) / 2)) - (col0 + ((row0 + 1) / 2)));
+ int b = (col1 - col0);
int c = (b - a);
int aa = Math.abs(a);
int ab = Math.abs(b);
@@ -452,57 +452,59 @@ public abstract class Board extends Image implements Disposable
return getHexAt(null, v.x, v.y);
}
- public GridPoint2 getHexAt(GridPoint2 hex, float cx, float cy)
+ public GridPoint2 getHexAt(GridPoint2 hex, float mx, float my)
{
if (hex == null) hex = new GridPoint2();
// compute row
- int row;
- boolean oddRow = true;
- float y = (cy - cfg.y0);
+ float y = (my - cfg.y0);
+ int row = (int) (y / cfg.h);
+ boolean oddRow = ((row % 2) == 1);
if (y < 0.f) {
row = -1;
- } else {
- row = (int) (y / cfg.h);
- oddRow = ((row % 2) == 1);
+ oddRow = true;
}
// compute col
- int col;
- float x = (cx - cfg.x0);
+ float x = (mx - cfg.x0);
if (oddRow) x -= cfg.dw;
- if (x < 0.f) {
+ int col = (int) (x / cfg.w);
+ if (x < 0.f)
col = -1;
- } else {
- col = (int) (x / cfg.w);
- }
+
+ int colOffset = ((row +1) / 2);
// check upper boundaries
float dy = (y - (row * cfg.h));
if (dy > cfg.s) {
dy -= cfg.s;
float dx = (x - (col * cfg.w));
+ col += colOffset;
if (dx < cfg.dw) {
if ((dx * cfg.slope) < dy) {
+ // upper left corner
row += 1;
- if (!oddRow) col -= 1;
- oddRow = !oddRow;
+ colOffset = ((row +1) / 2);
}
} else {
if (((cfg.w - dx) * cfg.slope) < dy) {
+ // upper right corner
row += 1;
- if (oddRow) col += 1;
- oddRow = !oddRow;
+ col += 1;
+ colOffset = ((row +1) / 2);
}
}
- }
+ } else
+ col += colOffset;
+
// validate hex
- if ((col < 0) || (row < 0) || (row >= cfg.rows) || (col >= cfg.cols) || (oddRow && ((col + 1) >= cfg.cols)))
+ if ((col < colOffset) || (row < 0) || (row >= cfg.rows) || ((col - colOffset) >= cfg.cols))
hex.set(-1, -1);
else
hex.set(col, row);
+ Gdx.app.debug("Board", " hex: " + hex.x + " ; " + hex.y);
return hex;
}
}
diff --git a/core/src/ch/asynk/tankontank/engine/SearchBoard.java b/core/src/ch/asynk/tankontank/engine/SearchBoard.java
index 0366b9a..a9cee78 100644
--- a/core/src/ch/asynk/tankontank/engine/SearchBoard.java
+++ b/core/src/ch/asynk/tankontank/engine/SearchBoard.java
@@ -41,9 +41,11 @@ public class SearchBoard
this.rows = rows;
this.board = board;
this.nodes = new Node[cols * rows];
- for (int j = 0; j < rows; j++)
+ for (int j = 0; j < rows; j++) {
+ int dx = ((j + 1) / 2);
for (int i = 0; i < cols; i++)
- nodes[i + (j * cols)] = new Node(i, j);
+ nodes[i + (j * cols)] = new Node((i + dx), j);
+ }
this.searchCount = 0;
this.queue = new LinkedList<Node>();
this.stack = new ArrayDeque<Node>(20);
@@ -61,26 +63,22 @@ public class SearchBoard
private Node getNode(int col, int row)
{
- if ((col < 0) || (col >= cols) || (row < 0) || (row >= rows)) return null;
- return nodes[col + (row * cols)];
+ int colOffset = ((row +1) / 2);
+ if ((col < colOffset) || (row < 0) || (row >= rows) || ((col - colOffset) >= cols))
+ return null;
+
+ return nodes[((col - ((row + 1) / 2))) + (row * cols)];
}
public void adjacentMoves(Node src)
{
- // move to enter dst by
+ // move to enter dst by directions[i]
adjacents[0] = getNode((src.col - 1), src.row);
+ adjacents[1] = getNode(src.col, (src.row + 1));
+ adjacents[2] = getNode((src.col + 1), (src.row + 1));
adjacents[3] = getNode((src.col + 1), src.row);
- if ((src.row % 2) == 0) {
- adjacents[1] = getNode((src.col - 1), (src.row + 1));
- adjacents[2] = getNode(src.col, (src.row + 1));
- adjacents[4] = getNode(src.col, (src.row - 1));
- adjacents[5] = getNode((src.col - 1), (src.row - 1));
- } else {
- adjacents[1] = getNode(src.col, (src.row + 1));
- adjacents[2] = getNode((src.col + 1), (src.row + 1));
- adjacents[4] = getNode((src.col + 1), (src.row - 1));
- adjacents[5] = getNode(src.col, (src.row - 1));
- }
+ adjacents[4] = getNode(src.col, (src.row - 1));
+ adjacents[5] = getNode((src.col - 1), (src.row - 1));
}
public List<Node> reachableFrom(Pawn pawn, int col, int row)
@@ -198,45 +196,31 @@ public class SearchBoard
adjacents[0] = getNode((src.col + 1), src.row);
else
adjacents[0] = null;
+
+ if (Board.Orientation.NORTH_EAST.isInSides(angle))
+ adjacents[1] = getNode(src.col, (src.row - 1));
+ else
+ adjacents[1] = null;
+
+ if (Board.Orientation.SOUTH_EAST.isInSides(angle))
+ adjacents[2] = getNode((src.col - 1), (src.row - 1));
+ else
+ adjacents[2] = null;
+
if (Board.Orientation.SOUTH.isInSides(angle))
adjacents[3] = getNode((src.col - 1), src.row);
else
adjacents[3] = null;
- if ((src.row % 2) == 0) {
- if (Board.Orientation.NORTH_EAST.isInSides(angle))
- adjacents[1] = getNode(src.col, (src.row - 1));
- else
- adjacents[1] = null;
- if (Board.Orientation.SOUTH_EAST.isInSides(angle))
- adjacents[2] = getNode((src.col - 1), (src.row - 1));
- else
- adjacents[2] = null;
- if (Board.Orientation.NORTH_WEST.isInSides(angle))
- adjacents[4] = getNode(src.col, (src.row + 1));
- else
- adjacents[4] = null;
- if (Board.Orientation.SOUTH_WEST.isInSides(angle))
- adjacents[5] = getNode((src.col - 1), (src.row + 1));
- else
- adjacents[5] = null;
- } else {
- if (Board.Orientation.NORTH_EAST.isInSides(angle))
- adjacents[1] = getNode((src.col + 1), (src.row - 1));
- else
- adjacents[1] = null;
- if (Board.Orientation.SOUTH_EAST.isInSides(angle))
- adjacents[2] = getNode(src.col, (src.row - 1));
- else
- adjacents[2] = null;
- if (Board.Orientation.NORTH_WEST.isInSides(angle))
- adjacents[4] = getNode((src.col + 1), (src.row + 1));
- else
- adjacents[4] = null;
- if (Board.Orientation.SOUTH_WEST.isInSides(angle))
- adjacents[5] = getNode(src.col, (src.row + 1));
- else
- adjacents[5] = null;
- }
+
+ if (Board.Orientation.SOUTH_WEST.isInSides(angle))
+ adjacents[4] = getNode(src.col, (src.row + 1));
+ else
+ adjacents[4] = null;
+
+ if (Board.Orientation.NORTH_WEST.isInSides(angle))
+ adjacents[5] = getNode((src.col + 1), (src.row + 1));
+ else
+ adjacents[5] = null;
}
private boolean hasClearLineOfSight(Tile from, Tile to)