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

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

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

Attenuation0 := 1.0;

Attenuationl := 0.0;

Attenuation2 := 0.0;

Range := 2.5;

end;


with FD3DDevice do begin SetLight(0, LightO);

SetLight(l, Lightl);

SetLight(2, Light2);

LightEnable(0, True);

LightEnable(1, True);

LightEnable (2, True);

end;


end;


ВсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ сцСны, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠΎΠ², ΠΎΡΠ²Π΅Ρ‰Π°ΡŽΡ‚ΡΡ трСмя источниками свСта. ΠŸΡ€ΠΈ воспроизвСдСнии Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠΎΠ² Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ источник Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ.

ΠŸΡ€ΠΈ воспроизвСдСнии сцСны Π³ΠΎΠ»ΠΎΠ²Ρƒ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ "ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ" Π² Ρ‚ΠΎΡ‡ΠΊΡƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π΅Π³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ полоТСнию Π² пространствС, ΠΈ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π΅Π΅ Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ RotY:


procedure TfrmDSD.DrawScene;

var

i : Integer;

matView : TD3DMatrix;

begin

// Видовая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°, Π² соотвСтствии с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠ°

SetViewMatrix(matView, D3DVector(XPos, 0.25, ZPos).,

D3DVector (XPos + cos (RotY) ,* 0.25 + Lookupdown,

ZPos - sin (RotY)), ZVector);

with FD3DDevice do begin

SetTransform(D3DTS_VIEW, matView);

SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

SetRenderState(D3DRS_LIGHTING, DWORD (True));

end;


// ΠŸΡ€ΠΈ нСобходимости Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

FPS if flgFPS then DrawLetters; // РисуСм Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠΎΠ²

DrawManl; // ΠšΡ€Π°ΡΠ½Ρ‹ΠΉ

DrawMan2; // Π‘ΠΈΠ½ΠΈΠΉ

DrawMan3; // Π—Π΅Π»Π΅Π½Ρ‹ΠΉ

// ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€ΠΈΡΠΎΠ²Π°Π½ΠΈΡŽ стСн

with FD3DDevice do begin

// Π£Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ освСщСниС

SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);

// ΠŸΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΡŽ тСкстур

SetTextureStageState(0,D3DTSS_MAGFILTER, D3DTEXF_LINEAR);

SetTextureStageState(0,D3DTSS_MINFILTER, D3DTEXF_LINEAR);

// He ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄ΠΈΡ„Ρ„ΡƒΠ·ΠΈΡŽ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² окруТСния

SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);

SetRenderState(D3DRS_AMBIENT, $OOOFOFOF);

// Π—Π°Π΄Π°Π΅ΠΌ Π±Π΅Π»Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»

SetMaterial(MaterialWhite);

// НаправляСм ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π° Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½ описания ΠΌΠΈΡ€Π°

SetStreamSource(0, FD3DVB, SizeOf(TNormDiffTextVertex));

SetVertexShader(D3DFVF_NORMDIFFTEXTVERTEX);

// ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² Π·Π°Π΄Π°Π½Ρ‹ Π² глобальной систСмС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚

SetTransform(D3DTS_WORLD, IdentityMatrix);

end;


// Π¦ΠΈΠΊΠ» Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² окруТСния

for i := 0 to NumTriangles - 1 do with FDSDDevice do begin

// УстанавливаСм Π½ΡƒΠΆΠ½ΡƒΡŽ тСкстуру Π² соотвСтствии с описаниСм

SetTexture(0, FD3DTextures[World [i].NumTexture]);

DrawPrimitive(D3DPT_TRIANGLELIST, i * 3, 1); // Π’Ρ‹Π²ΠΎΠ΄ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

end;


FD3Ddevice.SetTexture(0, nil); // ВСкстура большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ

end;


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π·Π°Π΄Π°Π½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ тСкстур, Ρ‚Π°ΠΊ называСмая билинСйная Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ. Π‘Π΄Π΅Π»Π°Π½ΠΎ это для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊ ящику ΠΈ стСнам Π½Π΅ ΠΏΡ€ΠΎΡΠ²Π»ΡΠ»Π°ΡΡŒ Π±Π»ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ тСкстур, Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡŒ Π±Ρ‹ крупнозСрнистым.

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ использованиС интСрполяции сущСствСнно сниТаСт Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния, поэтому ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΅Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊ повСрхности, ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ тСкстурой. Π”Ρ€ΡƒΠ³ΠΎΠΉ способ достиТСния ΠΌΠ΅Π»ΠΊΠΎΠΉ зСрнистости - использованиС Ρ‡Π΅Ρ€Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ…ΡΡ тСкстур. Π’ зависимости ΠΎΡ‚ расстояния Π΄ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π° Π½Π΅Π³ΠΎ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ тСкстуры Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’Π°ΠΊΠΆΠ΅ я Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π°ΠΏΠΎΠΌΠ½Π΅Π½Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ состояний.

Π’Ρ€ΠΈ Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ°, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π° сцСнС, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π·Π°ΠΊΠΎΠ½Π°ΠΌ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ, ΠΎΠ΄Π΅Ρ‚Ρ‹ΠΉ Π² ΠΊΡ€Π°ΡΠ½ΡƒΡŽ Ρ„ΡƒΡ‚Π±ΠΎΠ»ΠΊΡƒ, бСспрСрывно ΠΊΡ€ΡƒΠΆΠΈΡ‚ Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ†Π΅Π½Ρ‚Ρ€Π° ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹:


procedure TfrmD3D.MoveManl;

begin

// ΠŸΠΎΠ²ΠΎΡ€ΠΎΡ‚ Π²ΠΎΠΊΡ€ΡƒΠ³ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ оси

SetRotateYMatrix (rotManl, Angle + Pi);

// ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΡ€ΡƒΠ³Ρƒ

transManl._41 := cos (-Angle) / 2;

transManl._43 := sin(-Angle) / 2;

// ΠžΠΏΠΎΡ€Π½Π°Ρ трансформация ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ°

matManl := MatrixMul(transManl, MatrixMul(rotManl, matWrkl));

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡Π΅ΠΊ пСрСсСкаСт ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ, появляясь ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ стСны ΠΈ исчСзая Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ:


procedure TfrmD3D.MoveMan2;

begin

// ИзмСнСниС Π₯-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹

transMan2._41 := transMan2._41 - 0.01;

// ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹ процСсс начинаСтся сначала

if transMan2._41 < -3.1 then transMan2._41 := 3.1;

matMan2 := MatrixMul(transMan2, matWrk2);

Π’Ρ€Π΅Ρ‚ΠΈΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡Π΅ΠΊ Π½Π°Π·ΠΎΠΉΠ»ΠΈΠ²ΠΎ прСслСдуСт ΠΈΠ³Ρ€ΠΎΠΊΠ°, пСрСмСщаСтся Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŽ, всСгда Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡΡΡŒ ΠΊ Π½Π΅ΠΌΡƒ Π»ΠΈΡ†ΠΎΠΌ:


procedure TfrmD3D.MoveMan3;

var

wrkAngle : Single;

distX, distZ : Single;

begin

// Расстояния Π΄ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°

distX := XPos - ΠœΠ°ΠΏΠ—Π ΠΎΠ·Π₯;

distZ := ZPos - ManSPosZ;

// ВычисляСм ΡƒΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ°

if distZ < 0

then wrkAngle := arctan (distX / distZ) - Pi / 2 else

wrkAngle := arctan (distX / distZ) + Pi / 2; // Π Π°Π·Π²ΠΎΡ€ΠΎΡ‚ Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ° Π»ΠΈΡ†ΠΎΠΌ ΠΊ ΠΈΠ³Ρ€ΠΎΠΊΡƒ

SetRotateYMatrix (rotMan3, wrkAngle);

// Если Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡Π΅ΠΊ ΡƒΠ΄Π°Π»Π΅Π½ ΠΎΡ‚ зритСля, Ρ‚ΠΎ двигаСтся,Π² Π΅Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ

if (abs(distX) > 0.02) and (abs (distZ) > 0.02) then begin

ΠœΠ°ΠΏΠ—Π ΠΎΠ·Π₯ := МаnΠ—Π ΠΎΠ·Π₯ + distX / 20; // НовоС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ°

Man3PosZ := Man3PosZ + distZ / 20;

transMan3._41 := МаnΠ—Π ΠΎΠ·Π₯;

transMan3._43 := Man3PosZ;

end;


// ΠžΠΏΠΎΡ€Π½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ°

matMan3 := MatrixMul(transManS, MatrixMul(rotMan3, matWrk2));

Для упрощСния вычислСний я позволяю Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ°ΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ сквозь прСпятствия ΠΈ Π΄Ρ€ΡƒΠ³ Ρ‡Π΅Ρ€Π΅Π· Π΄Ρ€ΡƒΠ³Π°. Код прСдотвращСния этих ситуаций ΠΎΡ‡Π΅Π½ΡŒ прост, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ отслСТиваниСм Ρ‚Π°ΠΊΠΈΡ… ситуаций.

Для Π²Ρ‹Π²ΠΎΠ΄Π° значСния FPS Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ символов Ρ†ΠΈΡ„Ρ€ ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ мною Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» numbers.txt. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° piaceLetter опрСдСляСт Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ количСство Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² для Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ символа:


procedure TfrmD3D.DrawLetters;

var

i : Integer; nS, nW : Integer;

begin

with FDSDDevice do begin

// НСкоторыС Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ построСны ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой

SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

//НС Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° освСщСниС

SetRenderState(D3DRS_LIGHTING, DWORD (False));

// НаправляСм ΠΏΠΎΡ‚ΠΎΠΊ Π½Π° Π±ΡƒΡ„Π΅Ρ€ символов

SetStreamSource(0, FD3DVBLetter, SizeOf(TNormVertex));

SetVertexShader(D3DFVF_NORMVERTEX);

end;


// Π¦ΠΈΠΊΠ» Π²Ρ‹Π²ΠΎΠ΄Π° Π² пространствС символов FPS for i := 1 to Length(FpsOut) do begin

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² символа

PiaceLetter (FpsOut[i], nS, nW);

// БдвигаСмся Π² пространствС для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ символа

LetTrans._41 := i * 0.1;

FD3DDevice.SetTransform(D3DTS_WORLD, LetTrans);

FD3DDevice.DrawPrimitive(D3DPTJTRIANGLELIST, nS, nW);

end;


// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ установки with FD3DDevice do begin

SetRenderState(D3DRS_COLLMODE, D3DCULL_CCW);

SetRenderState(D3DRS_LIGHTING, DWORD (True) ) ;

end;


end;


Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ выводятся "ΠΏΠΎΠ΄Π²Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΌΠΈ" Π² Π²ΠΎΠ·Π΄ΡƒΡ…Π΅, Ρ‡Ρ‚ΠΎ выглядит красиво ΠΈ Π·Π°Π³Π°Π΄ΠΎΡ‡Π½ΠΎ.

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


function TfrmD3D.BukupTexture (var FDSTextBMP : IDIRECT3DTEXTURE8;

const FileName : String) : HRESULT;

var

hRet : HRESULT;

d3dlr : TD3DLOCKED__RECT;

dwDstPitch : DWORD;

X, Y : DWORD;

Bmp : TBitmap;

R, G, Π’ : Byte;

begin

Bmp := TBitmap.Create;

try

Bmp.LoadFromfile (FileName);

except

raise EAbort.Create ('Can''t open file: ' + FileName);

Result := S_FALSE;

Exit;

end;


hRet := FD3DDevice.CreateTexture (Bmp.Width, Bmp.Height, 0, 0,

D3DFMT_A8R8G8B8, D3DPOOL MANAGED, FD3TextBMP);

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


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

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


dwDstPitch := d3dlr.Pitch;

for Y := 0' to Bmp.Height - 1 do

for X := 0 to Bmp.Width - 1 do begin

R := GetRValue (Bmp.Canvas.Pixels [X,

DWORD (Bmp.Height -1) - Y] ) ;

G := GetGValue (Bmp.Canvas.Pixels [X,

DWORD (Bmp.Height -I) - Y] ) ;

Π’ := GetBValue (Bmp.Canvas.Pixels [X,

DWORD (Bmp.Height -I) - Y] ) ;

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

D3DCOLOR_XRGB(R, G, B);

end;


// Π Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅ΠΌ мСсто для ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ растра

GetMem (TexPointer, 4 * Bmp.Width * Bmp.Height); // Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΡŒΠΉ растр

CopyMemory (TexPointer, d3dlr.pBits, 4 * Bmp.Width * Bmp.Height)

wrkTexWidth := Bmp.Width; wrkTexHeight := Bmp.Height; Bmp.Free;

Result := FDSTextBMP.UnlockRect(0);

end;


// ΠŸΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ снСгом тСкстуры

function TfrmDSD.SnowTexture (var FD3TextBMP : IDIRECT3DTEXTURE8)

HRESULT;

var

hRet : HRESULT;

d3dlr : TD3DLOCKED_RECT;

i : Integer;

dwDstPitch : DWORD;

begin

// Π—Π°ΠΏΠΈΡ€Π°Π΅ΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ тСкстуры

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

if FAILED(hRet) then begin

Result := hRet;

Exit;

end;


// ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π² Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ растр

CopyMemory (d3dlr.pBits, TexPointer, 4 * wrkTexWidth * wrkTexHeight);

dwDstPitch := d3dlr.Pitch;

// ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ тСкстуры Π·Π°ΠΊΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Ρ‡Π΅Ρ€Π½Ρ‹ΠΌ

for i := 1 to 10000 do

PDWORD (DWORD(d3dlr.pBits) + DWORD(random(wrkTexHeight)) * dwDstPitch +

DWORD(random(wrkTexWidth)) * 4)Π› := 0; Result := FD3TextBMP.OnlockRect(0);

end;


Одно ΠΈΠ· самых Π²Π°ΠΆΠ½Ρ‹Ρ… мСст ΠΊΠΎΠ΄Π° - ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡ ΠΌΡ‹ΡˆΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π³ΠΎΠ»ΠΎΠ²Ρ‹ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, клавиши управлСния курсором ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π² пространствС, клавиши <Page Up> ΠΈ <Page Down> отвСтствСнны Π·Π° ΡƒΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π³ΠΎΠ»ΠΎΠ²Ρ‹ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ:


function TfrmD3D.ReadImmediateData : HRESULT;

var

hRet : HRESULT; dims2 : TDIMOUSESTATE2;

NewXPos, NewZPos : Single;

begin

Zero-Memory (8dims2, SizeOf (dims2) ) ;

hRet := DIMouse.GetDeviceState(SizeOf(TDIMOUSESTATE2), @dims2);

if Failed (hRet) then begin

hRet := DIMouse.Acquire;

while hRet = DIERR_INPUTLOST do

hRet := DIMouse.Acquire; end;

// ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ курсора ΠΌΡ‹ΡˆΠΈ Π²Π»Π΅Π²ΠΎ-Π²ΠΏΡ€Π°Π²ΠΎ

if dims2.1X <> О

// МСняСм ΡƒΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π³ΠΎΠ»ΠΎΠ²Ρ‹ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ

then RotY := RotY + 0.01 * dims2.1X; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ курсора ΠΌΡ‹ΡˆΠΈ Π²ΠΏΠ΅Ρ€Π΅Π΄-Π½Π°Π·Π°Π΄

if dims2.1Y > 0 then begin // Π”Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π½Π°Π·Π°Π΄

// ВычисляСм Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

NewXPos := XPos + sin(RotY - Pi / 2) * 0.05;

NewZPos := ZPos + cos(RotY - Pi / 2) * 0.05;

// НСт Π»ΠΈ прСпятствий ΠΊ двиТСнию Π½Π°Π·Π°Π΄, Π³ΠΎΠ»ΠΎΠ²Ρƒ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ

if TestRender (NewXPos, NewZPos, RotY - Pi) then begin

XPos := NewXPos; // ΠŸΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΠΈΠΉ Π½Π΅Ρ‚, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΈΠ³Ρ€ΠΎΠΊΠ°

ZPos := NewZPos;

end

end else if dims2.1Y < 0 then begin // Π”Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΏΠ΅Ρ€Π΅Π΄

NewXPos := XPos + sin(RotY + Pi / 2) * 0.05;

NewZPos := ZPos + cos(RotY + Pi / 2) * 0.05;

// Π•ΡΡ‚ΡŒ Π»ΠΈ прСпятствия ΠΊ двиТСнию

if TestRender (NewXPos, NewZPos, RotY) then begin