VertexArray кругов

Мне интересно, если возможно создать VertexArray кругов в SFML. Я искал ответы, но не нашел ничего, что могло бы помочь. Более того, я не понимаю той части документации SFML, где написано, что я могу создавать свои собственные сущности, я думаю, что это, возможно, то, что я хочу сделать на самом деле.

РЕДАКТИРОВАТЬ: Я хочу сделать это, потому что я должен нарисовать много кругов.

Спасибо за помощь

3 ответа

Хотя ответ @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 в нашем случае) вершина является наименьшим графическим примитивом с наименее необходимой функциональностью. Классическим примером вершин являются точка, линия, треугольник, гвад и полигон. Первые четыре действительно просты для хранения и рисования вашей видеокарты. Многоугольник может быть любой геометрической фигурой, но обрабатывать его будет тяжелее, поэтому, например, в 3D-графиках многоугольники - это треугольники.

Круг немного сложнее. Например, видеокарта не знает, сколько очков ей нужно, чтобы нарисовать ваш круг достаточно гладко. Итак, как ответил @nvoigt, существует sf::CircleShape, который создается из более примитивных вершин.

sf::CircleShape уже использует массив вершин (благодаря наследованию от sf::Shape). Там нет ничего лишнего, что вам нужно сделать.

Если у вас много кругов, попробуйте использовать sf::CircleShape сначала и только оптимизируйте, когда у вас есть реальный вариант использования, с которым вы можете сравнить свое решение.

Другие вопросы по тегам