SFML绘制在绝对位置上参考窗口

时间:2018-02-26 19:09:40

标签: c++ sfml

我当前的sfml项目有一些观点。视图改变了大小和中心。我可以在数学上计算出我想要的位置,但这似乎太多了。是否存在我可以使用的内置函数?

2 个答案:

答案 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叠加使用单独的渲染纹理完成。您应该将游戏分成两个渲染目标:

  • 游戏内物品(玩家,怪物,法术等)的渲染目标。
  • 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。