Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° DirectX Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 45

Автор ΠœΠΈΡ…Π°ΠΈΠ» ΠšΡ€Π°ΡΠ½ΠΎΠ²

end;


with VPoints [i + 1] do begin // Π’Π½Π΅ΡˆΠ½ΡΡ Π³Ρ€Π°Π½ΠΈΡ†Π° диска

X := 150 + cos (Angle + i * 2 * Pi / Level) * Radius;

Y := 150 + sin (Angle + i * 2 * Pi / Level) * Radius;

Color := D3DCOLOR_XRGB(0, 0, 255); // Π‘ΠΈΠ½Π΅Π³ΠΎ Ρ†Π²Π΅Ρ‚Π°

end;


Inc (i, 2); // ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ°Ρ€Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½

until i > Level;


ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π•Ρ…25, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΎΠ²ΠΎΠ»ΠΎΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ прСдставлСн Π½Π° рис. 7.16.





Π Π°Π· ΠΌΡ‹ ΡƒΠΌΠ΅Π΅ΠΌ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π·Π°ΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ свои силы Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ классичСской Π·Π°Π΄Π°Ρ‡ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ - рисованиС ΠΏΠ»Π°ΠΌΠ΅Π½ΠΈ. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠΉΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π•Ρ…26, являСтся Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ этой Π·Π°Π΄Π°Ρ‡ΠΈ, Π²ΠΎ врСмя Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²Π½ΠΈΠ·Ρƒ экрана ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ языми ΠΏΠ»Π°ΠΌΠ΅Π½ΠΈ, Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части экрана появляСтся ΠΏΠ°Π΄Π°ΡŽΡ‰Π°Ρ горящая частица.

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ строится ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠ°ΠΌ, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π²Π°Ρ€ΡŒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ:



type

TRGB = packed record // Π—Π°ΠΏΠΈΡΡŒ Ρ†Π²Π΅Ρ‚Π°

R, G, Π’ : BYTE;

end;


const

Size =2; // Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠ°, "пиксСла"

Fade =4; // Π‘Ρ‚Π΅ΠΏΠ΅Π½ΡŒ затухания ΠΏΠ»Π°ΠΌΠ΅Π½ΠΈ

NumX = 150; // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠΎΠ² ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ

NumY = 150; // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠΎΠ² ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ

var

Fire : Array [L.NumX, L.NumY + 1] of TRGB; // Π¦Π²Π΅Ρ‚Π° ΡƒΠ·Π»ΠΎΠ² сСтки

PreF : Array [L.NumX] of TP.GB; // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ массив ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки

Angle : Single = 0.0; // для двиТСния ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ

ParticleX : Integer =0; // ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ

ParticleY : Integer = NumY;

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ функция Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Ρ†Π²Π΅Ρ‚Π° ΡƒΠ³Π»ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌΠΈ значСниями элСмСнтов массива Fire:


function TfrmDSD.DrawPix(const inX, inY : Integer) : HRESULT;

var

pVertices : PByte;

hRet : HRESULT;

begin

with VPoints [0] do begin // Π›Π΅Π²Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

X := inX * Size;

Y := 300 - inY * Size; // ΠŸΠ΅Ρ€Π΅Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ ось Y

Color := D3DCOLOR_XRGB(Fire[inX, inY + 1].R, Fire[inX, inY + 1].G,

Fire[inX, inY + 1].B);

end;


with VPoints [1] do begin // Π›Π΅Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

X := inX * Size;

Y := 300 - (inY + 1) * Size;

Color := D3DCOLOR_XRGB(Fire[inX, inY].R, Fire[inX, inY].G,

Fire[inX, inY].B); end; with VPoints [2] do begin // ΠŸΡ€Π°Π²Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

X := (inX + 1) * Size;

Y := 300 - inY * Size;

Color := D3DCOLOR_XRGB(Fire[inX + 1, inY + 1].R, Fire[inX + 1,

inY + 1].G, Fire[inX + 1, inY + 1].B);

end;


with VPoints [3] do begin // ΠŸΡ€Π°Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

X := (inX + 1) * Size;

Y := 300 - (inY + 1) * Size;

Color := D3DCOLOR_XRGB(Fire[inX + 1, inY].R, Fire[inX + 1, inY].G,

Fire[inX + 1, inY].B);

end;


hRet := FD3DVB.Lock(0, SizeOf(VPoints), pVertices, 0];

if Failed (hRet) then begin

Result := hRet;

Exit;

end;


Move (VPoints, pVertices^, SizeOf(VPoints));

hRet := FD3DVB.Unlock;

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


Result := FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

end;


Для формирования собствСнно ΠΏΠ»Π°ΠΌΠ΅Π½ΠΈ послСдняя строка инициализируСтся случайным ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠΎΠΌ красного, Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… пиксСлах Ρ†Π²Π΅Ρ‚ Π·Π°Ρ‚ΡƒΡ…Π°Π΅Ρ‚, Π° для создания эффСкта размытия языков ΠΏΠ»Π°ΠΌΠ΅Π½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ простой ΠΏΡ€ΠΈΠ΅ΠΌ с усрСднСниСм Ρ†Π²Π΅Ρ‚ΠΎΠ² сосСдних Ρ‚ΠΎΡ‡Π΅ΠΊ:


procedure TfrmD3D.DrawFire;

i, j : Integer;

f : Byte;

begin

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ послСднСй строки экрана

for i := 2 to NumX-1 do begin

f := random(255) ;

PreF[i].R := 255;

PreF[i].G := trunc (f / 1.4);

PreF[i] . := f div 2;

end;


// ЗаполняСм Π² массивС Fire послСднюю строку

// усрСднСнными значСниями сосСдних элСмСнтов

PreF '" for i := 2 to NumX - 1 do begin

Fire[i, 1}.R := (PreF[i - 1] .R 4- PreF[i 4- 1} .R + PreF[i] .R) div 3; $; Fire[i, 1].G := (PreF[i - 1] .G + PreF[i + 1] .G + PreF[i] .G) div 3; Fire[i, 1].B := (PreF[i - 1].B + PreF[i + 1].B + PreF[i].B) div 3; end;

// БмСшиваниС, усрСднСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ пиксСлов ΠΏΠΎ экрану for j := NumY - 1 downto 2 do for i := 2 to NumX - 1 do begin

Fire[i,j].R := (Fire[i-1, j].R + Fire[i+1, j].R + Fire[i,j].R +

Fire[i-1, j-1].R + Fire[i+1, j-1].R +

Fire[i, j-1].R) div 6;

Fire[i,j].G := (Fire[i-1, j].G + Fire[i+1, j].G + Fire[i,j].G +

Fire[i-1, j-1].G + Fire[i+l, j-1].G +

Fire[i, j-1].G) div 6;

Fire[i,j].B := (Fire[i-1, j].B + Fire[i+1, j].B +

Fire[i,j].B + Fire[i-1, j-1].B + Fire[i+1, j-1].B +

Fire[i, j-1].B) div 6;

end;


// ΠšΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΉ частицС for j := ParticleY - 1 to ParticleY do

for j := ParticleX - 1 to

ParticleX do begin

Fire[i, j].R := 255;

Firefi, j].G := 0;

Fire[i, j].B := 0;

end;


// Π’Ρ‹Π²ΠΎΠ΄ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠΎΠ² содСрТимого экрана

for j := 2 to NumY - 1 do

for i := 2 to NumX - 1 do

DrawPix (i - 1, j - 1) ;

// Π—Π°Ρ‚ΡƒΡ…Π°Π½ΠΈΠ΅ ΠΎΡ‚Ρ‚Π΅Π½ΠΊΠΎΠ² ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ подъСма языков ΠΏΠ»Π°ΠΌΠ΅Π½ΠΈ

for j := NumY downto 2 do

for i := 1 to NumX do begin

if Fire[i, j - 1J.R >= Fade

then Firefi, j].R = Firefi, j - 1].R- Fade

else Firefi, j].R = 0;

if Firefi, j - 1].G >= Fade

then Firefi, j].G = Firefi, j - 1].G - Fade

else Firefi, j].G = 0;

if Firefi, j - 1].B >= Fade

then Firefi, j].B = Firefi, j - 1].B - Fade

else Firefi, j].B = 0;

end;


end;


ПослСдний ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ², связанный с Ρ„Π»Π°Π³ΠΎΠΌ DSDPTJTRIANGLEFAN, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для построСния Π³Ρ€ΡƒΠΏΠΏΡ‹ связанных Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², Π½ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° здСсь Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΡŽΡ‚ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Π°Ρ‡Π΅, Ρ‡Π΅ΠΌ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ случаС: вторая, Ρ‚Ρ€Π΅Ρ‚ΡŒΡ ΠΈ пСрвая Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Ρ‚Ρ€Π΅Ρ‚ΡŒΡ, чСтвСртая ΠΈ пСрвая ассоциированы со Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ, ΠΈ Ρ‚. Π΄. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ связаны, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΠΊΡ€ΠΎΡŽ Π·ΠΎΠ½Ρ‚ΠΈΠΊΠ° ΠΈΠ»ΠΈ Π²Π΅Π΅Ρ€Π°. ΠŸΠ΅Ρ€Π²Π°Ρ Π²Π΅Ρ€ΡˆΠΈΠ½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ассоциирована с Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (рис. 7.17), Π° порядок пСрСчислСния Π²Π΅Ρ€ΡˆΠΈΠ½ особСнно Π²Π°ΠΆΠ΅Π½ для Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ интСрполяции Ρ†Π²Π΅Ρ‚ΠΎΠ² Π²Π΅Ρ€ΡˆΠΈΠ½.





По Ρ‚Π°ΠΊΠΎΠΉ схСмС ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ конусы ΠΈ ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Ρ‹, Π° для плоскостных построСний - Π²Ρ‹ΠΏΡƒΠΊΠ»Ρ‹Π΅ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ, эллипсы ΠΈ окруТности. ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° этот случай (ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…27).

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы Level Π·Π°Π΄Π°Π΅Ρ‚ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ разбиСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π°, количСство Π²Π΅Ρ€ΡˆΠΈΠ½ Π½Π°ΠΌ трСбуСтся Π½Π° ΠΏΠ°Ρ€Ρƒ большС этого значСния:


const

Level = 255;

var

VPoints : Array [0..Level + 1] of TCUSTOMVERTEX;


НСрвая Π²Π΅Ρ€ΡˆΠΈΠ½Π° массива Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊΡ€ΡƒΠ³Π°, всС Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π½Π° Π΅Π³ΠΎ Π³Ρ€Π°Π½ΠΈΡ†Π΅:



const

Step = 2 * Pi / Level;

with VPoints [0] do begin // ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° - Ρ†Π΅Π½Ρ‚Ρ€ ΠΊΡ€ΡƒΠ³Π°

Ρ… := 150;

Y := 150;

Color := D3DCOLOR_XRGB(0, 0, 0);

end;


If for i := 1 to Level + 1 do // Π’ΠΎΡ‡ΠΊΠΈ Π½Π° ΠΊΡ€Π°ΡŽ ΠΊΡ€ΡƒΠ³Π°

with VPoints [i] do begin

X := 150 + cos (Angle + i * Step) * Radius;

Y := 150 + sin (Angle + i * Step) * Radius;

Color := D3DCOLOR_XRGB(0, trunc(i * 255 / Level), 0);

end;


Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ увСличиваСтся вСс Π·Π΅Π»Π΅Π½ΠΎΠΉ ΡΠΎΡΡ‚Π°Π²Π»ΡΠ²ΡˆΠ΅ΠΉ Ρ†Π²Π΅Ρ‚Π°. Для послСднСй Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ константы Level. Π“Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Π·Π΅Π»Π΅Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° я взял для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π½Π΅ΠΊΠΎΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ экрана Ρ€Π°Π΄Π°Ρ€Π° (рис. 17.8).





ΠžΠΊΠΎΠ½Π½Ρ‹Π΅ прилоТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Direct3D, Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ ситуации ΠΏΠΎΡ‚Π΅Ρ€ΠΈ фокуса ΠΈ восстановлСния, Π½ΠΎ ΠΎΡΡ‚Π°Π»Π°ΡΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ситуация - спящий Ρ€Π΅ΠΆΠΈΠΌ. Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· этого Ρ€Π΅ΠΆΠΈΠΌΠ° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ способности воспроизвСдСния нашим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ.

Для прСдупрСТдСния Ρ‚Π°ΠΊΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ TestcooperativeLevel ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° устройства. ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ D3DERR_DEvicELOST Π² ситуации, ΠΊΠΎΠ³Π΄Π° устройство Π²Ρ‹Π²ΠΎΠ΄Π° нСдоступно, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² спящСм состоянии. Π”Ρ€ΡƒΠ³ΠΎΠ΅, ΠΊΡ€ΠΎΠΌΠ΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - DSDERF^DEVICENOTRESET, соотвСтствуСт ситуации, ΠΊΠΎΠ³Π΄Π° устройство, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Π³ΠΎΡ‚ΠΎΠ²ΠΎ, Π½ΠΎ воспроизвСдСниС Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

На ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° рассмотрим, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ прилоТСния смогли ΠΏΠ΅Ρ€Π΅ΠΆΠΈΡ‚ΡŒ спящий Ρ€Π΅ΠΆΠΈΠΌ. Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Ρ†ΠΈΠΊΠ»Π° оТидания ΠΏΡ€ΠΈΠ²Π΅Π΄ΠΈΡ‚Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π²ΠΈΠ΄Ρƒ:


if FActive then begin Inc (Frames);

// ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ состояниС устройства

hRet := FD3DDevice.TestcooperativeLevel;

if hRet = D3DERR_DEVICELOST

// БСйчас устройство Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ, воспроизвСдСниС Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ

then Exit

// Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· спящСго Ρ€Π΅ΠΆΠΈΠΌΠ°

else if Failed(hRet) then begin

// Π—Π°Π½ΠΎΠ²ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ систСму InitDSD;

InitPoints;

end;


// ВоспроизвСдСниС осущСствляСм Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Render;

...

Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· спящСго Ρ€Π΅ΠΆΠΈΠΌΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ систСму ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½.

ΠŸΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, для ΠΌΠ½ΠΎΠ³ΠΈΡ… Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ потрСбуСтся ΠΈΠΌΠ΅Π½Π½ΠΎ полноэкранный Ρ€Π΅ΠΆΠΈΠΌ, поэтому ΠΌΡ‹ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π½ΡŽΠ°Π½ΡΡ‹, связанныС с использованиСм Direct3D Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ для этой ΠΊΠ½ΠΈΠ³ΠΈ, рассмотрим особСнности Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…28) ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉΡΡ Π·Π²Π΅Π·Π΄Ρ‹. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π²Π΅Π·Π΄Π° вращаСтся Π² полноэкранном Ρ€Π΅ΠΆΠΈΠΌΠ΅.

Π£ Ρ„ΠΎΡ€ΠΌΡ‹ помСнялось Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства BorderStyle: Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΊΠ½ΠΎ прилоТСния Π½Π΅ просвСчивало, рСагируя Π½Π° Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ курсора Π²Π±Π»ΠΈΠ·ΠΈ Π³Ρ€Π°Π½ΠΈΡ†, это свойство установлСно Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ bsNone.


ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ графичСской систСмы Π½Π°ΠΌ трСбуСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ пиксСла, Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ массив содСрТит Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ checkDeviceType Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… установок Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола:


const // Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ пиксСла

К fmtFullscreenArray : Array [0..4] of DWORD =

(D3DFMT_R5G6B5,

D3DFMT_X1R5G5B5,

D3DFMTJU.R5G5B5,

D3DFMT_X8R8G8B8,

D3DFMT_A8R8G8B8) ;

var

FDSDfmtFullscreen : DWORD; // Π€ΠΎΡ€ΠΌΠ°Ρ‚ пиксСла

ScreenWidth, ScreenHeight : Integer; // Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола

HalfScreenWidth, HalfScreenHeight : Integer; // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹

d3dpp : TD3DPRESENT_PARAMETERS; // Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°, хранящая ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

function TfrmD3D.InitD3D : HRESULT;

var

iEtat : Integer;

begin

if FD3D = nil then FD3D := Direct3DCreate8(D3D_SDK_VERSION);

if FD3D = nil then begin

Result := E_FAIL;

Exit;

end;


// ΠŸΠΎΠ΄Π±ΠΈΡ€Π°Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ пиксСла для Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… установок

for iFmt := 0 to High(fmtFullscreenArray) do begin

if SUCCEEDED(FD3D.CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,

fmtFullscreenArrayliFmt], fmtFullscreenArray[iFmt], FALSE))