SFML には基本的な図形を表すクラスがたくさんあります。
図形ごとに別々のクラスなのですが、同じ親クラスを継承している子たちです。
なので、共通している機能がたくさんあります。
共通している機能のほかに、それぞれの図形ごとに特有の機能がある、という感じです。
たとえば「円形クラス」には「半径」があるとか、
「矩形クラス」には「サイズ」があるとか、
「多角形クラス」には「辺の数」がある、などなど。
sf::CircleShape shape(50); // 緑に設定 shape.setFillColor(sf::Color(100, 250, 50));図形には縁取りをつけることができます。
sf::CircleShape shape(50); shape.setFillColor(sf::Color(150, 50, 250)); // 10ピクセルでオレンジ色の縁取りにする shape.setOutlineThickness(10); shape.setOutlineColor(sf::Color(250, 150, 100));
sf::CircleShape shape(50); // サイズ 100x100 のテクスチャを 図形に貼り付ける。 shape.setTexture(&texture); // texture is a sf::Texture shape.setTextureRect(sf::IntRect(10, 10, 100, 100));
window.draw(shape);
// サイズ 120x50 の矩形を作成 sf::RectangleShape rectangle(sf::Vector2f(120, 50)); // サイズを 100x100 に変更 rectangle.setSize(sf::Vector2f(100, 100));円形は sf::CircleShape です。
// 半径 200 の円を作成 sf::CircleShape circle(200); // 半径を 40 に変更 circle.setRadius(40); // 辺の数を 100 に設定 circle.setPointCount(100);実は正多角形の専用のクラス、というのはありません。
// 三角形 sf::CircleShape triangle(80, 3); // 正方形 sf::CircleShape square(80, 4); // 正八角形 sf::CircleShape octagon(80, 8);sf::ConvexShape クラスは最強の図形クラスです。どんな形でも作れます。
// 空の図形を用意して、 sf::ConvexShape convex; // 頂点を5つに設定 convex.setPointCount(5); // それぞれの頂点を設定 convex.setPoint(0, sf::Vector2f(0, 0)); convex.setPoint(1, sf::Vector2f(150, 10)); convex.setPoint(2, sf::Vector2f(120, 90)); convex.setPoint(3, sf::Vector2f(30, 100)); convex.setPoint(4, sf::Vector2f(0, 50));
sf::RectangleShape line(sf::Vector2f(150, 5)); line.rotate(45);幅のないライン:
sf::Vertex line[] = { sf::Vertex(sf::Vector2f(10, 10)), sf::Vertex(sf::Vector2f(150, 150)) }; window.draw(line, 2, sf::Lines);
class EllipseShape : public sf::Shape { public : explicit EllipseShape(const sf::Vector2f& radius = sf::Vector2f(0, 0)) : m_radius(radius) { update(); } void setRadius(const sf::Vector2f& radius) { m_radius = radius; update(); } const sf::Vector2f& getRadius() const { return m_radius; } virtual unsigned int getPointCount() const { // ここでは値を固定してますが、必要ならクラスの属性にしてもよいですね。 return 30; } virtual sf::Vector2f getPoint(unsigned int index) const { static const float pi = 3.141592654f; float angle = index * 2 * pi / getPointCount() - pi / 2; float x = std::cos(angle) * m_radius.x; float y = std::sin(angle) * m_radius.y; return sf::Vector2f(m_radius.x + x, m_radius.y + y); } private : sf::Vector2f m_radius; };
sf::ContextSettings settings; settings.antialiasingLevel = 8; sf::RenderWindow window ( sf::VideoMode(800, 600), "SFML shapes", sf::Style::Default, settings );