На этом уроке мы рассмотрим работу с текстурой на примере создания главного персонажа игры.
Приступим:)
Для начала нарисуйте персонажа сами, или скачайте на просторах интернета готового (png формат). Для себя я нашел такого вот
котика, можете поступить так же:
Картинку с персонажем поместите в папку с проектом в директорию, где находится ваш файл исходного кода – main.cpp. Но лучше, если вы создадите папку images и поместите картинку туда. В больших проектах вам так будет удобнее. Я помещу картинку в папку images и мой путь , где лежит картинка, выглядит так : C:\Users\Павел\Documents\Visual Studio 2013\Projects\sfmltest\sfmltest\images\
Эта картинка называется тайлсет, а отдельный один кот на ней – тайл. почему много котов в разных ракурсах? чтобы сделать живого персонажа. Делается это перемещением прямоугольника. Например, если кот идёт в игре вправо – наш прямоугольник смещается вниз и пока мы идем вправо пробегается по трем котам в третьей строке. таким образом получается анимация.
Получается, что наш прямоугольник (rect) имеет свои размеры , в нашем случае размер одного кота мы узнаем позже.
Вся наша картинка с кучей котов (да хоть черных львов, как хотите) – называется текстурой (texture).
А результат, который выводится на экран в текущий момент времени в зависимости от действия персонажа – это спрайт (sprite).
давайте выведем всю картинку на экран:
Первый способ – создать объект изображения, загрузить в него файл, создать объект текстуры, передать в неё объект изображения, создать объект спрайт, передать в него объект текстуры.
(Советую код не копировать, а писать вручную)
Код выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <SFML/Graphics.hpp> using namespace sf;//включаем пространство имен sf, чтобы постоянно не писать sf:: int main() { RenderWindow window(sf::VideoMode(640, 480), "Lesson 3. kychka-pc.ru"); //увеличили для удобства размер окна Image heroimage; //создаем объект Image (изображение) heroimage.loadFromFile("images/hero.png");//загружаем в него файл Texture herotexture;//создаем объект Texture (текстура) herotexture.loadFromImage(heroimage);//передаем в него объект Image (изображения) Sprite herosprite;//создаем объект Sprite(спрайт) herosprite.setTexture(herotexture);//передаём в него объект Texture (текстуры) herosprite.setPosition(50, 25);//задаем начальные координаты появления спрайта while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } window.clear(); window.draw(herosprite);//выводим спрайт на экран window.display(); } return 0; } |
Всё новое (или обновленное) имеет комментарии, всё остальное осталось не тронутым (почему не тронутым? см. предыдущий урок )
Второй вариант – напрямую загрузить в текстуру. Функция загрузки “loadFromFile(“изображение”)” имеется и у объектов Текстур.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <SFML/Graphics.hpp> using namespace sf; int main() { RenderWindow window(sf::VideoMode(640, 480), "Lesson 3. kychka-pc.ru"); //увеличили для удобства размер окна Texture herotexture;//создаем объект Texture (текстура) herotexture.loadFromFile("images/hero.png");//загружаем картинку Sprite herosprite;//создаем объект Sprite(спрайт) herosprite.setTexture(herotexture);//передаём в него объект Texture (текстуры) herosprite.setPosition(50, 25);//задаем начальные координаты появления спрайта while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } window.clear(); window.draw(herosprite);//выводим спрайт на экран window.display(); } return 0; } |
Каким из способов пользоваться? Зависит от задач. В первом случае у объекта Image есть функции, которых нет у Texture. Ну, например –
.createMaskFromColor(Color(0, 0, 0)); // Делает прозрачным, то есть убирает, нужный вам цвет в вашем изображении. Если бы кот был на синем фоне, а не прозрачном, как в нашем случае, то мы бы писали
createMaskFromColor(Color(0, 0, 255));
чтобы сделать его прозрачным в игре, т.е без каких либо квадратов вокруг него.
На этом уроке мы вывели картинку на экран, но в играх выводится по одному котику. Как вывести одного кота? Смотрите следующий урок
Для начала спасибо за уроки, начинаю постигать SFML.
По поводу урока хотел бы посоветовать сразу правильно учить работать с файлами и экономить память (я понимаю что на современных машинах её в избытке, но зачем зря тратить ресурсы?)
Чтобы на загрузке файла не вылазила ошибка, лучше сразу отлавливать неудачную попытку загрузки файла. т.е. вместо
лучше писать
ну и про экономию памяти – после создания текстуры из картинки картинка становится ненужной и её вполне можно удалить.
Но текстуру удалять нельзя, т.к. она используется дальше.
В данном случае картинка, размером 16,5 килобайт съедает почти мегабайт памяти.
Пойду читать дальше.
Привет, большое спасибо за отзыв и полезный совет!
Я думаю можно отдельно сделать урок по экономии ресурсов подобным образом, чтобы каждый для себя решил и что-либо делал или не делал по этому поводу.
Здесь же демонстрация возможностей библиотеки и какие-то идеи относительно разработки игр и геймплея.
А то как оформлять, использовать ООП, экономию ресурсов и прочее.. Мне кажется такая информация в интернете итак в избытке. Но в целом урок про исключения и вобще ресурсы надо будет как-нибудь сделать. На форуме есть раздел – “решения и советы” , вы можете туда написать этот совет и прикрепить примерный код. Людям будет полезно увидеть.
Приветствую.
З.Ы. Огромное спасибо за ресурс!!!
Остановился на 3 уроке :).
Не могу открыть файл со Спрайтами:
Failed to load image “images/chuvak.png”. Reason: Unable to open file
Менял названия, папки, место положения – пока безрезультатно.
Буду рад помощи.
привет. вроде на форуме было подобное.
может дело в правах доступа на папку?
если не получилось – напишите на форум, прикрепив свой код и желательно ссылку на сам проект.
Привет! Урок отличный, продолжай в том же духе.
Я столкнулся с такой проблемой: в Debug картинка загружается нормально, но вот в Release при запуске приложения выходит ошибка: ” Необработанное исключение в “0x0fd937ef” в “SFML_test.exe”: 0xC0000005: Нарушение прав доступа при чтении “0x676e702e”. ”
В этой части кода(то есть при загрузке картинки):
Помогите с этой проблемой.
Привет, на форуме вроде это обсуждалось. Посмотри там и если не найдешь – задавай вопрос туда)