1. ホーム
  2. c++

[解決済み] SFML の描画プリミティブを VertexArray から取得する。

2022-02-16 09:26:01

質問

構築したVertexArrayから好きなプリミティブを描画するにはどうしたらいいですか?下の例では、「vertices」配列に2つの頂点を追加し、「window.draw(vertices, 2, sf::Lines) 」で描画しようとしていますが、エラーになります。sf::Vertex foo[] = {..}' でラインオブジェクトを作ることができるのは知っていますが、一度にすべてを初期化するのではなく、配列に頂点を追加し続けられるようにしたいのですが、どうすればいいですか?

#include <SFML/Window.hpp>
#include <SFML/OpenGL.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>

int main()
{
    // Create the main window
    sf::RenderWindow window(sf::VideoMode(640, 480), "SFML");
    sf::Clock clock;

    sf::VertexArray vertices;
    sf::Vertex vertex;

    vertex.position = sf::Vector2f(0, 0);
    vertex.color = sf::Color(100, 0, 200);
    vertices.append(vertex);
    vertex.position = sf::Vector2f(100, 100);
    vertex.color = sf::Color(100, 0, 200);
    vertices.append(vertex);

    // Start the game loop
    bool running = true;
    while (running)
    {
        // Process events
        sf::Event event;
        while (window.pollEvent(event))
        {
            // Close window: exit
            if (event.type == sf::Event::Closed)
                running = false;
        }

        window.clear(sf::Color::Black);
        window.draw(vertices,2 ,sf::Lines);

        window.display();
    }

    return 0;
}

解決方法は?

を呼び出すことができます。 vertices.setPrimitiveType(sf::Lines); を宣言した後 sf::VertexArray vertices; を表示した後、描画します。 window.draw(vertices);

あるいは、コンストラクタでプリミティブ型と点数を設定し、それらの点へのアクセスを operator[] :

sf::VertexArray line(sf::Lines, 2); //or sf::LineStrip
line[0].position = sf::Vector2f(0, 0);
line[0].color = sf::Color(100, 0, 200);
line[1].position = sf::Vector2f(100, 100);
line[1].color = sf::Color(100, 0, 200);
...
window.draw(line);

参考 enum sf::PrimitiveType , sf::VertexArray , VertexArrayチュートリアル