我想知道是否可以在 SFML 中创建一个 VertexArray 圆。我一直在寻找答案,但我没有找到任何可以帮助的东西。此外,我不理解 SFML 文档中关于我可以创建自己的实体的部分,我认为这实际上可能是我想要做的。
编辑:我想这样做,因为我必须画很多圈。
谢谢你帮助我
我想知道是否可以在 SFML 中创建一个 VertexArray 圆。我一直在寻找答案,但我没有找到任何可以帮助的东西。此外,我不理解 SFML 文档中关于我可以创建自己的实体的部分,我认为这实际上可能是我想要做的。
编辑:我想这样做,因为我必须画很多圈。
谢谢你帮助我
虽然@nvoigt 的答案是正确的,但我发现它在我的实现中使用向量很有用(有关更多详细信息,请参阅http://en.cppreference.com/w/cpp/container/vector,查找“c++ 容器”,有几种类型的容器来优化读/写时间)。
对于上述用例,您可能不需要它,但您可能在未来的实现中需要它,并考虑将其作为良好的编码实践。
#include <SFML/Graphics.hpp>
#include <vector>
int main()
{
// create the window
sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
// run the program as long as the window is open
while (window.isOpen())
{
// check all the window's events that were triggered since the last iteration of the loop
sf::Event event;
while (window.pollEvent(event))
{
// "close requested" event: we close the window
if (event.type == sf::Event::Closed)
window.close();
}
// clear the window with black color
window.clear(sf::Color::Black);
// initialize myvector
std::vector<sf::CircleShape> myvector;
// add 10 circles
for (int i = 0; i < 10; i++)
{
sf::CircleShape shape(50);
// draw a circle every 100 pixels
shape.setPosition(i * 100, 25);
shape.setFillColor(sf::Color(100, 250, 50));
// copy shape to vector
myvector.push_back(shape);
}
// iterate through vector
for (std::vector<sf::CircleShape>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
{
// draw all circles
window.draw(*it);
}
window.display();
}
return 0;
}
sf::CircleShape
已经在使用顶点数组(感谢从 继承sf::Shape
)。您无需做任何额外的事情。
如果您有很多圈子,请先尝试使用sf::CircleShape
,并且只有在您有一个可以衡量您的解决方案的真实用例时才进行优化。
除了之前的两个答案,我将尝试解释为什么没有默认的 VertexArray of circles。
根据计算机图形学(在我们的例子中是 SFML)的思想,顶点是最小的绘图原语,具有最少的必要功能。顶点的经典示例是点、线、三角形、瓜德和多边形。前四个对于您的视频卡来说非常容易存储和绘制。多边形可以是任何几何图形,但处理起来会更重,这就是为什么在 3D 图形中多边形是三角形的原因。
圆有点复杂。例如,视频卡不知道她需要多少点才能将您的圆圈画得足够光滑。因此,正如@nvoigt 回答的那样,存在一个 sf::CircleShape ,它是从更原始的顶点构建的。