shapes

Kształty w SFML

W SFML masz dostęp z góry do kilku typów prostych kształtów, a także nic nie stoi na przeszkodzie abyś mógł stworzyć kilka własnych. Tutaj dowiesz się jak obsługiwać potrzebne do tego klasy.

Wspólne właściwości kształtów


Przekształcenia (pozycja, skala, rotacja)

Wszystkie te przekształcenia są dostępne dla każdego z kształtów w SFML i zostały opisane w poradniku Przekształcenia kształtów.

Kolor

Aby zmienić kolor wewnątrz obiektu musisz użyć setFillColor.

Kontur

Możesz ustawić także dowolny kolor konturu figury oraz jego grubość.

 

W przypadku gdy ustawimy grubość konturu > 0 to figura się powiększa o jej grubość np jeżeli mamy koło o promieniu 10 i dodamy kontur o grubości 5 to cała figura będzie miała promień o długości 15. Jeżeli chcesz aby kontur był rysowany wewnątrz figury, czyli żeby figura nie powiększała się ustaw grubość konturu na ujemną.

 

Tekstura

Tak jak sprite’y figury mogą korzystać z tektur:

Kontur nie jest teksturowany, aby odwołać używanie tektury użyj setTexture(NULL).

 

Rysowanie kształtów


Odbywa się ono w tradycyjny sposób dla wszystkich figur.

 

Wbudowane klasy kształtów


Prostokąt

Aby narysować prostokąt musisz użyć sf::RectangleShape. Konstruktor przyjmuje jako argument jego wielkość (szerokość i wysokość).

Koło

Ta figura jest reprezentowana przez sf::CircleShape. Posiada dwa atrybuty: promień oraz opcjonalny który decyduje o tym z ilu punktów się się składa. Decyduje to o „jakości” okręgu. Im większy kształt tym więcej boków będzie potrzebował.

Wielokąty foremne

Wielokąty foremne charakteryzują się tym że powstają na okręgu i ich boki są równej długości, dzięki temu je także robimy za pomocą sf::CircleShape.

Figury wypukłe

Do rysowania figur wypukłych służy klasa sf::ConvexShape. Co musisz pamiętać przy ich rysowaniu to aby rozmieszczać kolejne punkty figury w kierunku zgodnym lub przeciwnym do wskazówek zegara, nie rób tego w sposób losowy.

SFML nie posiada klasy do rysowania figur wklęsłych, ale możesz się w tym celu posłużyć tą klasą o ile pierwszym punktem będzie środek ciężkości figury.

Linie

Linie nie mają swojego odpowiednika w SFML z prostego powodu. Jeżeli twoja linia ma jakąś grubość to jest prostokątem, jeżeli nie może być narysowana za pomocą prymitywów.

Oraz linia-prymityw:

Aby dowiedzieć się więcej o prymitywach zapraszam do poradnika o VertexArray.

 

Tworzenie własnego kształtu-klasy


Możesz poszerzyć typy kształtów o te napisane przez siebie. Aby to zrobić musisz dziedziczyć po sf::Shape i napisać 2 funkcje:

  • getPointCount do pobrania liczby punktów
  • getPoint do pobrania punktu o określonym indexie

Musisz także używać klasy update() do zaktualizowania stanu swojej figury. Poniżej jest gotowy przykład gotowej klasy rysującej elipsę.

Antyaliasing w kształtach


Czyli wygładzenie krawędzi, które możemy ustawić w ustawieniach okna

Nie każda karta graficzna może go obsługiwać, więc efekt nie musi być widoczny na każdym komputerze.

Oryginalny artykuł


  • gość

    Hmm, a da się jakoś określić na jakich współrzędnych x i y narysować np. ten prostokąt?

    Bo tak czytam i czytam, a nawet nie mam pojęcia jak poruszyć obiektem. 😛
    Dość trudna wydaję mi się ta biblioteka SFML na pierwszy rzut oka, ale mam nadzieję, że to tylko pierwsze wrażenia.
    Z góry dziękuję za pomoc.

    • Oczywiście że się da, wszystko pisze w dokumentacji, możesz napisać kod w ten sposób: http://pastebin.com/EmHcQ46x . W ten sposób narysowaliśmy prostokąt na pozycji (5,40) i wymiarach 10×30. Pozycje kolejnych wierzchołków liczymy dodając odpowiednio długość i/lub szerokość do pozycji x,y. Do poruszenia całym obiektem używamy setPosition, lub move gdy chcemy poruszyć obiekt względem obecnej pozycji.

      Biblioteka SFML jest jedną z prostszych i przyjmniejszych, użycie jej znajdziesz w moim poradniku „Piszemy grę w SFML’u”.