鼠标输入对世界坐标不正确
Mouse input isn't correct to world coordinates
这些问题可能有数百万个,但是,当 window 重新调整大小时,我无法获取鼠标的坐标,以便它们与程序坐标系对齐。我已经尝试 mapPixelToCoords()
并使用 sf::Event::MouseButton
或 sf::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
并且原始向量没有被修改。
如果某些地方没有按预期工作,我们始终建议您仔细查看文档。
这些问题可能有数百万个,但是,当 window 重新调整大小时,我无法获取鼠标的坐标,以便它们与程序坐标系对齐。我已经尝试 mapPixelToCoords()
并使用 sf::Event::MouseButton
或 sf::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
并且原始向量没有被修改。
如果某些地方没有按预期工作,我们始终建议您仔细查看文档。