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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

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

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

Если бы на экране присутствовали только круги то конечно решать задачу можно - фото 27

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

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

Введены такие типы, способствующие удобному оперированию со спрайтами:

type

TCollidelnfo = record

X, Y : Integer; // Вспомогательная запись, координаты столкновения

end;

TSprite = class // Класс спрайта

SpriteWidth : Integer; // Размеры

SpriteHeight : Integer;

FSpriteSurface : IDirectDrawSurfaceT; // Поверхность

PosX, PosY : Integer; // Позиция

Collide : BOOL; // Флаг, связанный со столкновением

function GetP.ect : TRect; // Прямоугольник, ограничивающий спрайт

function GetCenterX : Integer; // Координаты центра

function GetCenterY : Integer;

// вывод спрайта на экран

function Show (const FDDSBack : IDirectDrawSurface7) : HRESULT;

procedure CalcVector; // Инициализация направления движения

procedure Update; // Вычислить новые координаты

procedure Init (const FDD : IDirectDraw7; const fileName : PChar);

procedure Hit (const S : TSprite); // Столкновение private

Xinc : Integer; // Приращения координат

Yinc : Integer;

Collidelnfo : TCollidelnfo; // Координаты столкновения

end;

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

Обратите внимание, что в таком случае требуется формат пиксела "дочерней" поверхности задавать явно, и должен этот формат совпадать с форматом пиксела первичной поверхности. Иначе вполне может случиться так, что поверхности образов будут создаваться не 8-битными, и палитру на них установить не удастся:

const

ScreenWidth = 640;

ScreenHeight = 480;

ScreenBitDepth = 8;

NumSprites = 10; / Всего спрайтов, один из них - не круг, а фигура

var

frmDD : TfrmDD;

spr : Array [0..NumSprites - 1] of TSprite; // Массив спрайтов

PixelFormat : TDDPixelForraat; // Для согласования форматов пиксела

Значение переменной PixelFormat устанавливается после создания первичной поверхности, до инициализации системы образов:

procedure TfrmDD.FormCreate(Sender: TObject);

var

hRet : HRESULT;

ddsd : TDDSurfaceDesc2;

ddscaps : TDDSCaps2;

i : Integer;

begin

FDDPal := nil;

FDDSBack := nil;

FDDSPrimary := nil;

FDD := nil;

hRet := DirectDrawCreateEx (nil, FDD, IDirectDraw?, nil);

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

hRet := FDD.SetCooperativeLevel(Handle, DDSCL_FULLSCREEN or

DDSCL_EXCLUSIVE);

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

hRet := FDD.SetDisplayMode (ScreenWidth, ScreenHeight,

ScreenBitDepth, 0, 0);

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

ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS or DDSD_BACKBUFFERCOUNT;

ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;

dwBackBufferCount := 1;

end;

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

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

ZeroMemory(@ddscaps, SizeOf(ddscaps));

ddscaps.dwCaps := DDSCAPS_BACKBUFFER;

hRet := FDDSPrimary.GetAttachedSurface(ddscaps, FDDSBack);

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

FDDSBack._AddRef;

// Палитра должна быть считана до инициализации спрайтов

FDDPal := DDLoadPalette(FDD, 'l.bmp');

if FDDPal = nil then ErrorOut(DD_FALSE, 'DDLoadPalette');

hRet := FDDSPrimary.SetPalette(FDDPal);

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

// Определяемся с форматом пиксела первичной поверхности

ZeroMemory(SPixelFormat, SizeOf(PixelFormat));

PixelFormat.dwSize := SizeOf(PixelFormat);

hRet := FDDSPrimary.GetPixelFormat(PixelFormat);

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

Randomize;

// Первый спрайт - фигура

spr [0] := TSprite.Create; spr [0].Init (FDD, 'l.bmp');

// Остальные спрайты - сферы

for i := 1 to NumSprites --1 do begin

spr [i] := TSprite.Create;

spr (ij.Init (FDD, '2.bmp');

end;

end;

Инициализация спрайта реализована "длинным" кодом:

procedure TSprite.Init (const FDD : IDirectDraw7;

const fileName : PChar);

var

Bitmap : TBitmap;

hRet : HResult;

DC : HOC;

ddsd : TDDSurfaceDesc2;

begin

FSpriteSurface := nil;

Bitmap := TBitmap.Create;

Bitmap.LoadFromFile(fileName);

ZeroMemory(Sddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH or

DDSD_PIXELFORMAT;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

dwHeight := bitmap.Height;

dwWidth := bitmap.width;

ddpfPixelFormat := PixelFormat; // Явно задаем 8-битный формат end;

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

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

Интервал:

Закладка:

Сделать

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

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


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

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

x