package com.snowcattle.game.common.util; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.image.BufferedImage; public class IsoUtils { // masks的区域 // _______ // | /\ | // | / \ | // |/ \| // |\ /| // | \ / | // |__\/__| public static final byte AREA_CENTER = 0; public static final byte AREA_NORTHEAST = 1; public static final byte AREA_SOUTHEAST = 2; public static final byte AREA_NORTHWEST = 3; public static final byte AREA_SOUTHWEST = 4; public static final int TILE_WIDTH = 64; public static final int TILE_HEIGHT = 32; public static final int HALF_TILE_WIDTH = 32; public static final int HALF_TILE_HEIGHT = 16; private static byte[][] masks; static { initMask(); } public static void initMask() { int width = TILE_WIDTH; int height = TILE_HEIGHT; Polygon poly = new Polygon(); poly.addPoint(width / 2, 0); poly.addPoint(width, height / 2); poly.addPoint(width / 2, height); poly.addPoint(0, height / 2); BufferedImage bufimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); Graphics2D g2d = bufimage.createGraphics(); g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, width, height); g2d.setColor(Color.BLACK); g2d.fillPolygon(poly); masks = new byte[height][width]; int w2 = width / 2; int h2 = height / 2; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { int rgb = bufimage.getRGB(col, row); if (rgb == 0xFF000000) { masks[row][col] = AREA_CENTER; } else if (row < h2) { if (col < w2) { masks[row][col] = AREA_NORTHWEST; } else { masks[row][col] = AREA_NORTHEAST; } } else { if (col < w2) { masks[row][col] = AREA_SOUTHWEST; } else { masks[row][col] = AREA_SOUTHEAST; } } } } g2d.dispose(); bufimage = null; } /** * 返回tile坐标对应的网格的中点坐标 * * @param x * tile所在列坐标 * @param y * tile所在行坐标 * @return */ public static Point tile2ImageCoord(int x, int y) { Point rt; if (y % 2 == 0) { rt = new Point(x * TILE_WIDTH, y * HALF_TILE_HEIGHT); } else { rt = new Point(x * TILE_WIDTH + HALF_TILE_WIDTH, y * HALF_TILE_HEIGHT); } return rt; } public static Point tile2ImageCoord(String str) { Point pt = null; try { if (str != null) { String[] coords = str.split(","); if (coords.length == 2) { pt = IsoUtils.tile2ImageCoord(Integer.parseInt(coords[0]), Integer.parseInt(coords[1])); } } } catch (NumberFormatException e) { e.printStackTrace(); return null; } return pt; } public static Point image2TileCoord(int x, int y) { Point centerCellCoords = new Point(x / TILE_WIDTH, y / TILE_HEIGHT * 2 + 1); int offx = Math.abs(x % TILE_WIDTH); int offy = Math.abs(y % TILE_HEIGHT); switch (masks[offy][offx]) { case AREA_NORTHEAST: { centerCellCoords.x += 1; centerCellCoords.y--; break; } case AREA_NORTHWEST: { // centerCellCoords.x -= centerCellCoords.y--; break; } case AREA_SOUTHEAST: { centerCellCoords.x += 1; centerCellCoords.y++; break; } case AREA_SOUTHWEST: { // centerCellCoords.x centerCellCoords.y++; break; } } // System.out.println("[S2T]("+x+","+y+")<->("+centerCellCoords.x+","+centerCellCoords.y+")"); if (x < 0) { centerCellCoords.x = -centerCellCoords.x; } if (y < 0) { centerCellCoords.y = -centerCellCoords.y; } return centerCellCoords; } public static void main(String[] args) { System.out.println(tile2ImageCoord(6, 32)); System.out.println(image2TileCoord(1444 , 400)); } }