Введение в программирование трехмерных игр с DX9

       

Окно программы 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(); }



Содержание раздела