我正在开发一个使用六边形网格的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]处的瓦片转换为屏幕空间,看看指针是否在其中,或者离它有多远,然后逐个瓦片地慢慢前进,直到找到包含鼠标坐标的瓦片(或没有包含鼠标坐标的瓦片),但我正在寻找更优雅的解决方案(如果存在的话)。
有人有什么想法吗?
谢谢。