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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° для Windows срСдствами DirectDrawΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 54

Автор Бтэн Π’Ρ€ΡƒΡ…ΠΈΠ»ΡŒΠΎ

 if (r==DD_OK) {

  BYTE* src = finaldata + dwWidth * (dwHeight-1);

  BYTE* dst = (BYTE *)desc.lpSurface;

  for (DWORD y=0; y<dwHeight; y++) {

   memcpy(dst, src, dwWidth);

   dst += desc.lPitch;

   src -= dwWidth;

  }

  avisurf->Unlock(0);

 }

 return TRUE;

}

ПослС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ повСрхности функция UpdateAviSurface() Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку пиксСлСй AVI-Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ повСрхности. Π’ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ AVI, ΠΊΠ°ΠΊ ΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ BMP, изобраТСния хранятся Π² ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, поэтому ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с послСднСй строки Π±ΡƒΡ„Π΅Ρ€Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ двигаСмся ΠΊ Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»Ρƒ.

Ѐункция RestoreSurfaces() 

ВсС Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠ΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ·Π°Π΄ΠΈ, дальшС Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅Π³ΠΊΠΎ. ОсобСнно просто рСализуСтся функция RestoreSurfaces():

void AviPlayWin::RestoreSurfaces() {

 avisurf->Restore();

}

ВспомнитС β€” функция RestoreSurfaces() вызываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ восстановлСнии потСрянных повСрхностСй, Π° класс DirectDrawWin автоматичСски восстанавливаСт ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ со Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΌ Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ AviPlay остаСтся лишь Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ AVI, Π° для этого достаточно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Restore() интСрфСйса DirectDrawSurface.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… функция RestoreSurfaces() восстанавливала Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, Π½ΠΎ ΠΈ содСрТимоС повСрхности. Π’ нашСм случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ восстановлСниСм памяти, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅Π΅ содСрТимоС Π±ΡƒΠ΄Π΅Ρ‚ пСрСзаписано ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠ°Π΄Ρ€ΠΎΠΌ. Если Π²Ρ‹ Π²Π΄Ρ€ΡƒΠ³ Π·Π°ΡΠΎΠΌΠ½Π΅Π²Π°Π΅Ρ‚Π΅ΡΡŒ, напомню β€” Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Restore() для повСрхности, которая Π½Π΅ Π±Ρ‹Π»Π° потСряна (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, находящСйся Π² систСмной памяти), Π½Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ€Π΅Π΄Π°.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° 

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ AviPlay Π²Π²ΠΎΠ΄ Π½Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚ особой Ρ€ΠΎΠ»ΠΈ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ всСго Π½Π° Ρ‚Ρ€ΠΈ клавиши, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ. Π’Π²ΠΎΠ΄ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ обрабатываСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ OnKeyDown():

void AviPlayWin::OnKeyDown(UINT key, UINT nRepCnt, UINT nFlags) {

 switch (key) {

 case VK_ESCAPE:

 case VK_SPACE:

 case VK_RETURN:

  ShowDialog();

  break;

 }

 DirectDrawWin::OnKeyDown(key, nRepCnt, nFlags);

}

ВсС Ρ‚Ρ€ΠΈ клавиши Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ShowDialog(). Аналогично обрабатываСтся ΠΈ Π²Π²ΠΎΠ΄ ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ, это происходит Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ OnRButtonDown():

void AviPlayWin::OnRButtonDown(UINT nFlags, CPoint point) {

 ShowDialog();

 DirectDrawWin::OnRButtonDown(nFlags, point);

}

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π±ΠΎΡ€Π° AVI-Ρ„Π°ΠΉΠ»Π°, функция ShowDialog() посылаСт сообщСниС WM_CLOSE, сигнализируя ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ прилоТСния.

Ѐункция OnDestroy() 

ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ лишь Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Ѐункция OnDestroy() занимаСтся Β«ΡƒΠ±ΠΎΡ€ΠΊΠΎΠΉ мусора» β€” ΠΎΠ½Π° Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ AVI-ΠΏΠΎΡ‚ΠΎΠΊΠΈ, освобоТдаСт дСкомпрСссор ΠΈ Π±ΡƒΡ„Π΅Ρ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… AVI:

void AviPlayWin::OnDestroy() {

 DirectDrawWin::OnDestroy();

 if (avistream) AVIStreamRelease(avistream), avistream=0;

 if (decomp)  ICClose(decomp), decomp=0;

 if (srcfmt) delete [] srcfmt, srcfmt=0;

 if (dstfmt) delete [] dstfmt, dstfmt=0;

 if (rawdata) {

  TRACE("delete [] rawdata...\n");

  delete [] rawdata, rawdata=0;

 }

 if (finaldata) {

  TRACE("delete [] finaldata...\n");

  delete [] finaldata, finaldata=0;

 }

 if (avidialog) delete avidialog, avidialog=0;

 AVIFileExit();

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AviFileExit() Π² ΠΊΠΎΠ½Ρ†Π΅ OnDestroy(). Π­Ρ‚ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ VFW ΠΈ освобоТдаСт всС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠΌ рСсурсы.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ 

НашС знакомство с воспроизвСдСниСм Π²ΠΈΠ΄Π΅ΠΎΡ€ΠΎΠ»ΠΈΠΊΠΎΠ² ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ. ЧСстно говоря, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ AviPlay Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚Π΅Π»ΡŒ AVI-Ρ„Π°ΠΉΠ»ΠΎΠ², Π²Π°ΠΌ придСтся Π΅Ρ‰Π΅ Π½Π΅ΠΌΠ°Π»ΠΎ ΠΏΠΎΡ‚Ρ€ΡƒΠ΄ΠΈΡ‚ΡŒΡΡ. НСобходимо ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π·Π²ΡƒΠΊΠ° ΠΈ Ρ…Ρ€ΠΎΠ½ΠΎΠΌΠ΅Ρ‚Ρ€Π°ΠΆ, Π½Π΅ говоря ΡƒΠΆΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ VFW ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ странностями ΠΈ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½ΠΈΠΌ приходится ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

И послСднСС Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. По нСизвСстным ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ VFW отказываСтся Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с AVI-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, сТатыми ΠΊΠΎΠ΄Π΅ΠΊΠ°ΠΌΠΈ IR32 ΠΈ IR42 (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, Π½ΠΎ я Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» эти Π΄Π²Π°). Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, AVI-Ρ„Π°ΠΉΠ»Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ΄Π΅ΠΊΠΈ MS-CRAM ΠΈ Cinepak, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.

Π’ Π³Π»Π°Π²Π΅ 9 ΠΌΡ‹ возьмСмся Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ столкновСний. Наша Ρ†Π΅Π»ΡŒ β€” Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ обСспСчивал Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пиксСлСй ΠΏΡ€ΠΈ максимальной эффСктивности.

Π“Π»Π°Π²Π° 9. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° столкновСний               

Π‘ΠΏΡ€Π°ΠΉΡ‚Ρ‹, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ страниц, ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹, повСрхности β€” это просто Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ Π½Π΅ΠΌΠ°Π»ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ. Но ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ спрайты Π½Π° экран ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒ ΠΈΡ… Ρ‚ΡƒΠ΄Π°-сюда β€” это Π΅Ρ‰Π΅ Π½Π΅ всС. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ изобраТСния, гСомСтричСскиС Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΈ символы Π½Π° экранС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Π’ Π³Π»Π°Π²Π΅ 6 ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ DirectInput Π±Ρ‹Π»ΠΎ описано взаимодСйствиС спрайтов с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ спрайты Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° столкновСний (ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° соударСний) β€” ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ для обнаруТСния столкновСний ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π’Π΅Ρ€ΠΌΠΈΠ½ относится ΠΊΠ°ΠΊ ΠΊ плоским, Ρ‚Π°ΠΊ ΠΈ ΠΊ Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, Π½ΠΎ Π² этой ΠΊΠ½ΠΈΠ³Π΅ нас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ плоскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

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

Π“Π»Π°Π²Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Bumper. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ столкновСний, написанныС Π² этой Π³Π»Π°Π²Π΅, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Bumper ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΈ Π°Π½ΠΈΠΌΠΈΡ€ΡƒΠ΅Ρ‚ спрайты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈ столкновСниях ΠΌΠ΅Π½ΡΡŽΡ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ двиТСния.

ΠžΠ±Ρ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅

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

Одно ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… сущСствСнно Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ β€” Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ. НСкоторыС прилоТСния, особСнно быстрыС Π°Ρ€ΠΊΠ°Π΄Π½Ρ‹Π΅ ΠΈΠ³Ρ€Ρ‹ с ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ экрана, Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ (Π΄Π° ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ сСбС ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ) ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ столкновСний Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пиксСлСй. Для ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΈΠ»ΠΈ сфСры. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большСй точности ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ ΠΈ сфСры Π½Π΅ подходят, Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пиксСлСй обходится слишком Π΄ΠΎΡ€ΠΎΠ³ΠΎ, приходится ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ нСстандартныС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Однако Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прилоТСниях Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пиксСлСй. Π’ частности, высокая Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Ρ…, ΠΏΠ»Π°Π²Π½ΠΎ двиТущихся спрайтов, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΈΠ΄ΠΈΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ столкновСниС.

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

НаглядноС пояснСниС

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ эти ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ нСсколькими рисунками. ΠœΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌΠΈ спрайтами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ рисунки ΠΈ Π·Π°ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½ΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² часто Π±Ρ‹Π²Π°Π΅Ρ‚ нСдостаточно. НачнСм с рис. 9.1, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ Π΄Π²Π° Π½Π΅ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΡ…ΡΡ спрайта вмСстС с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°ΠΌΠΈ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, СстСствСнно, Π½Π΅ Π²ΠΈΠ΄Π½Ρ‹ Π² Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… условиях).

Π‘ΠΏΡ€Π°ΠΉΡ‚Ρ‹ Π½Π° рис. 9.1 Π½Π΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ. Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΌ прСдстоит Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΈ быстро ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ столкновСния ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚; для этого Π²ΠΏΠΎΠ»Π½Π΅ достаточно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ². Π’ этом случаС Π½Π΅Ρ‚ смысла Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ пиксСли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Но Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ· спрайтов сдвинСтся ΠΈ Π΅Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ пСрСсСчСтся с Π΄Ρ€ΡƒΠ³ΠΈΠΌ? Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ столкновСниС ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Π±ΡƒΠ΄Π΅Ρ‚ слоТнСС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ придСтся Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пиксСлСй. Вакая ситуация ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π½Π° рис. 9.2.

Π₯отя спрайты Π½Π° рис. 9.2 ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², ΠΎΠ½ΠΈ Π½Π΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пиксСлСй. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ части ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² Π½Π΅ содСрТат Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠ³ΠΎ пиксСля (здСсь располоТСны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Π΅ пиксСли, Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ спрайта). Π’ Ρ‚Π°ΠΊΠΈΡ… ситуациях наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ пиксСли спрайтов.

Рис. 9.1. Π”Π²Π° Π½Π΅ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… спрайта