鼠标输入对世界坐标不正确

Mouse input isn't correct to world coordinates

这些问题可能有数百万个,但是,当 window 重新调整大小时,我无法获取鼠标的坐标,以便它们与程序坐标系对齐。我已经尝试 mapPixelToCoords() 并使用 sf::Event::MouseButtonsf::Mouse 获取鼠标坐标,但无济于事。

这个问题很可能是我的无能造成的,但我一辈子都弄不明白。另外,我需要这样做来改变一个矩形的坐标,而不是检测一个框是否被悬停,如果是的话我觉得答案会容易得多。

编辑:

Source Code:
//Standard C++:
#include <iostream>
//SFML:
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "Example");

    sf::Event event;

    sf::RectangleShape mousePoint;
    mousePoint.setSize(sf::Vector2f(1, 1));
    mousePoint.setFillColor(sf::Color::Red);

    while (window.isOpen())
    {
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed) //Close window
            {
                window.close();
                return 0;
            }
            if (event.type == sf::Event::MouseButtonPressed)
            {
                if (event.mouseButton.button == sf::Mouse::Left)
                {
                    //Get the mouse position:
                    sf::Vector2i mouse = sf::Mouse::getPosition(window);
                    //Map Pixel to Coords:
                    window.mapPixelToCoords(mouse);
                    //Set position of the mouse to the rectangle:
                    mousePoint.setPosition(mouse.x, mouse.y);
                }
            }
        }

        window.clear();
        window.draw(mousePoint);
        window.display();
    }
}

经过一番质疑,我上传了一些简单的源代码,证明了我的观点。当您单击 LMB 时,它会将矩形移动到程序认为鼠标所在的位置。当屏幕没有被缩放时,它是正确校准的,但是当它被改变时,矩形移动到一个不靠近鼠标所在位置的点。

如 SFML 的 official documentation and the official tutorial 部分所示,您可以使用 mapPixelToCoords 函数将 pixel/screen 坐标映射到世界坐标。

函数签名如下:

Vector2f sf::RenderTarget::mapPixelToCoords(const Vector2i& point) const

因此,用法看起来像这样:

//Get the mouse position:
sf::Vector2i mouse = sf::Mouse::getPosition(window);
//Map Pixel to Coords:
sf::Vecotr2f mouse_world = window.mapPixelToCoords(mouse);
//Set position of the mouse to the rectangle:
mousePoint.setPosition(mouse_world);

换句话说,mapPixelToCoords函数接受一个const sf::Vector2i&作为参数,returns一个sf::Vector2f并且原始向量没有被修改。

如果某些地方没有按预期工作,我们始终建议您仔细查看文档。