【问题标题】:Isometry, incorrect coordinates from mouse pos->tile coords formula等距,鼠标位置->平铺坐标公式中的坐标不正确
【发布时间】:2012-06-01 21:20:19
【问题描述】:

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

【问题讨论】:

    标签: c++ math collision sfml isometric


    【解决方案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++;
                    }
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,分配只是匆忙制作实际代码。一旦它完全工作,它们将在地图类中的一个数组中:)
      • 我将它从 224 更改为 256,唯一的变化是唯一的工作现在有半个瓷砖不准确:(
      • 如果您想直观地查看问题的外观,我只是添加了一个下载链接。
      • 我只是重写了这个问题,因为我现在正在使用鼠标地图来解决我的大部分问题。
      • @AshleyDavies 您介意在将鼠标放在橙色区域时显示哪些单元格被选中吗?这可能对诊断很重要。
      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2016-02-27
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多