Михаил Краснов - Графика DirectX в Delphi

Здесь есть возможность читать онлайн «Михаил Краснов - Графика DirectX в Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика DirectX в Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика DirectX в Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Графика DirectX в Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика DirectX в Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

// Количество кадров для каждого вида монстров свое

FrameCount := FrmCount;

// Индивидуальная задержка смены кадров, передается случайное число

Delay := SprDelay;

// Прямоугольник кадра, фрагмент из ленты кадров

SetRect (rcRect, AnimFrame * SpriteWidth, 0,

AnimFrame * SpriteWidth + SpriteWidth, SpriteHeight);

Live := True;

LastTickCount := GetTickCount;

end;

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

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

В рассматриваемом примере блиттинг спрайтов на задний буфер осуществляется с флагом DDBLTFASTJDONOTWAIT, что редко для примеров этой книги.

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

Каждый спрайт снабжен методом, связанным с восстановлением потерянной поверхности, в котором по высоте спрайта определяем, с какой картинкой ассоциирован конкретный объект:

function TSprite.Restore : HRESULT;

var

DC : HOC;

hRet : HRESULT;

Image : ТImage;

begin

hRet := FSpriteSurface .__Restore;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

// Пользуемся тем, что высота трех образов различна

if SpriteHeight = 15 then Image := frmDD.ImgMoster2 else

if SpriteHeight = 22 then Image := frmDD.ImgMosterl

else Image := frmDD.ImgDead;

// Копируем нужный образ на восстанавливаемую поверхность

if FSpriteSurface.GetDC(DC) = DD__OK then begin

BitBltfDC, 0, 0, Image.Width, Image.Height, Image.Canvas.Handle,

0, 0, SRCCOPY);

FSpriteSurface.ReleaseDC(DC);

end;

Result := FSpriteSurface.SetPalette(frmDD.FDDPal);

end;

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

procedure UpdateBul;

var

wrkl, wrkJ : Integer;

begin

for wrkl := 0 to NumBullets - 2 do

if (Bullets [wrkI].PosX >= 632) or (Bullets [wrkI].PosX <= 0) or

(Bullets [wrklJ.PosY <= 0) then begin

for wrkJ := wrkl to NumBullets - 1 do // Сдвигаем содержимое массива

with Bullets [wrkJ] do begin

PosX := Bullets [wrkJ + I].PosX;

PosY := Bullets [wrkJ + l].PosY;

Xinc := Bullets [wrkJ + 1].Xinc;

Yinc := Bullets [wrkJ + l].Yinc;

end;

NumBullets := NumBullets - 1;

end;

end;

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

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

procedure TfrmDD.DeadMonster (const Number : Integer);

var

DC : HDC;

ddsd : TDDSurfaceDesc2;

begin

ZeroMemory (@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD__CAPS or DDSD_HEIGHT or DDSD_WIDTH;

dwHeight := ImgDead.Height;

dwWidth := ImgDead.Width;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

end;

with Monsters[Number] do begin

// Пересоздаем поверхность (без := nil)

FDD.CreateSurface(ddsd, FSpriteSurface, nil);

// Считаем, что ошибок не будет

FSpriteSurface.GetDC(DC);

// Конкретные числа размеров копируемого образа

BitBlt(DC, 0, 0, 100, 25, ImgDead.Canvas.Handle, О, О, SRCCOPY);

FSpriteSurface.ReleaseDC(DC);

// Ключ необходимо переустановить

DDSetColorKey (FSpriteSurface, RGB(0, 255, 0));

// Опять опираемся на конкретные числа

SpriteHeight := 25;

SpriteWidth := 25;

AnimFrame := 0;

FrameCount := 4;

Xinc := 0; // Погибший спрайт остается неподвижный

Yinc := 0;

Live := False;

end;

end;

Кадр перерисовывается непрерывно, но изменения в нем вносятся в соответствии с принятыми задержками:

function TfrmDD.UpdateFrame : HRESULT;

var

wrkl, si, s2 : Integer;

begin

GlobalThisTickCount := GetTickCount;

// Подошло время выпустить нового монстра

FDDSBack.BltFastfO, 0, FDDSBackGround, @bkRect, DDBLTFAST_WAIT);

if (GlobalThisTickCount - GlobalLastTickCount > DelayMonsters)

and (NumMonsters < High (Monsters) - 1) then begin Inc (NumMonsters);

GlobalLastTickCount := GlobalThisTickCount;

end;

// Обновить положения и воспроизвести монстров

for wrkl := 0 to NumMonsters - 1 do Monsters [wrkl].Show;

Warrior.Show; // Вывод воина поверх пролетающих, монстров

UpdateBul; // Удалить пули, вылетевшие за пределы экрана

// Обновить положения и отобразить пули

for wrkl := 0 to NumBullets - I do Bullets [wrkl].Show;

// Определить столкновение монстров и пуль

for s1 := 0 to NumMonsters - 1 do

for s2 := 0 to NumBullets - 1 do

if Monsters [s1].Live and SpritesCollidePixel (Monsters [s1],

Bullets [s2]) then begin

// Попавшая пуля перемещается за границы экрана

Bullets [s2].PosY := -10;

DeadMonster (s1); // Заменить образ монстра

end;

// Столкновения монстров, берутся в расчет только живые чудовища

for s1 := 0 to NumMonsters - 2 do

for s2 := si + 1 to NumMonsters - 1 do

if Monsters [s1].Live and Monsters [s2].Live and

SpritesCollidePixel (Monsters [si], Monsters[s2]) then begin

Monsters [si].Hit(Monsters [s2]);

Monsters [s2].Hit(Monsters [si]);

end;

Result := DDJDK;

end;

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Графика DirectX в Delphi»

Представляем Вашему вниманию похожие книги на «Графика DirectX в Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика DirectX в Delphi»

Обсуждение, отзывы о книге «Графика DirectX в Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x