Создание игр » Featured, Уроки » Создание игры – Анимированные спрайты
Создание игры – Анимированные спрайты
Анимированные спрайты, так же, как и обычные спрайты, очень широко используются в компьютерных играх. Как следует из названия, анимированные спрайты, отличаются от обычных спрайтов тем, что содержат в себе анимацию. Помимо того, что анимированные спрайты могут использоваться для отображения героев, противников и т.д., они так же используются, например, для отображения анимированных эффектов – например, взрывов. В этом уроке я покажу вам класс анимированных спрайтов и то, как его можно использовать для создания анимационных эффектов.
Анимированный спрайт представляет из себя ни что иное, как набор обычных спрайтов, которые меняются через определённое время, что и создаёт анимацию. Это тот самый метод, который используется, например, при создании мультфильмов.
Для начала, сделаем сам класс анимированного спрайта, как обычно, он будет небольшой:
class CSpriteAnimation { std::vector<CSprite> m_vecSprites; std::vector<float> m_vecTimes; public: CSpriteAnimation(void); ~CSpriteAnimation(void); //! Добавление спрайта в анимацию void Add(const std::wstring& strTexFileName=L"", int x=0, int y=0, int sx=0, int sy=0, int pivotx=0, int pivoty=0, float fTimeToShow=.1f); //! Отрисовка анимации (указываем необходимое время) void Draw(D3DXVECTOR2 pos, float fTime, float fSize); //! Общая длина анимации float Length() const; }; |
Использовать класс анимированных спрайтов мы будем в классе взрыва:
class CExplosion { float m_fPlayTime; CSpriteAnimation m_anim; D3DXVECTOR2 m_pos; public: CExplosion(D3DXVECTOR2 pos); ~CExplosion(void); //! Апдейт взрыва void Update(float fDeltaTime); //! Отрисовка void Draw(); //! Вызрыв закончен? bool IsFinished() const; }; |
Наиболее интересны тут две функции, которые и отображают саму анимацию:
void CExplosion::Update( float fDeltaTime ) { m_fPlayTime += fDeltaTime; } void CExplosion::Draw() { m_anim.Draw(m_pos, m_fPlayTime, 2.0f/*это масштабириование спрайта*/); } |
Сама же анимация будет отображаться классом анимированного спрайта, вот как выглядит его функция отрисовки, которая и отвечает за само переключение спрайтов для получения анимации:
void CSpriteAnimation::Draw(D3DXVECTOR2 pos, float fTime, float fSize) { size_t index = 0; // ищем индекс нужного спрайта for (; index<m_vecTimes.size(); index++) { if (fTime>m_vecTimes[index]) fTime -= m_vecTimes[index]; else break; } if (index==m_vecTimes.size()) index = m_vecTimes.size()-1; // рисуем спрайт m_vecSprites[index].Draw(pos, fSize); } |
Получилось очень коротко… Но это всё, что нужно для анимации. Можете скачать проект и убедиться. Для особо ленивых предусмотрена так же уже готова дема.
Раздел: Featured, Уроки · Теги: Создание движка, Создание игр, спрайты
Игра постепенно “расцветает” на глазах. Какой урок будет следующий?
Получается для каждого анимационного объекта в игре необходимо хранить несколько текстур для образования анимации, а нельзя ли сделать проще? По моему это накладно действует на ресуры, если предположить, что в современных играх анимируются не только взрывы, но и на анимацию игрока и других объектов.
Можно хранить спрайтшиты, можно просто анимировать (перемещать/поворачивать) отдельные части спрайта и тем самым получать несложные эффекты анимации, можно собирать один большой спрайт из нескольких более мелких анимированных – способов существует множество и то, какой из них выбрать, зависит лишь от конкретной ситуации. А о памяти сильно беспокоиться не надо – современные (и даже не очень) видео-карты позволяют хранить в видео-памяти по меньшей мере десятки тысяч спрайтов среднего размера.
Спасибо за ответ! Со спрайтшитами я работал, но через механизм спрайтов directx, а можно ли этот механизм применить для вывода спрайта через вершины? Я не видел подходящей функции отрисовки части текстуры через вершины.
Можно. Через вертексы можно отрисовать любую часть текстуры.
Супер! Игра уже напоминает коммерческий продукт!