Вход/Регистрация
Графика DirectX в Delphi
вернуться

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

Шрифт:

end;

Кирпичная кладка создается "вручную", дополнительные растры не используются:

function TfrmDSD.MakeBrick : HRESULT;

var

hRet : HRESULT;

d3dlr : TD3DLOCKED_RECT;

dwDstPitch : DWORD;

X, Y, wrkStep : DWORD;

begin

wrkStep := 0;

hRet := FDSDDevice.CreateTexture (128, 128, 0, 0,

D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, FD3TextBrick);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

hRet := FD3TextBrick.LockRect(0, d3dlr, nil, 0);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;

dwDstPitch := d3dlr.Pitch;

for Y := 0 to 127 do for X := 0 to 127 do

// Горизонтальные полоски - через каждые 10 пикселов

if Y mod 10 = 0 then begin // Полоски сероватого цвета

PDWORD (DWORD(d3dlr.pBits) + Y * dwDstPitch + X * 4)^ :=

D3DCOLOR_XRGB(200 + random (30), 200+ random (30), 200+ random (30)) ;

Inc (wrkStep); // Сдвиг для вертикальных полосок

end else

// Вертикальные полоски сдвигаются через каждый ряд кладки

if (X + wrkStep) mod 20 = 0

then PDWORD (DWORD(d3dlr.pBits) + Y * dwDstPitch + X * 4)^ :=

D3DCOLOR_XRGB(200 + random (30), 200+ random (30), 200+ random (30))

// Собственно кирпичи

else PDWORD (DWORD(d3dlr.pBits) + Y * dwDstPitch + X * 4)^ :=

D3DCOLOR_XRGB{150 + Random(lOO), 80, 10);

Result := FD3TextBrick.UnlockRect(0);

end;

Квадрат воспроизводится дважды. При наложении второй текстуры включаем альфа-смешение. Все сопутствующие действия аналогичны уже рассмотренным примерам.

Спрайты в DirectSD

Итак, мы знаем все, чтобы познакомиться с альтернативным DirectDraw способом создания настоящих 2О-приложений, являющихся частным случаем ЗВ-графики. Спрайты теперь представляются в виде примитивов, на которые накладывается текстура.

В проекте каталога Ех15 реализована несложная иллюстрация такого подхода, во время работы ее по экрану меланхолично проплывают рыбки (рис. 8.13).

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

type

TFish = class // Отдельная рыбка

private

FDSTexture : IDIRECT3DTEXTURE8;

public

PosX, PosY, StepX : Single; // Позиция на экране и шаг перемещения

Scale : Single; // Масштабный множитель

function RotateTexture : HRESULT; // Поворот текстуры

function Draw : HRESULT; // Собственно отображение на экране

procedure Move; // Движение по экрану

constructor Create (const FileName : String; const ir.R, inG, inB : Byte);

destructor Destroy; override;

end;

const

NumFish = 10; // Количество рисуемых рыбок

var

Fishes : Array [0..NumFish-1] of TFish; // Массив объектов

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

constructor TFish.Create (const FileName : String;

const inR, inG, inB : Byte);

var

hRet : HRESULT;

d3dlr : TD3DLOCKED_RECT;

dwDstPitch : DWORD;

X, Y : DWORD;

Bmp, wrkBmp : TBitmap;

R, G, В : Byte;

begin

Bmp := TBitmap.Create;

Bmp.LoadFromflie (FileName);

wrkBmp := TBitmap.Create;

wrkBmp.Width := 128;

wrkBmp.Height := 128;

// Масштабирование исходного растра

wrkBmp.Canvas.StretchDraw (Rect (0, 0, 128, 128), Bmp);

hRet := frmDSD.FD3DDevice.CreateTexture (wrkBmp.Width, wrkBmp.Height,

0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, FDSTexture);

if FAILED(hRet) then begin

if Failed (hRet) then frmDSD.ErrorOut ('InitTexture', hRet);

Exit;

end;

hRet := FD3Texture.LockRect(0, d3dlr, nil, 0);

if FAILED(hRet) then begin

if Failed (hRet) then frmDSD.ErrorOut ('InitTexture', hRet);

Exit;

end;

dwDstPitch := d3dlr.Pitch; for Y := 0 to wrkBmp.Height - 1 do

  • Читать дальше
  • 1
  • ...
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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