
在ROK、SOS、WOS等SLG游戏中,都是使用菱形瓦片(也称为斜方格或轴对称网格)进行地图布局。
它的实际角度为
arctan(1/2),由于它是一个菱形,所以这里我们称它为菱形瓦片。
他的坐标系布局主要有下面两种
- diamond
- staggered

但是我们在屏幕里的视野,就是一个标准正交坐标系,所以很多场景下我们需要进行做一个转换

一、坐标系定义
1. 菱形网格坐标系
- 轴向坐标:以
菱形网格对角方向为基准轴,记作(q, r) - 特征参数:
菱形瓦片宽度 w=2a,高度 h=a(宽高比2:1)
2. 笛卡尔坐标系
- 标准正交坐标系,记作
(x, y) - 菱形网格中心点对齐笛卡尔坐标原点

二、正向转换(菱形→笛卡尔)
公式:

几何解释:
- 横向位移由 q 和 r 共同驱动,纵向位移由两者差值决定
- 参数 a 为基本单位长度(例如像素尺寸)
示例:
若 a=1,菱形坐标 (3,2) 对应笛卡尔坐标:

三、逆向转换(笛卡尔→菱形)
公式:

运算步骤:

转换代码
// 轴向坐标系(q, r)与笛卡尔坐标系(x, y)互转
public class CoordinateConverter {
private static final float TILE_SIZE = 64.0f; // 菱形瓦片边长
// 轴向坐标转像素坐标
public static Point2D.Float toPixel(int q, int r) {
float x = TILE_SIZE * (q + r);
float y = TILE_SIZE * (r - q) * 0.5f;
return new Point2D.Float(x, y);
}
// 像素坐标转轴向坐标
public static int[] toAxial(float x, float y) {
float qf = (x / TILE_SIZE - y / (TILE_SIZE * 0.5f)) * 0.5f;
float rf = (x / TILE_SIZE + y / (TILE_SIZE * 0.5f)) * 0.5f;
return new int[]{
Math.round(qf), Math.round(rf)};
}
}
九宫格AOI实战

1. 网格划分策略
将地图划分为菱形网格,每个网格的边界由 轴向坐标范围 定义:
// 菱形网格定义
public class DiamondGrid {
private final int qMin, qMax; // 轴向坐标q范围
private final int rMin, rMax; // 轴向坐标r范围
private final ConcurrentHashMap<Integer, Entity> entities = new ConcurrentHashMap<>(); // 网格内实体
public DiamondGrid(int qMin, int qMax, int rMin, int rMax) {
this.qMin = qMin;
this.qMax = qMax;
this.rMin = rMin;
this.rMax = rMax;
}
// 判断坐标是否在网格内 (q, r为轴向坐标)
public boole

最低0.47元/天 解锁文章
847

被折叠的 条评论
为什么被折叠?



