Малювання 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).