SFML 视图与 window 混淆
SFML Views vs window confusion
我有这个 C++/SFML 代码...
#include <SFML/Graphics.hpp>
#define windowWidth 600
#define windowHeight 300
int main()
{
sf::RenderWindow window(sf::VideoMode(windowWidth, windowHeight), "SFML Views");
sf::View view(sf::FloatRect(0,0, windowWidth, windowHeight));
view.zoom(2);
window.setView(view);
sf::RectangleShape back (sf::Vector2f(windowWidth, windowHeight));
back.setFillColor(sf::Color::White);
sf::RectangleShape rect (sf::Vector2f(200, 100));
rect.setFillColor(sf::Color::Red);
rect.setPosition(windowWidth - rect.getSize().x, windowHeight - rect.getSize().y); // position in the lower right corner
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(back);
window.draw(rect);
window.display();
}
return 0;
}
...这可能会将红色矩形定位在 window.
的右下角
但是,当我放大视图时(如代码中所示),它显然像 this image 一样随着整个 window 移动。
我有些疑惑:
- 为了修正红色矩形的位置,将其放在全局的右下角window,我目前需要做一些考虑缩放因子、原始矩形大小等的计算。有没有将此矩形定位在全局 window?
右下角的任何更简单的方法
- 如何防止某些对象因视图缩放而改变大小?
- 我需要做什么才能在同一个 window 中拥有多个活动视图?
Is there any easier way to position this rectangle in the lower-right corner of the global window?
来自 SFML 2D camera tutorial:"To draw something using a view, you must draw it after calling the setView function of the target to which you are drawing"
所以绘图部分应该是
window.clear();
window.setView(view);
window.draw(back);
window.setView(window.getDefaultView()); //don't zoom red rect
window.draw(rect);
window.display();
What do I have to do to have multiple active views in the same window?
只需为每个活动视图调用 setView()
,然后绘制该视图中的所有内容(再次,如果需要)
window.setView(leftHalfView);
window.draw(a);
window.draw(b);
window.draw(c);
window.setView(rightHalfView);
window.draw(a);
window.draw(b);
window.draw(c);
window.setView(minimap);
window.draw(a);
window.draw(b);
window.setView(window.getDefaultView());
window.draw(x);
window.draw(y);
我有这个 C++/SFML 代码...
#include <SFML/Graphics.hpp>
#define windowWidth 600
#define windowHeight 300
int main()
{
sf::RenderWindow window(sf::VideoMode(windowWidth, windowHeight), "SFML Views");
sf::View view(sf::FloatRect(0,0, windowWidth, windowHeight));
view.zoom(2);
window.setView(view);
sf::RectangleShape back (sf::Vector2f(windowWidth, windowHeight));
back.setFillColor(sf::Color::White);
sf::RectangleShape rect (sf::Vector2f(200, 100));
rect.setFillColor(sf::Color::Red);
rect.setPosition(windowWidth - rect.getSize().x, windowHeight - rect.getSize().y); // position in the lower right corner
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(back);
window.draw(rect);
window.display();
}
return 0;
}
...这可能会将红色矩形定位在 window.
的右下角但是,当我放大视图时(如代码中所示),它显然像 this image 一样随着整个 window 移动。 我有些疑惑:
- 为了修正红色矩形的位置,将其放在全局的右下角window,我目前需要做一些考虑缩放因子、原始矩形大小等的计算。有没有将此矩形定位在全局 window? 右下角的任何更简单的方法
- 如何防止某些对象因视图缩放而改变大小?
- 我需要做什么才能在同一个 window 中拥有多个活动视图?
Is there any easier way to position this rectangle in the lower-right corner of the global window?
来自 SFML 2D camera tutorial:"To draw something using a view, you must draw it after calling the setView function of the target to which you are drawing"
所以绘图部分应该是
window.clear();
window.setView(view);
window.draw(back);
window.setView(window.getDefaultView()); //don't zoom red rect
window.draw(rect);
window.display();
What do I have to do to have multiple active views in the same window?
只需为每个活动视图调用 setView()
,然后绘制该视图中的所有内容(再次,如果需要)
window.setView(leftHalfView);
window.draw(a);
window.draw(b);
window.draw(c);
window.setView(rightHalfView);
window.draw(a);
window.draw(b);
window.draw(c);
window.setView(minimap);
window.draw(a);
window.draw(b);
window.setView(window.getDefaultView());
window.draw(x);
window.draw(y);