Рисуване на 2D обекти
> SFML > Рисуване на 2D обекти
Прозорец за рисуване
За да рисувате обекти с помощта на графичния модул, трябва да използвате специален клас прозорец: sf::RenderWindow. Този клас наследява от класа sf::Window и има всички методи на родителския клас. Всичко, което научихте за sf::Window (създаване, обработка на събития, настройка на скоростта на кадрите, смесена употреба с OpenGL и т.н.), се отнася и за sf::RenderWindow.
В допълнение, sf::RenderWindow има методи за улесняване на рисуването на обекти. В този урок ще се съсредоточим върху два такива метода: clear() и draw(). Те са толкова прости, колкото и имената им: clear() изчиства прозореца с избрания цвят, а draw() рисува всеки обект, който му е предаден.
Ето как изглежда типичен основен цикъл с прозорец за рендиране:
Извикването на clear() преди начертаване на нещо е задължително, в противен случай пикселите от предишния кадър ще се припокриват с текущия. Единственото изключение е, когато преначертаете абсолютно всеки пиксел в прозореца.
Извикването на display() също е задължително, то взема всички обекти, дадени за чертане (чрез метода draw()) след последното извикване на display(), и ги показва в прозореца. Всъщност обектите не се рисуват веднага в прозореца, а първо в скрит буфер. След това този буфер се копира в прозореца чрез извикване на display() - това се нарича двойно буфериране.
Какво мога да нарисувам сега?
Сега имате основния цикъл, готов за рисуване, нека да видим какво и как можете да рисувате в него.
SFML поддържа четири типа обекти, които можете да рисувате: три от тях са незабавно готови за използване (спрайтове (спрайтове), текстове (текстове) и фигури (форми), а четвъртият е градивен елемент за създаване на ваши собствени обекти (масиви от върхове(върхови масиви)).
Въпреки че споделят общи свойства, всеки от тези типове обекти заслужава собствен урок:
- (Веднага щом ги преведа ще има линкове тук .. имайте търпение)
Рисуване зад кадър
SFML също предоставя начин за рисуване към текстура, вместо към прозорец. За да направите това, трябва да използвате sf::RenderTexture вместо sf::RenderWindow. Този клас има същите методи за рисуване, наследени от общия им предшественик sf::RenderTarget.
Методът getTexture() връща текстура само за четене, т.е. можете да го използвате, но не го променяйте. Ако трябва да го промените, преди да го използвате, копирайте го в друг обект от класа sf::Texture.
В допълнение, sf::RenderTexture има същите методи като sf::RenderWindow за обработка на изгледи и OpenGL (вижте свързаните уроци). Ако използвате OpenGL за рисуване върху текстура, можете да посочите трети параметър в конструктора, който отговаря за използването на буфера за дълбочина.
Рисуване от конец
SFML поддържа многопоточно рисуване и не е нужно да правите много, за да работи правилно. Единственото нещо, което трябва да запомните е, че преди да използвате прозорец в друга нишка, той трябва да бъде деактивиран; това е така, защото един прозорец (по-точно неговият OpenGL контекст за рисуване) не може да бъде активен на две нишки едновременно.
Както можете да видите, дори не е нужно да се занимавате с активирането на прозореца в нишката за изобразяване. SFML прави това автоматично вместо вас, когато е необходимо.
Основното нещо, което трябва да запомните е, че трябва да създадете прозорец и да управлявате неговите събития в главната нишка (вижте урока Отваряне и управление на SFML прозорец).