Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 参考窗口的绝对位置上的SFML绘图_C++_Sfml - Fatal编程技术网

C++ 参考窗口的绝对位置上的SFML绘图

C++ 参考窗口的绝对位置上的SFML绘图,c++,sfml,C++,Sfml,我当前的sfml项目有一些视图。视图会更改大小和中心。我可以用数学方法计算出我想要的职位,但这似乎太费事了。是否存在我可以使用的内置函数?是的,您可以按如下方式使用(假设您有一个名为窗口的sf::RenderWindow): 如果要绘制具有自己视图的对象,请首先将窗口视图设置为该视图,然后绘制对象。如您所说,您需要覆盖。UI覆盖使用单独的渲染纹理完成。您应该将游戏分割为两个渲染目标: 游戏中物品(玩家、怪物、法术等)的渲染目标 UI的呈现目标(分数、运行状况等) 两个渲染目标也是纹理()。您

我当前的sfml项目有一些视图。视图会更改大小和中心。我可以用数学方法计算出我想要的职位,但这似乎太费事了。是否存在我可以使用的内置函数?

是的,您可以按如下方式使用(假设您有一个名为
窗口的
sf::RenderWindow
):


如果要绘制具有自己视图的对象,请首先将窗口视图设置为该视图,然后绘制对象。

如您所说,您需要覆盖。UI覆盖使用单独的渲染纹理完成。您应该将游戏分割为两个渲染目标:

  • 游戏中物品(玩家、怪物、法术等)的渲染目标
  • UI的呈现目标(分数、运行状况等)
两个渲染目标也是纹理()。您将所有内容呈现给它们,因为它们是简单的窗口。一旦将它们放在单独的纹理中,就可以使用它们在窗口内使用精灵渲染所有内容:

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::RenderTexture inGameRT;
sf::RenderTexture uiRT;
while(window.isOpen())
{
//事件循环
//现在在游戏中绘制(仅示例):
inGameRT.clear();
//向量播放器;//或其他。。。
用于(自动常量和玩家:玩家)
英格默特平局(*球员);
inGameRT.display();//别忘了
//现在绘制用户界面(仅示例):
uiRT.clear();
//std::vector uiWidgets;//或其他内容。。。
用于(自动常量和小部件:uiWidgets)
uiRT.draw(*小部件);
uiRT.display();//别忘了
//绘制完所有内容后,可以在窗口内显示两个纹理
window.clear();
sf::Sprite inGameSprite{inGameRT.getTexture()};
sf::Sprite uiSprite{uiRT.getTexture()};
窗口绘制(inGameSprite);
窗口绘制(uiSprite);
window.display();
}

sf::View
s也可以应用于
sf::RenderTarget
s.

因此您的位置不是绝对的,而是相对于窗口的。你为什么要这么做?也许有更好的解决方案,例如:用户界面。我的相机/视图随播放器移动。现在我想把记分板叠在窗户上。无论视图指向何处,它都需要始终位于窗口的一个特定部分,因此有更好的方法来实现。
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();
}