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

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

Жанры

Графика DirectX в Delphi

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

Шрифт:

procedure TfrmDD.FormCreate(Sender: TObject);

var

hRet : HRESULT;

ddsd : TDDSurfaceDesc2;

t : TextFile;

i, maxLength : Integer;

begin

FDDSWork := nil;

FDDSGround := nil;

FDDSFont := nil;

FDDSPrimary := nil;

FDD := nil;

hRet := DirectDrawCreateEx (nil, FDD, IDirectDrawV, nil);

if Failed(hRet) then ErrorOut(hRet, 'DirectDrawCreateEx');

// Уровень кооперации - нормальный

hRet := FDD.SetCooperativeLevel(Handle, DDSCL_NORMAL);

if Failed(hRet) then ErrorOut(hRet, 'SetCooperativeLevel');

ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS;

ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;

end;

hRet := FDD.CreateSurface(ddsd, FDDSPrimary, nil);

if Failed(hRet) then ErrorOut(hRet, 'Create Primary Surface');

//

Загружаем растр со шрифтом

FDDSFont := DDLoadBitmap(FDD, imageBmp, 0, 0) ;

if FDDSFont = nil then ErrorOut(hRet, 'DDLoadBitmap');

// Узнаем текущие размеры экрана

WinWidth := GetSystemMetrics(SM_CXSCREEN);

WinHeight := GetSystemMetrics(SM_CYSCREEN);

// Поверхность для запоминания подложки выводимой фразы

ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

dwWidth := WinWidth;

dwHeight := WinHeight;

end;

hRet := FDD.CreateSurface(ddsd, FDDSGround, nil);

if Failed (hRet) then ErrorOut(hRet, 'CreateSurface');

// Считываем файл словаря, находим длину самой длинной фразы

AssignFile (t, FileName);

Reset (t);

maxLength := 0;

for i := 0 to NumbLines - 1 do begin

ReadLn (t, StrList [i]);

if length (StrList [i]) > maxLength then maxLength :=

length (StrList [i]);

end;

CloseFile (t);

// Поверхность для хранения растра фразы

ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD__CAPS or DDSDJiEIGHT or DDSD_WIDTH;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

dwWidth := maxLength * 15; // Должны вместиться все фразы

dwHeight := 15;

end;

hRet := FDD.CreateSurface(ddsd, FDDSWork, nil);

if Failed (hRet) then ErrorOut(hRet, 'CreateSurface');

Randomize;

OutLiteral := StrList [random (NumbLines)]; // Генерируем первую фразу

GeneratePos; // Случайно генерируем позицию фразы на экоане

LastTickCount := GetTickCount;

end;

Для

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

procedure TfrmDD.ApplicationEventslIdle(Sender: TObject;

var Done: Boolean);

var

rcRect : TRECT;

i, X, Y : Integer;

// Вывод одного символа на вспомогательную поверхность

procedure OutChar (ch : Char; PosX : Integer);

var

chRect : TRECT;

wrkl : integer;

begin

// В растре шрифта представлены символы, начиная с пробела

wrkl := ord (ch) - 32;

chRect.Left := wrkl rriod 16 * 15; // Прямоугольник буквы в растре шрифта

chRect.Top := wrkl div 16 * 15;

chRect.Right := chRect.Left + 15;

chRect.Bottom := chRect.Top + 15;

// Вывод буквы на вспомогательную поверхность

FDDSWork.BltFast(PosX, 0, FDDSFont, @chRect, DDBLTFAST_DONOTWAIT);

end;

begin

ThisTickCount := GetTickCount;

Done := False;

// Подошло время выводить очередную строку словаря

if (ThisTickCount - LastTickCount) < Delay then

Exit;

// Ограничивающий прямоугольник

SetRect (rcRect, PosX, PosY, PosX + length (OutLiteral) * 15, PosY + 15);

// Запоминаем, что на экране находится в этом прямоугольнике

FDDSGround.BltFast(PosX, PosY, FDDSPrimary, SrcRect, DD3LTFAST_WAIT);

// Вывод строки

FDDSPrimary.BltFast(PosX, PosY, FDDSWork, @tmpRect, DDBLTFAST WAIT);

// Запоминаем текущее положение строки

X := PosX;

Y := PosY;

OutLiteral := StrList [random (NumbLines)]; // Генерация новой строки

GeneratePos; // Генерируем позицию на экране новой строки

// Подготавливаем поверхность новой строки

for i := 1 to length (OutLiteral) do

OutChar (OutLiteral [i], (i - 1) * 15);

SetRect (tmpRect, 0, 0, length (OutLiteral) * 15, 15);

// Стираем старую фразу на экране

FDDSPrimary.BltFast(X, Y, FDDSGround, SrcRect, DDBLTFAST_WAIT);

LastTickCount := GetTickCount;

end;

Итак, фраза на экране присутствует, пока выполняется код подготовки новой строки. Это очень малый промежуток времени. Конечно, некоторые строки будут потеряны, появившись и исчезнув быстрее, чем произошло обновление экрана. Для замедления процесса можно вставить вызов системной функции sleep с небольшой задержкой, но для небыстрых компьютеров это может привести к тому, что строки начнут неприятно мерцать по всему экрану.

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

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

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

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

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад