Мне интересно, если возможно создать VertexArray кругов в SFML. Я искал ответы, но не нашел ничего, что могло бы помочь. Более того, я не понимаю той части документации SFML, где написано, что я могу создавать свои собственные сущности, я думаю, что это, возможно, то, что я хочу сделать на самом деле.
РЕДАКТИРОВАТЬ: Я хочу сделать это, потому что я должен нарисовать много кругов.
Спасибо за помощь
sf::CircleShape
является уже используя массив вершин (благодаря тому, что наследуется от sf::Shape
). Там нет ничего лишнего, что вам нужно сделать.
Если у вас много кругов, попробуйте использовать sf::CircleShape
сначала и только оптимизируйте, когда у вас есть реальный вариант использования, с которым вы можете сравнить свое решение.
Хотя ответ @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;
}
В дополнение к двум предыдущим ответам я попытаюсь объяснить, почему не существует VertexArray по умолчанию для окружностей.
По идеологии компьютерной графики (и SFML в нашем случае) вершина является наименьшим графическим примитивом с наименее необходимой функциональностью. Классическим примером вершин являются точка, линия, треугольник, гвад и полигон. Первые четыре действительно просты для хранения и рисования вашей видеокарты. Многоугольник может быть любой геометрической фигурой, но обрабатывать его будет тяжелее, поэтому, например, в трехмерных графиках многоугольники — это треугольники.
Круг немного сложнее. Например, видеокарта не знает, сколько очков ей нужно, чтобы нарисовать ваш круг достаточно гладко. Итак, как ответил @nvoigt, существует sf :: CircleShape, который создается из более примитивных вершин.