编辑调整了所有发布的算法。它现在几乎完美无缺。它只是失败的最左边的 9 个图块(图片在底部)。在大多数情况下,当悬停在这九个中的一个时,它会选择完全错误的图块。
EDIT2 我现在几乎可以肯定问题是由于 screenX 或 screenY 为负数时的错误造成的,所以它可能归结为在 tilePixelX/Y 上使用 math.abs,但不能只是这样,否则结果不会相距甚远(尽管它很可能有所贡献)
我正在制作一个等距游戏,现在我正在研究地图渲染引擎。从理论上讲,它应该相当简单,但我无法从鼠标位置获取瓷砖坐标。
我的瓷砖是 64 宽和 32 高。如下图所示:
我的地图显示得相当完美:
实际问题在顶部进行了解释。
这是我现在正在使用的代码:
int screenX = sf::Mouse::getPosition(window).x - 250;
int screenY = sf::Mouse::getPosition(window).y - 250;
int tilex = floor((screenY / 32) + (screenX / 64));
int tiley = floor((screenY / 32) - (screenX / 64));
int tilePixelX = abs(screenX % 64); // I believe part of the problem
int tilePixelY = abs(screenY % 32); // is absoluting these. Not all though.
sf::Color mCol = mouseMap.getPixel(tilePixelX, tilePixelY);
if (mCol.r == 20)
tilex -= 1;
else if (mCol.r == 40)
tiley -= 1;
else if (mCol.r == 60)
tilex += 1;
else if (mCol.r == 80)
tiley += 1;
我现在正在使用一个运行良好的鼠标地图,但是如上所述,它仍然在钻石中最左边的九个瓷砖上失败(当你将它们悬停时,它会选择一个看似随机的大约 4-5 个瓷砖,或者根本没有瓷砖(我猜测超出了地图范围):
这也显示了以红色突出显示的问题图块。
这就是地图的样子,让您了解我的渲染引擎是如何工作的。请注意,透明像素被认为是空的,黑色像素被认为是墙壁(我没有为上面的示例图片渲染,所以上图中显示的瓷砖都不是第 0 列或第 0 行,它们也不是最后一行。
由于大部分地图都可以正常工作,我的鼠标地图绝对是正确的,但无论如何都是这样:
编辑:
我已将必要的文件和 DLL 打包到一个 zip 文件中,以便您可以运行它并亲自查看发生了什么:
https://dl.dropbox.com/u/37019412/Broken.zip
绘图公式为:
(x - y) * 32 + 250, (x + y) * 16 + 250
coma 之前是 X,之后是 Y,x 和 y 内部是瓦片坐标。