Спрайтове и текстури
> SFML > Спрайтове и текстури
Вероятно вече сте запознати с тези термини, но нека ги дефинираме накратко.
Текстурата е изображение. Наричаме изображението "текстура" поради специфичната му роля: те се прилагат върху 2D обекти.
Спрайтът е текстуриран правоъгълник.

Зареждане на текстура
Преди да създадем какъвто и да е спрайт, имаме нужда от готова текстура. В SFML класът на текстурата се нарича sf::Texture. Тъй като единствената роля на текстурата, след като е била заредена, е да я приложи към графичния обект, почти всички методи в този клас са свързани със зареждане и актуализиране.
Най-често срещаният начин за зареждане на текстура е да се зареди от файл с изображение на диск. Това се прави от функцията loadFromFile():
Понякога функцията loadFromFile() се проваля по причини, които не са очевидни. Първо проверете съобщението за грешка, отпечатано на стандартния изход (проверете конзолата). Ако съобщението гласи, че файлът не може да се отвори, уверете се, че работната директория (това е директорията, спрямо която ще се интерпретират всички файлови пътища) е точно там, където очаквате: когато стартирате приложението от Explorer, работната директория е папката на приложението, но когато стартирате програмата си през IDE (Visual Studio, Code :: Blocks, ...), работната директория понякога е зададена на папката на проекта, обикновено това може лесно да се промени в настройките на проекта.
SFML поддържа повечето от често срещаните файлови формати на изображения. Вижте документацията на API за пълен списък.
Всички горепосочени функции за изтегляне могат да приемат един незадължителен аргумент, който ви позволява да изтеглите само част от дадено изображение.
Класът sf::IntRect епрост и удобен тип, представляващ правоъгълник. Конструкторът на класа взема горния ляв ъгъл и размерите на правоъгълника.
Ако не искате да заредите текстура от изображение, но искате да ги актуализирате незабавно от масив от пиксели, можете да създадете празна текстура и да я актуализирате по-късно.
Имайте предвид, че съдържанието на текстурата е недефинирано в този момент.
За да актуализирате пикселите на съществуваща текстура, трябва да използвате функцията update(). Може да приема различни ресурси като аргументи.
В тези примери се приема, че източниците имат същите размери като текстурата. Ако това не е така, т.е. ако искате да актуализирате само част от текстурата, тогава можете да посочите координатите на добавката. правоъгълника, който искате да актуализирате.
В допълнение, текстурата има две свойства, които влияят върху изобразяването.
Първият е изглаждане на текстурата. Изглаждането на текстура прави нейните пиксели по-малко видими (по-размазани), което може да бъде важно при мащабиране.

Тъй като антиалиасингът интерполира съседни пиксели в текстура, той може да има нежелания страничен ефект от рендиране на пиксели извън областта на текстурата. Това може да се случи, когато вашият спрайт е в координати, които не са цели числа.
Второто свойство ви позволява да повтаряте текстурата в рамките на един спрайт.

Това ще работи само ако правоъгълникът на спрайта е по-голям от текстурата, в противен случай няма да има ефект.
Добре, сега вече мога да нарисувам своя спрайт?
Да, сега можете да започнете да рисувате спрайтове.
Ако не искате вашият спрайт да представлява цялата текстура, можете да изберете правоъгълната област, която искате да вземете от текстурата:
Можете да промените цвета на спрайта. Цветът, който сте задалимодулиран (умножен) с текстурата на спрайта. Това може да се използва и за промяна на глобалната прозрачност (алфа канал) на спрайт.
Всички тези спрайтове използват една и съща текстура, но имат различни цветове:
Спрайтовете също могат да бъдат трансформирани: те имат позиция, ориентация и мащаб.
По подразбиране произходът на тези три трансформации е горният ляв ъгъл на спрайта. Ако искате да зададете началото на различно местоположение (като центъра на спрайта или различен ъгъл), можете да използвате функцията setOrigin.
Тъй като функциите за трансформация са общи за всички SFML обекти, те са обяснени в отделен урок: Трансформиране на обекти.
Проблемът с белия квадрат
Успешно сте заредили текстурата, правилно сте дефинирали спрайта и... всичко, което виждате на екрана, е бял квадрат. Защо?
Това е често срещана грешка. Когато зададете текстура за спрайт, всичко, което наистина се случва, е, че спрайтът съхранява указател към екземпляра на текстурата. По този начин, ако текстурата бъде унищожена или преместена на друго място в паметта, спрайтът ще има невалиден указател за текстура.
Този проблем възниква, когато напишете нещо подобно:
Трябва правилно да управлявате живота на текстурата, така че да продължи толкова дълго, колкото се използва от спрайтовете.
Важно е да използвате възможно най-малко текстури
Освен това използването на една текстура позволява неподвижни форми да бъдат групирани в един обект (можете да използвате само една текстура в извикване на draw()), което ще ви позволи да нарисувате този обект много по-бързо от набор от много отделни обекти. Това ще бъде разгледано по-подробно в урока Създаване на собствени обекти.базирани на масиви от върхове.
Така че, имайте това предвид, когато създавате вашите анимационни изображения или вашите тайлсетове: използвайте една текстура, ако е възможно.
Използване на sf::Texture с OpenGL
Ако използвате OpenGL, а не SFML графични обекти, все още можете да използвате sf::Texture като обвивка за текстури в OpenGL и по този начин да взаимодействате с вашите OpenGL обекти.
За да активирате sf::Texture за рисуване (еквивалентно на glBindTexture()), трябва да извикате функцията static bind():