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