netlib.narod.ru< Назад | Оглавление | Далее >

Структура класса частиц

В качестве примера работы с классом частиц я включил в сопроводительные файлы книги проект с именем D3D_Particles. Загрузите его и следуйте вперед к созданному мной примеру класса. Код класса находится в двух файлах проекта: CParticle.cpp и CParticle.h. Вот как выглядит заголовочный файл:

class CVector
{
   public:
      float fX;
      float fY;
      float fZ;

      CVector() { fX=0.0f, fY=0.0f, fZ=0.0f; };
};

class CParticle
{
   public:
      CVector   m_vecPos;
      CVector   m_vecCurSpeed;
      CVector   m_vecAcceleration;
      CVector   m_vecGravity;
      int       m_iLife;
      int       m_iTextureStart;
      int       m_iTextureEnd;
      int       m_iTextureType;
      int       m_iTextureCur;
      int       m_iTextureSteps;
      int       m_iTextureCurStep;

      CParticle();
      ~CParticle();
      void vUpdate(void);
      bool bIsAlive(void);
      void vSetTextures(int iType, int iStart,
                        int iStop, int iSteps);
      void vSetPos(float x, float y, float z);
      void vSetAcceleration(float x, float y, float z);
      void vSetGravity(float x, float y, float z);
      void vSetSpeed(float x, float y, float z);
      void vSetLife(int iLife);
};

Класс CVector

В начале заголовочного файла расположена реализация очень простого класса вектора. Я мог бы воспользоваться для представления векторов вспомогательным классом DirectX, но предпочел создать собственный класс, чтобы обеспечить переносимость кода. Мой класс вектора используется для хранения значений X, Y и Z таких параметров частиц, как местоположение и скорость. Как видно из кода, класс является только хранилищем данных и ничем более.

Класс CParticle

Класс CParticle предназначен для хранения всей информации, необходимой системе частиц для управления отдельной частицей. Он не предназначен для управления набором частиц. Для создания системы частиц вам потребуется написать диспетчер частиц.

Члены данных

В классе частицы я объявляю несколько переменных, предназначенных для описания характеристик частицы. Вот они:

Вектор m_vecPos определяет местоположение частицы в трехмерном пространстве. Функция визуализации использует эту информацию, чтобы разместить частицу в требуемом месте экрана.

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

Вектор m_vecAcceleration определяет как будет изменяться скорость частицы в каждом такте игры. Это позволяет вам получать частицы, которые со временем будут замедляться или ускоряться.

Вектор m_vecGravity позволяет указать, как на частицу влияет гравитация. На каждом такте игры влияние гравитации суммируется со скоростью частицы. Это позволяет реализовать вызываемые гравитацией эффекты без модификации базовой скорости.

Элемент m_iLife сообщает сколько игровых тактов должно пройти, прежде чем частица станет неактивной и будет уничтожена. На каждом игровом такте значение этой переменной уменьшается на единицу. Это очень полезно для таких частиц, продолжительность жизни которых ограничена. Некоторые частицы, например, вода, могут постоянно присутствовать в игре, в то время как частицы дыма и огня обычно исчезают через какой-то период времени.

Элементы m_iTextureStart и m_iTextureEnd задают диапазон используемых для анимации частиц текстур. Класс частицы поддерживает анимацию текстур в форме задания начальной и конечной текстуры. Вы можете установить эти параметры в тех случаях, когда за время жизни частицы ее изображение изменяется. В результате можно реализовать такие замечательные спецэффекты, как дымовые следы, о которых я говорил ранее.

Элемент m_iTextureType сообщает как именно должна анимироваться текстура. Можно использовать единственную текстуру (т.е. анимация отсутствует), либо можно в цикле перебрать текстуры от начальной до конечной и остановиться. Также можно перебрать текстуры от начальной до конечной (или в обратном порядке), а затем повторять цикл анимации снова. Основное назначение этого параметра — предоставить возможность контроллировать стиль анимации текстур.

Элемент m_iTextureCur сообщает частице, какая именно текстура используется в данный момент времени.

Элемент m_iTextureSteps сообщает сколько тактов игры следует ожидать, прежде чем сменить одну текстуру на другую. Это позволяет задавать паузу в анимации текстуры на несколько тактов игры.

Элемент m_iTextureCurStep сообщает сколько еще тактов игры должно проити до смены текстуры. Отсчет начинается с 0 и идет до значения, заданного переменной m_iTextureSteps. Как только счетчик достигнет максимального значения, будет изменено значение переменной m_iTextureCur а отсчет в переменной m_iTextureCurStep начнется снова с 0.

Методы класса

Методы класса используют только что описанные члены данных для того, чтобы устанавливать, перемещать и анимировать частицы во время их жизни в игре. Вот список методов с их кратким описанием:

Функция CParticle() является конструктором класса и ее основная задача — очистить все члены данных, присвоив им значения по умолчанию.

Функция ~CParticle() — это деструктор класса, и она освобожает занятую память, когда объект класса уничтожается.

Функция vUpdate() вызывается на каждом такте игры и обновляет местоположение, скорость и состояние текстур частицы.

Функция bIsAlive() сообщает вам жива еще частица или нет. Если она возвращает 0, значит частица уже уничтожена. Если она возвращает 1 — частица еще жива. Чтобы определить, какое значение возвращать, функция проверяет значение члена данных m_iLife.

Функция vSetTextures() устанавливает информацию об анимации текстур, которая будет использоваться частицей.

Функция vSetPos() устанавливает начальное местоположение частицы.

Функция vSetAcceleration() устанавливает начальное ускорение частицы.

Функция vSetGravity() задает гравитационное воздействие на частицу.

Функция vSetSpeed() задает начальную скорость частицы.

Функция vSetLife() устанавливает период жизни частицы.

Функция CParticle::vUpdate()

Код реализации методов класса находится в файле CParticle.cpp. В нем достаточно много функций, но сравнительно сложной является только функция обновления данных. Цель этой функции — вносить требуемые изменения в состояние частицы на каждом такте игры. Это включает изменение скорости, местоположения и состояния анимации текстуры частицы. Вот как выглядит выполняющий эти действия код:

// Изменяем скорость с учетом ускорения
m_vecCurSpeed.fX += m_vecAcceleration.fX;
m_vecCurSpeed.fY += m_vecAcceleration.fY;
m_vecCurSpeed.fZ += m_vecAcceleration.fZ;
// Изменяем скорость с учетом гравитации
m_vecCurSpeed.fX += m_vecGravity.fX;
m_vecCurSpeed.fY += m_vecGravity.fY;
m_vecCurSpeed.fZ += m_vecGravity.fZ;
// Обновляем местоположение
m_vecPos.fX += m_vecCurSpeed.fX;
m_vecPos.fY += m_vecCurSpeed.fY;
m_vecPos.fZ += m_vecCurSpeed.fZ;
//
// Обновление текстуры
//
// Статическая структура
if(m_iTextureType == 0) {
   m_iTextureCur = m_iTextureStart;
}
// Покадровая анимация
else {
   m_iTextureCurStep++;
   if(m_iTextureCurStep >= m_iTextureSteps) {
      // Линейная
      if(m_iTextureType == 1) {
         if(m_iTextureCur != m_iTextureEnd) {
            m_iTextureCur++;
         }
      }
      // Циклическая прямая
      else if(m_iTextureType == 2) {
         m_iTextureCur++;
         if(m_iTextureCur > m_iTextureEnd) {
            m_iTextureCur = m_iTextureStart;
         }
      }
      // Циклическая обратная
      else if(m_iTextureType == 3) {
         m_iTextureCur--;
         if(m_iTextureCur < m_iTextureStart) {
            m_iTextureCur = m_iTextureEnd;
         }
      }
      // Сброс счетчика текстур
      m_iTextureCurStep = 0;
   }
}
// Уменьшение счетчика времени жизни
m_iLife--;

Код начинается с прибавления текущего значения ускорения частицы к ее текущей скорости. Вы должны быть осторожны, поскольку слишком большое ускорение приведет к тому, что частица очень быстро скроется из поля зрения игрока.

Следующая часть кода учитывает значение гравитации и также прибавляет его к скорости. Благодаря ей у вас есть два способа управления скоростью частицы: ускорение и гравитация. Как только вычислено результирующее значение скорости, оно прибавляется к текущему местоположению частицы. В результате частица переместится на новое место.

Следующий блок кода проверяет используемый метод анимации текстуры и соответствующим образом меняет текущую текстуру.

В коде реализованы четыре типа анимации. Первый тип — использование статической текстуры. Это означает, что в цикле анимации используется только одна, стартовая текстура и никаких изменений с ней в ходе игры не происходит.

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

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

Четвертый тип анимации — обратная циклическая анимация. Она похожа на предыдущий тип, но выполняется в обратном направлении — от конечной текстуры к начальной. Процесс повторяется в течение всей жизни частицы.

Последняя вешь, которую выполняет функция обновления, — уменьшение на единицу счетчика времени жизни частицы.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz