Чтение онлайн

на главную - закладки

Жанры

Графика 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;

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

function TfrmDD.UpdateFraine : HRESULT;

var

hRet : HRESULT;

begin

Result := DD_FALSE;

PS.Calculate; // Пересчитываем положения частиц

// Воспроизведение состояния системы

hRet := PS.Render;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

Time := Time + 1; // Простейший эмулятор таймера

if Time > 15 then begin // Прошел срок существования системы

PS.Init(DEFAULT_SIZE, DEFAULT_POWER); // Вспышка в новом месте

Time := 0;

end;

Result := DD_OK;

end;

Полупрозрачность

Такой прием часто используется в играх. Автоматизации полупрозрачности DirectDraw не предоставляет, все необходимо делать самому разработчику, попикселно накладывая данные источника и приемника.

В общем случае формула вычисления значения цветовых компонентов выглядит так:

Result = Alpha * srcColor + (1 - Alpha) * destColor

Здесь Alpha - коэффициент прозрачности, принимающий вещественное значение в пределах от нуля до единицы; srcColor - цвет источника; destColor - цвет приемника.

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

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец