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

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

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

Π’Π°ΠΊΠΎΠΉ способ общСния с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΡƒΡ‰Π΅Ρ€Π±Π΅Π½ Π΅Ρ‰Π΅ ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΏΠ°Π»ΠΈΡ‚Ρ€ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Из-Π·Π° этого я Π½Π΅ ΠΌΠΎΠ³ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для примСнСния Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния ΠΎΠ± ошибкС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π½Π°ΠΌΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ наш Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΡŒ экрана Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΎΠΊ, для ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° слСдуСт Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ установлСнноС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола. Ρ‚. ΠΊ. ΠΏΡ€ΠΈ 32-Π±ΠΈΡ‚Π½ΠΎΠΉ Π³Π»ΡƒΠ±ΠΈΠ½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ искаТСнноС ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ².

ИспользованиС отсСчСния Π² полноэкранном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

ИмСя Π΄Π΅Π»ΠΎ с Delphi, Π²Π°ΠΌ навСрняка ΠΆΠ°Π»ΠΊΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ всС Π΅Π΅ прСлСсти ΠΈ ΠΌΠΎΡ‰ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… срСдств, Ρ€Π°ΡΡΡ‚Π°Ρ‚ΡŒΡΡ с Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΠΊΠ½Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ сСрыС пятна.

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для этого случая я ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ» ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ эффСктно ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ срСдствами GDI ΠΈ DirectDraw. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Ex11, Π³Π΄Π΅ посСрСдинС экрана отобраТаСтся рСпродукция самого популярного ΡˆΠ΅Π΄Π΅Π²Ρ€Π° Тивописи, Π° ΠΏΠΎ Π±ΠΎΠΊΠ°ΠΌ разбросаны стандартныС интСрфСйсныС элСмСнты (рис. 5.11).





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



var

rgn : TRgnData; // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ пСрСмСнная, ΠΎΠΏΠΈΡΡŒΡˆΠ°Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ²

wrk : TRECT; // ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ наш СдинствСнный Ρ€Π΅Π³ΠΈΠΎΠ½

...

SetRect {wrk, 230, 0, 620, 600); // Π—Π°Π΄Π°Π΅ΠΌ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экранС

with rgn.rdh do begin // ЗаполняСм поля структуры

dwSize := SizeOf (RGNDATAHEADER); // Π­Ρ‚ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ всСгда

iType := RDH_RECTANGLES; // ЕдинствСнно Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля

nCount := 1; // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ задСйствованных Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ²

nRgnSize := Sizeof(TRECT); // Π Π°Π·ΠΌΠ΅Ρ€ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

end;


PRECT(@rgn.Buffer)Π› := wrk; // Заносим Π² Π±ΡƒΡ„Π΅Ρ€ наш СдинствСнный Ρ€Π΅Π³ΠΈΠΎΠ½

if FDD.CreateClipper(0, FDDClipper, nil) = DD_OK then begin

FDDClipper.SetClipList (@rgn, 0); // Π—Π°Π΄Π°Π΅ΠΌ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отсСчСния

FDDSPrimary.SetClipper (FDDClipper) ;

end;


Π—Π°ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ структура, прСдставлСнная здСсь, являСтся систСмной ΠΈ Π½Π΅ связана ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ с DirectX. Заполняя ΠΏΠΎΠ»Π΅ buffer этой структуры, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ холсты замысловатой Ρ„ΠΎΡ€ΠΌΡ‹.

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρƒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ SetciipList. Π’ΠΎΡ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ способствуСт ΠΎΡ‚ΡΠ΅Ρ‡Π΅Π½ΠΈΡŽ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΌΡƒ ΠΎΡ‚ΡΠ΅Ρ‡Π΅Π½ΠΈΡŽ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:


var

hrg : HRGN; // Π Π΅Π³ΠΈΠΎΠ½

rgnDataBuffer: Array [0..1023] of BYTE; // Массив списка Ρ€Π΅Π³ΠΈΠΎΠ½ΠΎΠ²

...

hrg := CreateRectRgn (230, 0, 620, 600); // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½Π°

// ЗаполняСм массив Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

GetRegionData(hrg, SizeOf(rgnDataBuffer), @rgnDataBuffer);

DeleteObject(hrg);

if FDD.CreateClipper(0, FDDClipper, nil) = DD_OK then begin

FDDClipper.SetClipList (@rgnDataBuffer, 0); // Π—Π°Π΄Π°Π΅ΠΌ отсСчСниС

FDDSPrimary.SetClipper(FDDClipper);

end;


ΠžΡ‚ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ для полноэкранных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠ² Π²Π±Π»ΠΈΠ·ΠΈ Π³Ρ€Π°Π½ΠΈΡ†. Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…12 курсор Π·Π°ΠΌΠ΅Π½Π΅Π½ Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏΠΎΠΌ DirectX, динамичСски ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌ свой Ρ€Π°Π·ΠΌΠ΅Ρ€. Для Ρ‚Π°ΠΊΠΎΠΉ ситуации Π·Π°Π΄Π°Π½ΠΈΠ΅ полоТСния курсора становится Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² с Π·Π°ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΌ курсором прилоТСния. ΠŸΡ€ΠΈΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ»Π΅Π½ΠΈΠ΅ отсСчСния ΠΊ экрану позволяСт ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ ΠΎΠ±Ρ€Π°Π·Π° курсора ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΏΡ€ΠΈ Π΅Π³ΠΎ воспроизвСдСнии Π²Π±Π»ΠΈΠ·ΠΈ Π³Ρ€Π°Π½ΠΈΡ† ΠΎΠ±Ρ€Π°Π· отсСкаСтся ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ (рис. 5.12).





Аналогично ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния строится Π½Π° основС Ρ€Π΅Π³ΠΈΠΎΠ½Π°, Π½ΠΎ здСсь Ρ€Π΅Π³ΠΈΠΎΠ½ прСдставляСт собой простой ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, связанный с Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ экрана:


SetRect (wrk, О, О, 800, 600);

with rgn.rdh do begin

dwSize := SizeOf (RGNDATAHEADER);

Type := RDH_RECTANGLES;

nCount := 1;

nRgnSize := Sizeof(TRECT);

end;


PRECT(@rgn.Buffer)Π› := wrk;

if FDD.CreateClipper(0, FDDClipper, nil) = DD_OK then begin

FDDClipper.SetClipList (@rgn, 0);

FDDSBac k.SetClipper(FDDC1ippe r);

end;


ΠŸΡ€ΠΈ пСрСрисовкС ΠΊΠ°Π΄Ρ€Π° ΠΎΠ±Ρ€Π°Π· курсора растягиваСтся Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ Scale:


function TfrmDD.UpdateFrame : HRESULT;

var

hRet : HRESULT;

wrkRect : TRECT;

begin

// Π’Ρ‹Π²ΠΎΠ΄ Ρ„ΠΎΠ½Π°

hRet := FDDSBack.Blt (nil, FDDSBackGround, nil, DDBLT WAIT, nil);

if Failed (hRet) then begin Result := hRet; Exit; end;

// ΠŸΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ области ΠΎΠ±Ρ€Π°Π·Π° курсора

SetRect (wrkRect, mouseX, mouseY, mouseX + Scale, mouseY + Scale);

// ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Π° курсора, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΊΠ»ΡŽΡ‡

hRet := FDDSBack.Blt (SwrkRect, FDDSImage, nil, DDBLT_WAIT or

DDBLT_fCEYSRC, nil) ; if Failed (hRet) then begin

Result := hRet;

Exit;

end;


Result := FDDSPrimary.Flip(nil, DDFLIP_WAIT)

end;


Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° CDX

НавСрняка ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ этой ΠΊΠ½ΠΈΠ³ΠΈ захотят ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° основС DirectDraw. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ этому ΠΌΠ΅Ρ€ΠΎΠΏΡ€ΠΈΡΡ‚ΠΈΡŽ, стоит ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ. Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ вас ΠΆΠ΄Π΅Ρ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ экскурс ΠΏΠΎ функциям ΠΎΡ‡Π΅Π½ΡŒ популярной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ CDX, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ GNU. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° написана Π½Π° Π‘, ΠΈ я ΠΏΠ΅Ρ€Π΅Π²Π΅Π» Π½Π° Delphi лишь Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒ, Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎ адрСсу http://www.cdx.sk/.

НачнСм с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…13, ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, выводящСго Π½Π° экранС ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ€Π°Π·Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ (рис. 5.13).





Π’ спискС uses добавилось ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ модуля coxscreenx, Π° ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, связанных с Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΉ, совсСм ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ:


GameScreen : CDXScreen;

Π’ΠΎΠΎΠ±Ρ‰Π΅, ΠΊΠΎΠ΄ сильно упрощаСтся, Π° инициализация Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ свСдСна ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ:


GameScreen := CDXScreen.CreateCDXScreenCustomBPP(Handle, ScreenWidth,

ScreenHeight, ScreenBitDepth);

Код пСрСрисовки ΠΎΠΊΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ дСйствия:


GameScreen.GetAppFrontBuffer.Rect(random(ScreenWidth),

random(ScreenHeight),

random(ScreenWidth),

random(ScreenHeight),

random(254));

To Π΅ΡΡ‚ΡŒ, рисуСм ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ прямо Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅.

Π Π°Π±ΠΎΡ‚Π° прилоТСния Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ послС наТатия любой клавиши. По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния удаляСтся наш СдинствСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚:


if Assigned (GameScreen) then GameScreen.Destroy;

ΠŸΠΎΠ΄Ρ…ΠΎΠ΄, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ CDX, Π²Π°ΠΌ сильно Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ встрСчали Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ модуля DDUtil для восьмой вСрсии DirectX, Π½ΠΎ историчСски ΠΏΠ΅Ρ€Π²ΠΎΠΉ появилась CDX. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ³Ρ€ ΠΈ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ DirectDraw, Π½ΠΎ ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ DirectX.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…14, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„ΠΎΠ½ΠΎΠΌ. Π­ΠΊΡ€Π°Π½ Ρ€Π°Π·Π±ΠΈΡ‚ Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ части, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выводится своя фоновая ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° (рис. 5.14).





По Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиш управлСния курсором Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ сСкторС цикличСски сдвигаСтся. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ появились Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, связанныС с Ρ„ΠΎΠ½ΠΎΠΌ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹:


Gamelnput : CDXInput; // ΠžΠ±ΡŠΠ΅ΠΊΡ‚, связанный с Π²Π²ΠΎΠ΄ΠΎΠΌ

GameScreen : CDXScreen; // Π“Π»Π°Π²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²Ρ‹Π²ΠΎΠ΄Π°

Landscape : CDXTile; // ЗагруТаСмая ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°

Mapl : CDXMap; // Π‘Π΅ΠΊΡ‚ΠΎΡ€Ρ‹, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΊΠ½Π° экрана

ΠœΠ°Ρ€2 : CDXMap;

ΠœΠ°Ρ€Π— : CDXMap;

ΠœΠ°Ρ€4 : CDXMap;

MapScrollSpeed : Integer = 4; // Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ пСрСдвиТСния Ρ„ΠΎΠ½Π°

К ЗафуТаСмая ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ шаблона заполнСния ΠΎΠΊΠ½Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ 64x64 пиксСлов:


procedure Π’frmDD.FormCreate(Sender: TObject);

begin

Gamelnput := CDXInput.CreateCDXInput; // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π²Π²ΠΎΠ΄Π°

Gamelnput.Create(HInstance, Handle);

GameScreen := CDXScreen.CreateCDXScreenCustomBPP(Handle, ScreenWidth, ScreenHeight, ScreenBitDepth);

GameScreen.LoadPalette('Anim.bmp1); // ΠŸΠ°Π»ΠΈΡ‚Ρ€ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

// Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ с 4-мя шаблонами заполнСния экрана, 64x64 пиксСла

Landscape := CDXTile.CDXTileCustom(GameScreen,'Anim.bmp',64, 64, 4);

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ схСмы заполнСния Ρ„ΠΎΠ½Π°

Mapl := CDXMap.CDXMap(Landscape, GameScreen);

Mapl.CreateMap(64, 64, 1);

Map2 := CDXMap.CDXMap(Landscape, GameScreen);

Map2.CreateMap(64, 64, 2) ;

ΠœΠ°Ρ€Π— := CDXMap.CDXMap(Landscape, GameScreen);

Map3.CreateMap(64, 64, 3);

Map4 := CDXMap. CDXMap (Landscape, GameScreen);

Map4.CreateMap(64, 64, 4);

end;


ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нумСрация шаблонов основана Π½Π° Π½ΡƒΠ»Π΅, Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„ΠΎΠ½, ΠΈΠ΄ΡƒΡ‰ΠΈΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ.

Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ клавиш Π»Π΅Π³ΠΊΠΎ читаСтся, смысл всСх дСйствий Π²Π°ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ понятСн:


function KeyDown (Key : Byte): BOOL; // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция

begin

Result := Gamelnput.Keys[Key] = 128; // НаТата Π»ΠΈ клавиша

end;


procedure UpdateKeys; // ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

begin

if KeyDown(DIK_RIGHT) then begin // Π‘Ρ‚Ρ€Π΅Π»ΠΊΠ° Π²ΠΏΡ€Π°Π²ΠΎ

Mapl.WrapScrollRight(MapScrollSpeed); // Π‘Π΄Π²ΠΈΠ³ Π²ΠΏΡ€Π°Π²ΠΎ содСрТимого

Map2.WrapScrollRight(MapScrollSpeed); // ВсСх Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΎΠΊΠΎΠ½

ΠœΠ°Ρ€Π—.WrapScrollRight(MapScrollSpeed);

ΠœΠ°Ρ€4.WrapScrollRight(MapScrollSpeed);

end;


if KeyDown(DIK_LEFT) then begin // Π‘Ρ‚Ρ€Π΅Π»ΠΊΠ° Π²Π»Π΅Π²ΠΎ

Mapl.WrapScrollLeft(MapScrollSpeed);

Map2.WrapScrollLeft(MapScrollSpeed);

ΠœΠ°Ρ€Π—.WrapScrollLeft(MapScrollSpeed);

Map4.WrapScrollLeft(MapScrollSpeed);

end;


if KeyDown(DIK_UP) then begin // Π‘Ρ‚Ρ€Π΅Π»ΠΊΠ° Π²Π²Π΅Ρ€Ρ…

Mapl.WrapScrollUp(MapScrollSpeed);

Map2.WrapScrollUp(MapScrollSpeed);

ΠœΠ°Ρ€Π—.WrapScrollUp(MapScrollSpeed);

Map4.WrapScrollUp(MapScrollSpeed);

end;


if KeyDown(DIK_DOWN) then begin // Π‘Ρ‚Ρ€Π΅Π»ΠΊΠ° Π²Π½ΠΈΠ·