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

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

Жанры

Графика DirectX в Delphi

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

Шрифт:

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

function TfrmDD.RunScreenSaver : BOOL;

const

SECTION = 'Fish'; // Название секции в реестре

var

S : string;

FIniFile: TReglniFile; // Для работы с реестром

begin

FIniFile := TReglniFile.Create;

// Считываем из реестра записанное значение

Numlmages := FIniFile.Readlnteger(SECTION, 'Numlmages', Maxlmages);

S := ParamStr(l); //

Первый параметр при запуске хранителя

if Length(S) > 1 then begin

Delete (S, 1, 1); // Удаляем значок "/" S[l] := UpCase(S[1]); // Переводим в верхний регистр

if S = 'P' then begin // Режим предварительного просмотра

flgWindowed := True; // Задаем оконный режим

// Второй параметр - ссылка на окно предварительного просмотра

wrkHandie := StrToInt(ParamStr(2));

end else

if S[l] = 'C' then begin // Выбран пункт "Настройка"

with TfrmPar.Create (nil) do begin // Выводим окно параметров

tbFish.Max := Maxlmages; // Параметры ползунка

tbFish.Position := Numlmages;

ShowModal;

Numlmages := tbFish.Position; // Выбранное пользователем значение

Free; // Удаляем окно задания параметров хранителя

end;

// Записываем в реестр установленное значение параметра

FIniFile.Writelnteger (SECTION, 'Numlmages', Numlmages);

FIniFile.Free; Result := False;

Exit;

end;

end;

if Assigned (FIniFile) then FIniFile.Free;

Result := True;

end;

После выполнения данной процедуры происходит инициализация DirectDraw. Код этого процесса очень объемный, но нами разобран достаточно хорошо. Здесь устанавливается оконный либо полноэкранный режим. Единственное замечание: в отличие от предыдущих оконных приложений в настоящем примере воспроизведение осуществляется не в собственном окне, поэтому его необходимо скрыть. Сделать это можно разными способами. Я выбрал тот, что основан на использовании региона:

var

Rgn : THandle;

Rgn := CreateRectRgn (О, О, О, О); // Пустой регион

SetWindowRgn(Handle, Rgn, True); // Убираем окно

Осталось последнее, на что следует обратить внимание - фон. Как я уже говорил, он состоит из зацикленных образов, размером 200x200 пикселов. Для оптимизации я не покрываю "паркетной плиткой" экран при каждой перерисовке кадра, а создаю поверхность фона размером 1000x800 пикселов и заполняю ее только один раз, при инициализации. По ходу работы приложения на экран выводятся фрагменты этого фона, размером 640x480 пикселов, и каждый раз происходит небольшой сдвиг координат некоторого фрагмента. Вспомогательный таймер задает величину этого сдвига случайным образом.

Возможные ошибки в работе любого хранителя экрана могут привести к тяжелым последствиям для пользователя, поэтому в случае возникновения исключений при восстановлении поверхностей наш хранитель

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

function TfrmDD.RestoreAll : HRESULT;

var

i : Integer;

hRet : HRESULT;

begin

Result := FDDSPrimary._Restore;

if Succeeded (Result) then begin

if flgWindowed then begin

hRet := FDDSBack._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

end;

hRet := FDDSBackGround._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

hRet := FDDSImage._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit ;

end;

hRet := CreateFromlmage (FDDSImage, imgBlue, 200, 200);

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

hRet := Prepare; // Заполнение поверхности фона

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

// Восстановление поверхности рыбок

for i := Numlmages - 1 downto 0 do begin

hRet := Fish [i].FDDSFish._Restore;

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

Exit;

end;

end;

// Повторная инициализация

for i := 0 to Numlmages - 1 do Fish [i].Init;

end;

end;

В качестве задания введите еще один параметр хранителя: яркость либо разрешение. Иначе у некоторых пользователей появится слишком блеклая картинка.

Итак, мы создали собственный хранитель экрана. Правда, нам придется вернуться к нему, чтобы снабдить его диалоговым окном ввода пароля. Но уже сейчас мы можем сделать некоторые оптимистические выводы.

Написали мы наше приложение на Delphi, выводим четыре десятка образов, половина из которых полупрозрачна, и работает наш хранитель экрана со вполне удовлетворительной скоростью даже на маломощных видеокартах, хотя код во многих местах совершенно не оптимизирован, и мы не используем ассемблерные вставки, да и располагаются образы на отдельных поверхностях.

Проверка столкновений

Такая задача относится к разряду наиболее распространенных, и ее рассмотрения нам не обойти. Как принято в настоящей книге, ознакомимся с решением на примере конкретного проекта. Располагается этот проект в каталоге Ех09, очередная вариация на бильярдную тему: по экрану мечутся, отскакивая от стенок и друг от друга, девять сфер и одна замысловатая фигура (рис. 4.5).

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

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

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5