2

编辑调整了所有发布的算法。它现在几乎完美无缺。它只是失败的最左边的 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 内部是瓦片坐标。

4

2 回答 2

1

查看教程,您似乎需要从鼠标坐标中减去 256(224 加上宽度的一半)。告诉我们这是否有效!

并且请不要在每次绘制一个新精灵时动态分配一个新精灵,只是为了以相同的方法删除它!好的,我会尽量避免对您的代码发表进一步的评论。;)

于 2012-05-26T22:27:12.773 回答
1

最后是由于很多舍入错误。

                if (screenX < 0 || tilePixelX < 0)
                    tilePixelX = 64 - abs(tilePixelX);
                if (screenY < 0 || tilePixelY < 0)
                    tilePixelY = 32 - abs(tilePixelY);
                if (tilePixelX >= 64)
                    tilePixelX = 63;
                if (tilePixelY >= 32)
                    tilePixelY = 31;

                if (screenX < 0 || screenY < 0)
                {
                    tilex--;
                    tiley++;
                }

整理出来,即使它在某些地方有点丑陋。

于 2012-05-28T19:29:00.343 回答