Π’Π°ΠΊΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΡΡΠ΅ΡΠ±Π΅Π½ Π΅ΡΠ΅ ΠΏΠΎ ΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅, ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΠΏΠ°Π»ΠΈΡΡΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅. ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ Ρ Π½Π΅ ΠΌΠΎΠ³ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π½Π°ΠΌΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ .
Π£ΡΡΠΈΡΠ΅, ΡΡΠΎ Π½Π°Ρ Ρ ΡΠ°Π½ΠΈΡΠ΅Π»Ρ ΡΠΊΡΠ°Π½Π° ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ Π΄ΠΎΡΠ°Π±ΠΎΡΠΎΠΊ, Π΄Π»Ρ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ ΡΡΠΎΠ»Π°. Ρ. ΠΊ. ΠΏΡΠΈ 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 // Π‘ΡΡΠ΅Π»ΠΊΠ° Π²Π½ΠΈΠ·