在等距六边形平铺引擎中将屏幕坐标转换为地图坐标?

13

我正在开发一个使用六边形网格的TBS游戏。但是,我希望它呈现等距(看起来漂亮而像素化),瓦片引擎可以很好地工作,这是结果:

然而,为了实现这一点,我不得不调整值(瓦片大小,平铺算法)以使瓦片正确对齐。这是一个示例瓷砖:

瓷砖大小为62x32,每个瓷砖在平铺时沿x轴移动47(顺时针方向)并沿y轴移动16(顺时针方向)以正确对齐。

这是我如何从地图坐标计算屏幕坐标(用于绘制地块)的方法:

function toScreen(x, y, z, offset)
{
    offset = ifndef(offset, {x: 0, y: 0});
    var ret = new Vector2D(y*Tile.cw + x*Tile.cw -offset.x, -x*Tile.ch + y*Tile.ch -offset.y -z*16);
    ret.y += (Tile.height*this.h)/2; //center the map on screen
    return ret;
}
现在,我需要能够选择瓦片,并从屏幕坐标(鼠标)坐标获取地图坐标。我无法弄清楚是否有可能仅仅通过某种方式转换坐标(我所有的尝试都失败了)。
这是地图坐标系统的样子以及如何绘制瓦片: 所选的瓷砖,当然必须像素完美,但只适用于平铺瓷砖(不需要选择超过上方瓷砖的树木),因此算法可以假设所有瓷砖都是平的(就像我给出的示例一样)。有人知道如何做到这一点吗?我可以“暴力”解决它,通过将[0,0]处的瓦片转换为屏幕空间,看看指针是否在其中,或者离它有多远,然后逐个瓦片地慢慢前进,直到找到包含鼠标坐标的瓦片(或没有包含鼠标坐标的瓦片),但我正在寻找更优雅的解决方案(如果存在的话)。
有人有什么想法吗?
谢谢。

2
对于良好结构的问题,点赞。 - Goles
1个回答

7
请看这篇文章,它深入探讨了六边形网格:http://playtechs.blogspot.com/2007/04/hex-grids.html 其中有一节介绍如何将矩形坐标转换为六边形坐标。您可以轻松地将他的方法适应到你的“等距六边形平铺”中,只需添加额外的仿射变换来将你的六边形转换为正六边形即可。

我一直在寻找类似的东西,但是找不到。虽然有点模糊,但解释得足够清楚了。非常感谢 :) - fingerprint211b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接