如何将Cascadia游戏自定义坐标转换为JavaFx场景实际坐标?
六边形Tile坐标转JavaFX场景坐标实现
首先明确核心参数:你的Tile宽度为100px,六边形垂直方向的行间距为 100 * √3 / 2 ≈ 86.6px,这是六边形网格布局的关键计算值。
根据你描述的“左右移动Tile可直接加减100像素”,推测你的自定义Point是列-行式的偏移坐标(col, row),以下是两种常见偏移规则的转换方案:
方案1:偶行偏移(偶数行Tile向右偏移半宽)
这是最常用的六边形网格布局,偶数行的Tile相对于奇数行向右偏移50px(半宽):
import javafx.geometry.Point2D; // 定义常量 private static final double TILE_WIDTH = 100.0; private static final double TILE_ROW_SPACING = TILE_WIDTH * Math.sqrt(3) / 2; // ~86.6px // 自定义Point假设包含col和row属性 public Point2D toSceneCoords(Point customPoint) { int col = customPoint.getCol(); int row = customPoint.getRow(); // 计算X坐标:列宽*列数 + 偶行偏移量 double sceneX = col * TILE_WIDTH + (row % 2 == 0 ? 0 : TILE_WIDTH / 2); // 计算Y坐标:行间距*行数 double sceneY = row * TILE_ROW_SPACING; // 如果需要以Tile中心为坐标基准(而非左上角),取消下面两行注释: // sceneX += TILE_WIDTH / 2; // sceneY += TILE_ROW_SPACING / 2; return new Point2D(sceneX, sceneY); }
方案2:奇行偏移(奇数行Tile向右偏移半宽)
如果你的网格是奇数行偏移,只需调整X坐标的判断逻辑:
double sceneX = col * TILE_WIDTH + (row % 2 != 0 ? 0 : TILE_WIDTH / 2);
网格居中调整
JavaFX场景原点在左上角,若要让整个六边形网格居中显示,可在转换后的坐标上添加全局偏移:
// 假设场景宽高为800px*600px,先计算网格的最大X/Y坐标 double maxGridX = getMaxCol() * TILE_WIDTH + TILE_WIDTH / 2; double maxGridY = getMaxRow() * TILE_ROW_SPACING; // 计算居中偏移量 double offsetX = (800 - maxGridX) / 2; double offsetY = (600 - maxGridY) / 2; // 应用偏移 Point2D centeredCoords = new Point2D(sceneX + offsetX, sceneY + offsetY);
轴向坐标适配(如果你的自定义Point是q/r轴向坐标)
若你的Point采用六边形轴向坐标系统(q, r),转换公式如下:
public Point2D toSceneCoords(Point customPoint) { int q = customPoint.getQ(); int r = customPoint.getR(); double sceneX = TILE_WIDTH * (1.5 * q + 0.5 * r); double sceneY = TILE_ROW_SPACING * r; // 中心基准偏移(可选) sceneX += TILE_WIDTH / 2; sceneY += TILE_ROW_SPACING / 2; return new Point2D(sceneX, sceneY); }
内容的提问来源于stack exchange,提问作者st3ems
相关产品推荐
相关产品推荐

