【问题标题】:Get X and Y offset of sf::View获取 sf::View 的 X 和 Y 偏移量
【发布时间】:2012-05-05 00:40:52
【问题描述】:

如何获得 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 偏移量。我在Documentation 中看不到任何获取 X 或 Y 的函数 所以我可以考虑到偏移量。 对此的任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    看看sf::RenderTarget::mapPixelToCoords and 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);
    }
    

    【讨论】:

    • 非常感谢 :) 很好的解释!一个你可能会帮助我的问题,为什么当我点击[0][0] 我得到[0][0] 但是当我点击[-1][0] 我得到[0][0] 但点击[-2][0] 返回[-1][0] 如果这是有道理的,它仅在负方向(顶部和左侧)而不是底部和右侧。就像沿着 y 和 x 有两行/列 0。 :S
    • 听起来是个有趣的问题 ;) 看看所涉及的一些代码会有所帮助;我可以建议您发布一个单独的问题来概述这个最有趣的问题吗?
    猜你喜欢
    • 2014-01-18
    • 2016-12-27
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多