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))