我当前的sfml项目有一些观点。视图改变了大小和中心。我可以在数学上计算出我想要的位置,但这似乎太多了。是否存在我可以使用的内置函数?
答案 0 :(得分:1)
是的,您可以使用sf::RenderWindow::getDefaultView()
,如下所示(假设您有sf::RenderWindow
window
}:
// First draw all objects that you have set a view for
window.setView(yourView);
window.draw(viewObject);
window.setView(window.getDefaultView()); // Reset the view to the window's default one
// ... Set the position and all (You can do this before as well)
window.draw(yourScoreBoard);
window.display(); // You should see your views with a score board overlay that
// stays in the same place
如果要绘制具有自己视图的内容,请先将窗口视图设置为该视图,然后绘制对象。
答案 1 :(得分:0)
正如你所说,你想要一个叠加层。 UI叠加使用单独的渲染纹理完成。您应该将游戏分成两个渲染目标:
两个渲染目标也都是纹理(sf::RenderTexture
)。你将所有内容呈现给他们,因为它们是简单的窗口一旦将它们放在单独的纹理中,就可以使用它们在窗口内使用精灵渲染所有内容:
sf::RenderTexture inGameRT;
sf::RenderTexture uiRT;
while(window.isOpen())
{
// event loop
// now drawing in-game (only example):
inGameRT.clear();
// std::vector<sf::Sprite*> players; // or sth other...
for(auto const & player : players)
inGameRT.draw(*player);
inGameRT.display(); // don't forget it
// now drawing UI (only example):
uiRT.clear();
// std::vector<sf::Sprite*> uiWidgets; // or sth other...
for(auto const & widget : uiWidgets)
uiRT.draw(*widget);
uiRT.display(); // don't forget it
// Once you drawn everything, you can display two textures inside window
window.clear();
sf::Sprite inGameSprite{inGameRT.getTexture()};
sf::Sprite uiSprite{uiRT.getTexture()};
window.draw(inGameSprite);
window.draw(uiSprite);
window.display();
}
sf::View
也可以应用于sf::RenderTarget
s。