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

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

Жанры

Графика DirectX в Delphi

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

Шрифт:

for i := 0 to NumStars - 1 do begin

// Первая группа звезд, самое медленное движение

Starsl [i].X := (Starsl [i].X + StepX);

if Starsl [i].X > ScreenWidth - 2 then Starsl [i].X := 0 else

if Starsl [i].X < 0 then Starsl [i].X := ScreenWidth - 2;

// Вторая группа звезд движется в два раза быстрее

Stars2 [i].X := (Stars2 [i].X + 2 * StepX);

if Stars2 [i].X > ScreenWidth - 2 then Stars2 [i].X := 0 else

if Stars2 [i].X < 0 then Stars2 [i].X := ScreenWidth - 2;

// Третья

группа движется в три раза быстрее

Stars3 [i].X := (Stars3 [i].X + 3 * StepX);

if Stars3 [i].X > ScreenWidth - 2 then Stars3 [i].X := 0 else

if Stars3 [i].X < 0 then Stars3 [i].X := ScreenWidth - 2;

// Аналогично по координате Y

Starsl [i].Y := (Starsl [i].Y + StepY);

if Starsl [i].Y > ScreenHeight - 2 then Starsl [i].Y := 0 else

if Starsl [i].Y < 0 then Starsl [i].Y := ScreenHeight - 2;

Stars2 [i].Y := (Stars2 [i].Y + 2 * StepY);

if Stars2 [i].Y > ScreenHeight - 2 then Stars2 [i].Y := 0 else

if Stars2 [i].Y < 0 then Stars2 [i].Y := ScreenHeight - 2;

Stars3 [i].Y := (Stars3 [i].Y + 3 * StepY);

if Stars3 [i].Y > ScreenHeight - 2 then StarsS [i].Y := 0 else

if Stars3 [i].Y < 0 then Stars3 [i].Y := ScreenHeight - 2;

end;

LastTickCount := GetTickCount;

end;

Clear;

// Очистка заднего буфера

for i := 0 to NumStars - 1 do begin // Цикл рисования звезд

FDDSBack.BltFast (Starsl [i].X, Starsl [i].Y,

FDDSImagel, nil, DDBLTFAST_WAIT);

FDDSBack.BltFast (Stars2 [i].X, Stars2 [i].Y,

FDDSImage2, nil, DDBLTFAST_WAIT);

FDDSBack.BltFast (Stars3 [i].X, Stars3 [i].Y,

FDDSImageS, nil, DDBLTFAST_WAIT);

end;

// Рисование истребителя

Result := FDDSBack.BltFast (150, 140,

FDDSFighter, nil, DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY);

end;

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

procedure TfrmDD.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if (Key = VK_ESCAPE) or (Key = VK_F12) then begin Close;

Exit;

end else

if Key = VK_LEFT then StepX := StepX + 1 else

if Key = VKJUGHT then StepX := StepX - I else

if Key = VK_UP then StepY := StepY + 1 else

if Key = VK_DOWN then StepY := StepY - 1;

// Ограничиваем углы поворота некоторыми пределами

if StepY < 1 then StepY := 1 else

if StepY > 3 then StepY := 3;

if StepX < -4 then StepX := -4 else

if StepX > 4 then StepX := 4;

// Копируем на поверхность

истребителя новое изображение

with RotateBmp (wrkBitmap, 170, 135, arctan {StepX / StepY)) do begin

DDCopyBitmap (FDDSFighter, Handle, 0, 0, Width, Height);

Free end;

end;

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

function TfrmDD.RestoreAll : HRESULT;

var

hRet : HRESULT;

begin

hRet := FDDSPrimary._Restore;

if Succeeded (hRet) then begin

hRet := FDDSFighter._Restore;

if Failed (hRet) then begin

Result := hRet; Exit;

end;

// Поворот образа истребителя на текущий угол

with RotateBmp (wrkBitmap, 170, 135, arctan (StepX / StepY)) do begin

hRet := DDCopyBitmap (FDDSFighter, Handle, 0, 0, Width, Height);

Free end;

if Failed (hRet)

then ErrorOut(hRet, 'DDCopyBitmap');

hRet := FDDSImage3._Restore;

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

Exit;

end;

hRet := DDReLoadBitmap(FDDSImage3, starBmpS);

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

hRet := FDDSImage2._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

hRet := DDReLoadBitmap(FDDSImage2, starBmp2);

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

hRet := FDDSImagel._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

hRet := DDReLoadBitmap(FDDSImage1, starBmpl);

if Failed (hRet)

then ErrorOut(hRet, 'DDReLoadBitmap');

Result := DD_OK

end else Result := hRet;

end;

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

Игра "Меткий стрелок"

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

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

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

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Боярышня Дуняша

Меллер Юлия Викторовна
1. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Дуняша

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

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

Леди для короля. Оборотная сторона короны

Воронцова Александра
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны

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

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Невест так много. Дилогия

Завойчинская Милена
Невест так много
Любовные романы:
любовно-фантастические романы
7.62
рейтинг книги
Невест так много. Дилогия

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Наследник павшего дома. Том I

Вайс Александр
1. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том I

Крещение огнем

Сапковский Анджей
5. Ведьмак
Фантастика:
фэнтези
9.40
рейтинг книги
Крещение огнем

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая