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 の型は 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 );