1

如何获得 sf::View 的 X 和 Y 偏移量,我使用 sf::View 作为我的 2d 相机,所以当我单击鼠标时,我会得到我正在单击的图块的鼠标 X 和 Y 坐标

void LMButtonDown(int mX, int mY)
{
    printf("[%d][%d]\n", mX / TILE_SIZE, mY / TILE_SIZE);
}

这很好,但是一旦我将相机移动sf::View坐标,正如预期的那样,不要考虑 sf::View 偏移量。我在文档中看不到任何获取 X 或 Y 的函数, 因此我可以考虑偏移量。对此的任何帮助将不胜感激。

谢谢。

4

1 回答 1

3

看看sf::RenderTarget::mapPixelToCoords 和 mapCoordsToPixel。您可以使用此方法将坐标从“视图”空间转换为“世界”空间并返回。该文档特别提到了您的需求作为示例:

此函数查找与渲染目标的给定像素匹配的 2D 位置。换句话说,它与显卡的操作相反,即找到渲染像素的初始位置。

还有一些方法的重载版本,Vector2i它们基于 RenderTarget 获取并转换它,view而无需手动提供视图。

如果由于某种原因您不能使用(或无权访问)RenderTarget,那么您可以手动执行翻译。只要您sf::View不执行缩放或旋转(也就是说,它只执行平移),它应该非常简单。

要获得视图的左上角,只需取中心,然后减去宽度和高度的一半。然后,使用视图的左上角平移鼠标坐标。

像这样的东西:

// Somewhere else...
sf::View view;

void LMButtonDown(int mX, int mY)
{
    sf::Vector2f viewCenter = view.getCenter();
    sf::Vector2f halfExtents = view.getSize() / 2.0f;
    sf::Vector2f translation = viewCenter - halfExtents;

    mX += static_cast<int>(translation.x);
    mY += static_cast<int>(translation.y);

    printf("[%d][%d]\n", mX / TILE_SIZE, mY / TILE_SIZE);
}
于 2012-05-05T00:53:56.513 回答