Окно программы Laser (Particle Gun)
Рисунок 14.4. Окно программы Laser (Particle Gun)
Определение класса системы ParticleGun выглядит следующим образом:
class ParticleGun : public PSystem { public: ParticleGun(Camera* camera); void resetParticle(Attribute* attribute); void update(float timeDelta);
private: Camera* _camera; };
Конструктор получает указатель на камеру. Это объясняется тем, что данной системе для создания частиц надо знать местоположение камеры и направление, в котором она смотрит.
Метод resetParticle устанавливает координаты частицы равными текущим координатам камеры и задает вектор скорости частицы равным умноженному на сто вектору взгляда камеры. В результате «снаряд» будет выстрелен в направлении взгляда. Изображающей снаряд частице мы назначаем зеленый цвет.
void ParticleGun::resetParticle(Attribute* attribute) { attribute->_isAlive = true;
D3DXVECTOR3 cameraPos; _camera->getPosition(&cameraPos);
D3DXVECTOR3 cameraDir; _camera->getLook(&cameraDir);
// Получаем местоположение камеры attribute->_position = cameraPos; attribute->_position.y -= 1.0f; // смещаем позицию вниз, чтобы // казалось, что мы держим оружие // в руках
// Отправляем частицу в том направлении, куда смотрит камера attribute->_velocity = cameraDir * 100.0f;
// Назначаем зеленый цвет attribute->_color = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f);
attribute->_age = 0.0f; attribute->_lifeTime = 1.0f; // время жизни - 1 секунда }
Метод update обновляет местоположение частиц и уничтожает частицы, которые прожили больше заданного времени. В самом конце функции мы просматриваем список частиц и удаляем из него все мертвые частицы.
void ParticleGun::update(float timeDelta) { std::list<Attribute>::iterator i;
for(i = _particles.begin(); i != _particles.end(); i++) { i->_position += i->_velocity * timeDelta;
i->_age += timeDelta;
if(i->_age > i->_lifeTime) // убиваем i->_isAlive = false; } removeDeadParticles(); }