我有一个与原始窗口尺寸相同的视图(500,300)
我应用view.zoom(2)
将视图缩小一半。
现在视图居中。我想将视图移动到原始窗口的左上角。所以我把view.setCenter(500,300);
视图现在正确定位在原始窗口的上角。但现在我想旋转视图,使视图的中心位于左上角,即(0,0):view.setRotation(5);
如您所见,旋转轴的中心应为0.0但不受尊重。
问题是,如果我执行view.setCenter (0,0)
,整个视图将返回到原始窗口的中间位置。
如何解决这个问题?
答案 0 :(得分:1)
而不是使用view.setCenter(500,300);
通过view.move(x_offset, y_offset);
移动它。然后应用setCenter(...)
将不会重新定义中心,也不会重置。
我建议您咨询API reference of View以便进一步阅读。
您可能也对void sf::View::setViewport(const FloatRect& viewport)
或void sf::View::reset(const FloatRect& rectangle)
感兴趣。
答案 1 :(得分:0)
此代码由Geheim友情提供,解决了问题,并教导了一种更实用的SFML方法。
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window({500, 300}, "SFML Views", sf::Style::Close);
window.setFramerateLimit(120);
bool useViewPort {true}; // change this to false to see the other version
sf::View camera {{0, 0}, static_cast<sf::Vector2f>(window.getSize())};
if (useViewPort)
{
camera.setViewport({-0.5f, -0.5f, 1, 1});
camera.rotate(5);
}
else
camera.setCenter(camera.getSize());
camera.zoom(2);
window.setView(camera);
sf::RectangleShape background {camera.getSize()};
sf::RectangleShape square {{50, 50}};
square.setFillColor(sf::Color::Red);
sf::RenderTexture texture;
texture.create(window.getSize().x, window.getSize().y);
while (window.isOpen())
{
for (sf::Event event; window.pollEvent(event);)
if (event.type == sf::Event::Closed)
window.close();
window.clear();
if (useViewPort)
{
window.draw(background);
window.draw(square);
}
else
{
texture.clear();
texture.draw(background);
texture.draw(square);
texture.display();
sf::Sprite content {texture.getTexture()};
content.rotate(-5); // you have to rotate in the other disquareion here, do you know why?
window.draw(content);
}
window.display();
}
return EXIT_SUCCESS;
}
答案 2 :(得分:0)
我很高兴您通过使用Geheim的代码应用视口来获得您想要的结果。
但是,如果您不想使用视口来剪切窗口区域等,您仍然可以围绕中心以外的特定点旋转视图。你只需要一点点数学......
取目标点(在视图的坐标系统中)与视图中心之间的不同,并将该点旋转您想要旋转视图的量以及视图的中心周围。然后,计算这些点(目标点和旋转点)之间的差异。一旦你有这个差异,只需旋转视图(正常中心),然后按照差异移动视图。
这可能听起来很复杂,所以你可能只想使用我自动完成的这个免费功能;它在SFML Wiki上: RotateViewAt