Малювання 2D об’єктів

> SFML > Малювання 2D об'єктів

Вікно для малювання

Для малювання об'єктів за допомогою графічного модуля необхідно використовувати спеціальний клас вікна: sf::RenderWindow. Цей клас є спадкоємцем класу sf::Window і має всі методи класу батька. Все що ви вивчили про sf::Window (створення, обробка подій, налаштування частоти кадрів, змішане використання з OpenGL і т.д.), застосовується і до sf::RenderWindow.

Крім цього, sf::RenderWindow має методи, що полегшують завдання малювання об'єктів. У цьому уроці ми зосередимося на двох таких методах: clear() та draw(). Вони прості як і їх назви: clear() очищає вікно вибраним кольором, а draw() малює будь-який переданий об'єкт.

Так виглядає типовий головний цикл із вікном візуалізації (render window):

Виклик clear() перед малюванням чогось є обов'язковим, оскільки інакше, пікселі з попереднього кадру накладуться на поточний. Єдиний виняток, це коли ви перемальовує абсолютно всі пікселі у вікні.

Виклик display() так само обов'язковий, він бере всі об'єкти, віддані на малюнок (методом draw()) з останнього виклику display(), і відображає їх у вікні. Насправді об'єкти малюються не відразу у вікно, а попередньо прихований буфер. Цей буфер потім копіюється у вікно викликом display() - це називається подвійною буферизацією.

Що я тепер можу намалювати?

Тепер у вас є головний цикл готовий до малювання, давайте ж розглянемо, що і як ви можете в ньому намалювати.

SFML підтримує чотири типи об'єктів які можна намалювати: три з них одразу готові до використання (спрайти (sprites), тексти (texts) та фігури (shapes)), а четвертий є будівельним блоком для створення ваших власних об'єктів (масиви вершин)(Vertex arrays)).

Незважаючи на те, що у них є загальні властивості, кожен з цих типів об'єктів заслуговує на окремі уроки:

  • (Щойно переведу їх тут будуть посилання.. наберіться терпіння)

Малювання за кадром

SFML також забезпечує спосіб малювання текстуру, замість малювання у вікні. Для цього слід використовувати sf::RenderTexture замість sf::RenderWindow. Цей клас має такі ж методи для малювання, успадковані від їхнього спільного предка sf::RenderTarget.

Метод getTexture() повертає текстуру, доступну лише читання, тобто. Ви можете використовувати її, але не змінювати. Якщо вам необхідно її змінити перед тим, як використовувати, то скопіюйте її в інший об'єкт класу sf::Texture.

Крім того, sf::RenderTexture має ті ж самі методи, що й sf::RenderWindow для управління видами та OpenGL (див. відповідні уроки). Якщо ви використовуєте OpenGL для малювання на текстурі, можна в конструкторі вказати третій параметр, який відповідає за використання буфера глибини (depth buffer).

Малювання з потоку

SFML підтримує малювання в багатопотоковому режимі, і вам практично не потрібно нічого робити, щоб все працювало як треба. Єдина річ, яку варто пам'ятати: перед використанням вікна в іншому потоці, його необхідно деактивувати; все тому, що вікно (точніше його контекст малювання OpenGL) не може бути активним у двох потоках одночасно.

Як бачите, вам навіть не потрібно вовтузитися з активацією вікна в потоці з візуалізацією. SFML робить це автоматично за вас, коли це необхідно.

Головне пам'ятайте, що створювати вікно та обробляти його події необхідно в головному потоці (див. уроці Відкриття та керування вікном SFML).