这些问题可能有数百万,但是,当重新调整窗口大小时,我无法获得鼠标的坐标,以便它们与程序坐标系对齐。我已尝试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时,它会将矩形移动到程序认为鼠标所在的位置。当屏幕没有缩放时,它被正确校准,但是当它被改变时,矩形移动到一个不在鼠标所在位置的位置。
答案 0 :(得分:2)
如SFML的official documentation和official 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
,并且原始向量未被修改。
如果某些内容无法按预期运行,建议您仔细查看文档。