Уроки Коммент.

Создание игр » 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);
}

Получилось очень коротко… Но это всё, что нужно для анимации. Можете скачать проект и убедиться. Для особо ленивых предусмотрена так же уже готова дема.

»crosslinked«

Ещё по этой теме:




Раздел: Featured, Уроки · Теги: Создание движка, Создание игр, спрайты

6 комментариев на "Создание игры – Анимированные спрайты"
  1. Scripter пишет:

    Игра постепенно “расцветает” на глазах. Какой урок будет следующий?

  2. Сергей пишет:

    Получается для каждого анимационного объекта в игре необходимо хранить несколько текстур для образования анимации, а нельзя ли сделать проще? По моему это накладно действует на ресуры, если предположить, что в современных играх анимируются не только взрывы, но и на анимацию игрока и других объектов.

    1. Вячеслав пишет:

      Можно хранить спрайтшиты, можно просто анимировать (перемещать/поворачивать) отдельные части спрайта и тем самым получать несложные эффекты анимации, можно собирать один большой спрайт из нескольких более мелких анимированных – способов существует множество и то, какой из них выбрать, зависит лишь от конкретной ситуации. А о памяти сильно беспокоиться не надо – современные (и даже не очень) видео-карты позволяют хранить в видео-памяти по меньшей мере десятки тысяч спрайтов среднего размера.

      1. Сергей пишет:

        Спасибо за ответ! Со спрайтшитами я работал, но через механизм спрайтов directx, а можно ли этот механизм применить для вывода спрайта через вершины? Я не видел подходящей функции отрисовки части текстуры через вершины.

        1. Вячеслав пишет:

          Можно. Через вертексы можно отрисовать любую часть текстуры.

  3. Shadow пишет:

    Супер! Игра уже напоминает коммерческий продукт! :)

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>