Рисунок 14.3. Окно программы Firework
Определение класса системы Firework выглядит следующим образом:
class Firework : public PSystem { public: Firework(D3DXVECTOR3* origin, int numParticles); void resetParticle(Attribute* attribute); void update(float timeDelta); void preRender(); void postRender(); };
Конструктор получает указатель на базовую точку системы и количество частиц в системе. В данном случае базовая точка— это точка в которой взрывается фейерверк.
Метод resetParticle инициализирует частицу, помещая ее в базовую точку системы и назначает ей случайный вектор скорости в сфере. Каждой частице системы Firework назначается выбираемый случайным образом цвет. Помимо этого, мы указываем, что время жизни частицы равно двум секундам.
void Firework::resetParticle(Attribute* attribute) { attribute->_isAlive = true; attribute->_position = _origin;
D3DXVECTOR3 min = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); D3DXVECTOR3 max = D3DXVECTOR3( 1.0f, 1.0f, 1.0f);
d3d::GetRandomVector( &attribute->_velocity, &min, &max);
// Нормализация для сферы D3DXVec3Normalize( &attribute->_velocity, &attribute->_velocity);
attribute->_velocity *= 100.0f;
attribute->_color = D3DXCOLOR( d3d::GetRandomFloat(0.0f, 1.0f), d3d::GetRandomFloat(0.0f, 1.0f), d3d::GetRandomFloat(0.0f, 1.0f), 1.0f);
attribute->_age = 0.0f; attribute->_lifeTime = 2.0f; // время жизни - 2 секунды }
Метод update обновляет местоположение каждой частицы и уничтожает те из ник, которые просуществовали больше заданного времени. Обратите внимание, что система не удаляет мертвые частицы. Благодаря этому, если мы захотим создать новый фейерверк, нам надо будет просто выполнить инициализацию мертвой системы фейерверка. Такой подход позволяет избежать частого создания и уничтожения частиц.
void Firework::update(float timeDelta) { std::list<Attribute>::iterator i;
for(i = _particles.begin(); i != _particles.end(); i++) { // Обновляем только живые частицы if(i->_isAlive) { i->_position += i->_velocity * timeDelta;