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

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

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

Π’Ρ‹Ρ…ΠΎΠ΄ простой - Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для растров, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСдполагаСтся Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса TBitmap, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΡ‹ ΡƒΠΆΠ΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ ΠΈ сталкнСмся Π½Π΅ Ρ€Π°Π·.


ΠŸΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½Ρ‹Π΅ прилоТСния

ΠŸΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½Ρ‹Π΅ прилоТСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ самыми Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹ΠΌΠΈ для использования DirectDraw. Π”Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Ρ‡Π°Ρ‰Π΅ всСго ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΈΠ³Ρ€. Главная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ полноэкранный Ρ€Π΅ΠΆΠΈΠΌ позволяСт ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния.


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

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈ использовании 16-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° ваши прилоТСния Π²Ρ‹ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π² эффСктности, Π½ΠΎ Ссли Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠ², Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…03, ΠΊΠ°ΠΊ ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΊΠ½ΠΈΠ³ΠΈ, Π½Π° основС DirectDraw ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π΅ΠΆΠΈΠΌ Π² 256 Ρ†Π²Π΅Ρ‚ΠΎΠ². ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ, Π½ΠΎ вмСсто стрСлки здСсь ΠΌΡ‹ΡˆΡŒΡŽ пСрСдвигаСтся ΠΎΠ±Ρ€Π°Π· ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ³ΠΎ Π΄Ρ€Π°ΠΊΠΎΠ½Π° (рис. 3.3).





Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ рисунка Ρ€Π°Π²Π½Ρ‹ 640x480 пиксСлов.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ появилась свойствСнная всСм прилоТСниям, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ 256-Ρ†Π²Π΅Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Ρ€Π°Π±ΠΎΡ‚Π° с ΠΏΠ°Π»ΠΈΡ‚Ρ€ΠΎΠΉ. Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° растра

Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π° экранС ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π³ΠΎ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ появился ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:


FDDPal : IDirectDrawPalette;

Напомню, Ρ‡Ρ‚ΠΎ этому ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil, Π° Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ присвоСниСм Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ Release.

Π‘Ρ€Π°Π·Ρƒ послС создания ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности устанавливаСм Π² Π½Π΅ΠΉ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ, Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡƒΡŽ ΠΈΠ· Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ изобраТСния. Для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π°Π±ΠΎΡ€Π° Ρ†Π²Π΅Ρ‚ΠΎΠ² Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π΅Π·Π°Π±Π²Π΅Π½Π½ΠΎΠ³ΠΎ модуля DDUtil:


// Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ растра

FDDPal := DDLoadPalette (FDD, groundBmp) ;

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

УстанавливаСтся ΠΏΠ°Π»ΠΈΡ‚Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° повСрхности:


// УстанавливаСм ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ

hRet := FDDSPrimary. SetPalette (FDDPal) ;

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

Растр Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π²Ρ‹Π±Ρ€Π°Π½ с подходящими Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΅Π³ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ послСдниС Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° DDLoadBitmap Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ:


FDDSBackGround := DDLoadBitmap (FDD, groundBmp, 0, 0) ;

if FDDSBackGround = nil then ErrorOut (DD_FALSE, 'DDLoadBitmap');

Π”Ρ€Π°ΠΊΠΎΠ½ нарисован с Ρ‡Π΅Ρ€Π½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠΌ. Для Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° бСрСтся Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π°:


hRet := DDSetColorKey (FDDSImage, RGB(0, 255, 255)); if Failed (hRet) then ErrorOut (hRet, 'DDSetColorKey');

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„ΠΎΠ½ Π½Π΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ, ΠΏΡ€ΠΈ восстановлСнии повСрхностСй ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ рисунка Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ зСрнистости. ΠŸΡ€ΠΈ восстановлСнии повСрхностСй слСдуСт Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π½ΠΎΠ²ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ лишь ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ восстановлСнии ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности:


function TfrmDD.RestoreAll : HRESULT;

var

hRet : HRESULT;

begin

hRet := FDDSPrimary._Restore;

if Succeeded (hRet) then begin

FDDPal := nil; // УдаляСм ΡΡ‚Π°Ρ€ΡƒΡŽ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ

FDDPal := DDLoadPalette (FDD, groundBmp); // ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΅Π΅

if FDDPal <> nil then begin // ΠŸΠ°Π»ΠΈΡ‚Ρ€Π° ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ

// Π—Π°Π½ΠΎΠ²ΠΎ Π΅Π΅ устанавливаСм

hRet := FDDSPrimary.SetPalette(FDDPal);

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

else ErrorOut(DDERR_PALETTEBUSY, 'DDLoadPalette'); hRet := FDDSBackGround._Restore;

if Failed (hRet) then begin

Result := hRet; Exit;

end;


hRet := DDReLoadBitmap(FDDSBackGround, groundBmp);

if Failed (hRet) then ErrorOut(hRet, 'DDReLoadBitmap'); hRet := FDDSImage._Restore; if Failed (hRet) then begin Result := hRet;

Exit;

end;


Result := DDReLoadBitmap(FDDSImage, imageBmp); end else Result := hRet;

end;


ΠŸΡ€ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΈ установлСнии ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ Π½Π΅Ρ‚ смысла ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρƒ для Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния ΠΎ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ошибкС я взял ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ ΠΈΠ· ряда ошибок, связанных с Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ с ΠΏΠ°Π»ΠΈΡ‚Ρ€Π°ΠΌΠΈ.

Π’Π°ΠΊΠΆΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния, Ссли Π½Π΅ удаСтся ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Π½ΠΎΠ²ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» растра. Он вСдь ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ просто ΡƒΠ΄Π°Π»Π΅Π½.

ИзмСнился Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ пСрСмСщСния курсора. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ курсора Π²Π±Π»ΠΈΠ·ΠΈ Π³Ρ€Π°Π½ΠΈΡ† Ρ€Π΅ΡˆΠ΅Π½Π°:


procedure TfrmDD.FormMouseMove(Sender: TObject; Shift: TShiftState;

X, Y: Integer);

begin

if X <= ScreenWidth - 64 then mouseX := X

else mouseX := ScreenWidth - 64; // Π”ΠΎΠ±Π°Π²ΠΈΠ»Π°ΡΡŒ эта Π²Π΅Ρ‚Π²ΡŒ

if Y <= ScreenHeight - 64 then mouseY := Y

else mouseY := ScreenHeight - 64; // Π­Ρ‚ΠΎΠ³ΠΎ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ Π±Ρ‹Π»ΠΎ FormPaint (nil);

end;


Новый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…04) ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ ΠΏΠ»Π°Π²Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ‚Π΅ΠΌΠ΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π² прилоТСниях. ИзмСним ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ бСспрСрывно обновлялось.

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

Нам Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π² этом ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, связанный с пСрСрисовкой ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности. Однако Π² ситуации, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΠ»ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ рСсурсы ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π½Π° Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π±Π΅Π·ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ ΠΈ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ΅ дСйство ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ состояниС активности Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ:


FActive : BOOL; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ состоянии

УстанавливаСтся эта пСрСмСнная Π² True ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΎΠΊΠ½Π° прилоТСния ΠΈ ΠΏΡ€ΠΈ восстановлСнии Π΅Π³ΠΎ ΠΈΠ· ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ состояния:


procedure TfrmDD.ApplicationEventslRestore(Sender: TObject);

begin

WindowState := wsMaximized;

// ПослС распахивания ΠΎΠΊΠ½Π° считаСм Π΅Π³ΠΎ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΊ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ

FActive := True; end;

// Появился Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ

procedure TfrmDD.FormActivate(Sender: TObject); begin

FActive := True; // ПослС запуска прилоТСния ΠΎΠ½ΠΎ Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅

end;


ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события onPaint Π½Π°ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ Π½ΡƒΠΆΠ΅Π½, Π° ΠΊΠΎΠ΄, связанный с пСрСрисовкой ΠΎΠΊΠ½Π°, Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ для удобства Π½Π° Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π·Π° Π½Π΅ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ пСрСрисовку ΠΎΠΊΠ½Π° ΠΈ Π·Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ страниц:


function TfrmDD.UpdateFrame : HRESULT; // Ѐункция пСрСрисовки ΠΎΠΊΠ½Π°

var

hRet : HRESULT;

begin

// ЗаполняСм Ρ„ΠΎΠ½

hRet := FDDSBack.BltFast (0, 0, FDDSBackGround, nil, DDBLTFAST_WAIT);

if hRet = DDERR_SURFACELOST then begin hRet := RestoreAll;

if Failed (hRet) then begin // Полная Π½Π΅ΡƒΠ΄Π°Ρ‡Π° Result := hRet;

Exit;

end;


end;


// Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

hRet := FDDSBack.BltFast (mouseX, mouseY, FDDSImage, nil,

DDBLTFAST WAIT or DDBLTFAST SRCCOLORKEY);

if hRet = DDERR_SURFACELOST then begin hRet := RestoreAll; if Failed (hRet) then begin Result := hRet;

Exit;

end;


end;


Result := DD_OK;

end;


// Ѐункция ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ страниц function TfrmDD.FlipPages : HRESULT;

begin

Result := FDDSPrimary.Flip(nil, DDFLIP_WAIT);

if Result = DDERR_SURFACELOST then Result := RestoreAll;

end;


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

Но особая Π½Π΅ΠΏΡ€ΠΈΡΡ‚Π½ΠΎΡΡ‚ΡŒ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании зацикливания Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ нСприятная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: послС ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния ΠΎΠ½ΠΎ пСрСстаСт Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° сообщСния ΠΈ зацикливаСтся Π½Π° восстановлСнии повСрхностСй.

ПослСднСС, ΠΈ самоС Π³Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ добавилось - это ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события оТидания:


procedure TfrmDD.ApplicationEventslIdle(Sender: TObject;

var Done: Boolean); begin

if FActive then // Волько ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ состоянии прилоТСния

if Succeeded (UpdateFrame) // ΠŸΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π° ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ

then FlipPages; // ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ страницы

// ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π½Π΅ появились Π»ΠΈ сообщСния Done := False;

end;


Π― Π²ΠΈΠ΄Π΅Π» Π½Π΅ΠΌΠ°Π»ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… DirectDraw, написанных Π½Π° Delphi. И ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ. Π₯ΠΎΡ€ΠΎΡˆΠ΅Π½ΡŒΠΊΠΎ "погоняйтС" этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½Ρ‹Ρ… ситуациях ΠΎΠ½ Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

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

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…05. Π’ Π½Π΅ΠΌ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, хранящиС Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ курсора, ΠΈ Π²Π²Π΅Π΄Π΅Π½Π° Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ пСрСмСнная, содСрТащая Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ³Π»Π°:


Angle : Single = 0;

Π Π°Π·ΠΌΠ΅Ρ€ растра - 64x64 пиксСла. Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° экранС Π΅Π³ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π° опираСтся Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Angle:


FDDSBack.BltFast (320 + trunc (cos(Angle) * ISO) - 32,

240 + trunc (sin(Angle) * 150) - 32,

FDDSImage, nil,

DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY);

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