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

时间:2015-01-31 21:49:55

标签: c++ sfml

这些问题可能有数百万,但是,当重新调整窗口大小时,我无法获得鼠标的坐标,以便它们与程序坐标系对齐。我已尝试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时,它会将矩形移动到程序认为鼠标所在的位置。当屏幕没有缩放时,它被正确校准,但是当它被改变时,矩形移动到一个不在鼠标所在位置的位置。

1 个答案:

答案 0 :(得分:2)

如SFML的official documentationofficial tutorial部分所示,您可以使用mapPixelToCoords功能将像素/屏幕坐标映射到世界坐标。

该功能的签名如下:

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&作为参数并返回sf::Vector2f,并且原始向量未被修改。

如果某些内容无法按预期运行,建议您仔细查看文档。