Простой спрайт для Irrlicht
Автор: shasa
Простая реализация спрайта для Irrlicht. В примере используется только 2d графика.
Спрайт способен плавно перемещаться и изменять свою картинку.
Загрузить
Пример показывает как создать спрайт для Irrlicht.
Пример использует библиотеку irrlicht 1.4.1 поставляемую в исходных кодах.
Нажатие мышки на экране приводит к перемещению спрайта в точку нажатия мышки.
На экране отображается 3 спрайта: неподвижный, подвижный и управляемый мышкой.
Для работы примера, надо скопировать файлы из папки Docs, так как написано в readme.txt
При создании этого класса ставилась задача разработать спрайт который будет перемещаться плавно, с постоянной скоростью, не зависящей от FPS, или производительности среды выполнения. Так же спрайт должен иметь возможность для анимации. Под анимацией здесь понимается периодическая смена картинок. Спрайт описывается следующими данными:
typedef std::vector < rect <s32> > FrameRects; class SpriteData { public: ITexture* texture; // Указатель на текстуру с картинками спрайтов FrameRects* frames; // Указатель на список координат картинок спрайта в текстуре u32 hight; // Высота кадра спрайта в пикселях u32 width; // Ширина кадра спрайта в пикселях u32 period; // Скорость смены кадров SColor color; // Цвет подкрашивания };
frames - это список, каждый элемент которого содержит координаты верхнего левого и нижнего правого углов картинки со спрайтом
Для создания эффекта анимации, надо сохранить информацию о номерах кадров, которые будут отображаться один за другим, создавая такой эффект:
class ActiveFrames { public: u32 frameBegin; // Первый активный кадр u32 frameCount; // Количество активных кадров ActiveFrames (u32 begin = 0, u32 count = 1) { frameBegin = begin; frameCount = count; } };
Рассмотрим основные члены базового класса Sprite
Базовый класс спрайта содержит поля с указателями на экземпляры классов SpriteData и ActiveFrames, что даёт возможность создавать огромное количество похожих спрайтов, не тратя память на повторяющиеся данные (кроме самих указателей):
protected: SpriteData* spriteData; // Данные для рисования спрайта ActiveFrames* activeFrames; // Активные кадры position2d<s32> position; // Координаты левого верхнего угла
Каждый экземпляр класса содержит своё поле position, т.к. это поле хранит положение спрайта на экране.
В соответствии с постулатами ООП, спрайт должен рисовать себя сам:
virtual void draw (IVideoDriver* driver, u32 time = 0) { driver->draw2DImage (spriteData->texture, getPosition (time), getFrame (time) ,0 ,getColor (),true); }
Типы аргументов draw2DImage определяют, типы данных возвращаемых методами getPosition и getFrame: