Четверг, 19.06.2025, 12:49
Приветствую Вас Гость | RSS
Поиск
Главная | Каталог статей | Регистрация | Вход
Direct3D. Разработка игр
Форма входа
Меню сайта

Категории каталога
Мои статьи [3]
Ваши статьи [37]
Сюда вы можете выставлять свои статьи (только для зарегистрированных пользователей)

Друзья сайта

Наш опрос
Как вам этот сайт?
Всего ответов: 188

Кто онлайн

Статистика

Главная » Статьи » Ваши статьи

Система Частиц - Часть 3: Снег

Часть 3:Снег

 
 
C++
 
class Snow : public PSystem
{
public:
     Snow(d3d::BoundingBox* boundingBox, int numParticles);
     void resetParticle(Attribute* attribute);
     void update(float timeDelta);
};
 
 
Delphi
 Snow=class(PSystem)
  public
   constructor Create(_BB:TBoundingBox;numParticles:integer);override;
   procedure ResetParticle(p:PAttribute);override;
   procedure Update(dt:single);override;
 end;
 
Конструктор:
 
C++
 
Snow::Snow(d3d::BoundingBox* boundingBox, int numParticles)
{
     _boundingBox = *boundingBox;
     _size = 0.8f;
     _vbSize = 2048;
     _vbOffset = 0;
     _vbBatchSize = 512;
 
     for(int i = 0; i < numParticles; i++)
          addParticle();
}
 
Delphi
 
constructor Snow.Create(_BB:TBoundingBox;numParticles:integer);
var
 i:integer;
begin
 inherited;
 FboundingBox:= _BB;
 Fsize:= 0.8;
 
 vbSize := 2048;
 vbOffset := 0;
 vbBatchSize := 512;
 
 for i:=0 to numParticles-1 do
          addParticle();
end;
 
Reset Particle:
 
C++
void Snow::resetParticle(Attribute* attribute)
{
     attribute->_isAlive = true;
 
     // Получить случайные значения координат X и Z снежинки
     d3d::GetRandomVector(
              &attribute->_position,
              &_boundingBox._min,
              &_boundingBox._max);
 
     // Для высоты (координаты Y) случайное значение не нужно.
     // Падение снежинок всегда начинается с верха
     // ограничивающего параллелепипеда
     attribute->_position.y = _boundingBox._max.y;
 
     // Снежинка падает вниз и слегка смещается влево
     attribute->_velocity.x = d3d::GetRandomFloat(0.0f, 1.0f) * -3.0f;
     attribute->_velocity.y = d3d::GetRandomFloat(0.0f, 1.0f) * -10.0f;
     attribute->_velocity.z = 0.0f;
 
     // Все снежинки белые
     attribute->_color = d3d::WHITE;
}
 
Delphi
 
procedure Snow.ResetParticle(p:PAttribute);
begin
 p._isAlive:= true;
 
 GetRandomVector(FboundingBox.min, FboundingBox.max, p._position);
 
 p._position.y:= FboundingBox.max.y;
 
 p._velocity.x:= GetRandomFloat(0.0, 1.0) * -3.0;
 p._velocity.y:= GetRandomFloat(0.0, 1.0) * -10.0;
 p._velocity.z:= 0.0;
 
 p._color:= $ffffffff;
 
end;
 
Update:
 
C++
void Snow::update(float timeDelta)
{
     std::list<Attribute>::iterator i;
     for(i = _particles.begin(); i != _particles.end(); i++)
     {
          i->_position += i->_velocity * timeDelta;
 
          // Точка вне ограничивающего объема?
          if(_boundingBox.isPointInside(i->_position) == false)
          {
               // Вышедшие за пределы объема частицы не
               // уничтожаются, а снова используются и
               // воскрешаются с новыми координатами
               resetParticle(&(*i));
          }
     }
}
 
Delphi
 
procedure Snow.Update(dt:single);
 function isPointInBB(_bb:TBoundingBox;p:d3dvector):Boolean;
 begin
  Result:=(p.x>_bb.max.x) or (p.x<_bb.min.x) or (p.y>_bb.max.y) or      (p.y<_bb.min.y) or
  (p.z>_bb.max.z) or (p.z<_bb.min.z);
 end;
var
 m_particle:PAttribute;
begin
 m_particle:=FParticle;
 while Assigned(m_particle) do begin
 
 D3DXVec3Add(m_particle._position, m_particle._position, D3DVec3Scale(m_particle._velocity , dt));
 
          // Точка вне ограничивающего объема?
          if(isPointInBB(FBoundingBox,m_particle._position) = true) then
 
               // Вышедшие за пределы объема частицы не
               // уничтожаются, а снова используются и
               // воскрешаются с новыми координатами
               resetParticle(m_particle);
 
  m_particle:=m_particle._next;
 end;
end;
 
С помощью такой системы вы сможете делать не только снег, но и дождь, туман, огонь, дым, фейерверк, фонтан и многое другое.
 
Если необходимы демки по статйе, то я выложу. 


Источник: http://qxray.110mb.com/
Категория: Ваши статьи | Добавил: Svake (30.06.2008) | Автор: Вячеслав
Просмотров: 1220 | Комментарии: 2 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Doom†Cross Software ® 2025
Создать бесплатный сайт с uCoz