Вход/Регистрация
Графика DirectX в Delphi
вернуться

Краснов Михаил

Шрифт:

public

procedure Init (NewSize, Power : Integer); // Инициализация

procedure Calculate; // Пересчет положений частиц

function Render : HRESULT; // Отображение вспышки

private

Particle : Array [0..1000] of TParticle; // Массив частиц

Size : integer; // Размер

end;

Инициализация системы выглядит так:

procedure TParticleSystem.Init (NewSize, Power : Integer);

var

i : Integer;

X, Y : Integer; // Стартовая точка вспышки Speed : Single;

begin

Size := NewSize; // Устанавливаем размер системы

// Центр вспышки располагаем вдали от границ экрана

X := random (ScreenWidth - 80) + 40;

Y := random (ScreenHeight - 80) + 40;

for i := 0 to Size do begin // Частицы системы

Particle[i].X := X;

Particle[i].Y := Y;

Particle[i].Energy := random (MAX_ENERGY); // Энергия

Particle[i].Angle := random (360); // Угол движения

Speed := random (Power) - Power / 2;

Particle[i].SpeedX := sinAfParticle[i].Angle] * Speed;

Particle [i] . SpeedY := cosA[Particle [i] .Angle] * Speed;

Particle [i] . r := random (256); // Сине-красный цвет

Particle [i] . g := 0;

Particle[i] .b := random (256);

end;

end;

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

sinA : Array [0..360] of Single;

cosA : Array [0..360] of Single;

PS : TParticleSystem;

for j := 0 to 360 do begin // Для оптимизации, чтобы вычислять

sinA[j] := sin(j * Pi / 180); // только один раз

cosA[j] := cos(j * Pi / 180); end;

PS := TParticleSystem. Create; // Создание системы

PS.Init (DEFAULT_SIZE, DEFAULT_POWER) ; // Инициализация системы

В методе calculate класса вспышки пересчитываются текущие координаты частиц:

procedure TParticleSystem. Calculate;

var

i : Integer;

begin

for i := 0 to Size do begin

if Particle [i] .Energy > 0 then begin

Particle [i] .X := Particle [i] .X + Particle [i]. SpeedX;

// Частицы отскакивают от границ экрана

if Particle [i] .X >= ScreenWidth - 1 then begin

Particle [i ] .SpeedX :="-0.5 * Particle [i]. SpeedX;

Particle [i] .X := ScreenWidth - 1;

end;

if Particle [i] .X < 0 then begin

Particle [i] .SpeedX := -0.5 * Particle [i]. SpeedX;

Particle [i] .X := 0;

end;

Particle [i].Y := Particle [i] .Y + Particle [i] . SpeedY;

if Particle [i] .Y >= ScreenHeight - 1 then begin

Particle [i] .SpeedY := -0.3 * Particle [i] . SpeedY;

Particle[i] .Y := ScreenHeight - 1;

end;

if Particle [i] .Y < 0 then begin

Particle [i] .SpeedY := -Particle [i] . SpeedY;

Particle[i].Y := 0;

end;

Particle[i].Energy := Particle[i].Energy - 1;

Particle[i].SpeedY := Particle[i].SpeedY + 0.2;

end;

end;

end;

Самый главный для нас метод - воспроизведение частиц системы:

function TParticleSystem.Render : HRESULT;

var

i : Integer;

desc : TDDSURFACEDESC2;

hRet : HRESULT;

begin

ZeroMemory (@desc, SizeOf(desc));

desc.dwSize := SizeOf(desc);

hRet := frmDD.FDDSBack.Lock (nil, desc, DDLOCKJSAIT, 0);

if Failed (hRet) then begin Result := hRet;

Exit;

end;

// Очистка экрана

ZeroMemory (desc.IpSurface,

desc.lPitch * ScreenHeight * (ScreenBitDepth div 8));

// Заполняем пикселы в соответствии с состоянием системы частиц

for i := 0 to Size do

if (Particle[i].Energy > 0) then

PWord (Integer(desc.IpSurface) +

trunc (Particle[i].Y) * desc.lPitch +

trunc (Particle[i].X) * (ScreenBitDepth div 8))^ :=

Particle[i].B or (Particle[i].G shl 5) or (Particle[i].R shl 11);

Result := frmDD.FDDSBack.Unlock(nil) ;

end;

При каждой перерисовке экрана отображается текущее состояние системы:

  • Читать дальше
  • 1
  • ...
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: