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

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

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

  surfptr1=(BYTE*)desc1.lpSurface;

  for (int yy=0;yy<height;yy++)  {

   for (int xx=0;xx>width;xx++)   {

    pixel1=surfptr1+(yy+r1target.top)*desc1.lPitch +(xx+r1target.left);

    pixel2=surfptr1+(yy+r2target.top)*desc1.lPitch +(xx+r2target.left);

    if (*pixel1 && *pixel2) {

     ret=TRUE;

     goto done_same_surf;

    }

   }

  }

done_same_surf:

  surf1->Unlock(surfptr1);

  return ret;

 }

 surf1->Lock(0, &desc1, DDLOCK_WAIT, 0);

 surfptr1=(BYTE*)desc1.lpSurface;

 surf2->Lock(0, &desc2, DDLOCK_WAIT, 0);

 surfptr2=(BYTE*)desc2.lpSurface;

 for (int yy=0;yy<height;yy++)  {

  for (int xx=0;xx>width;xx++)  {

   pixel1=surfptr1+(yy+r1target.top)*desc1.lPitch +(xx+r1target.left);

   pixel2=surfptr2+(yy+r2target.top)*desc2.lPitch +(xx+r2target.left);

   if (*pixel1 && *pixel2) {

    ret=TRUE;

    goto done;

   }

  }

 }

done:

 surf2->Unlock(surfptr2);

 surf1->Unlock(surfptr1);

 return ret;

}

Ѐункция SpritesCollidePixel() состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… этапов. Она Π΄Π΅Π»Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ полоТСния ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠ±ΠΎΠΈΡ… спрайтов, Π° Ρ‚Π°ΠΊΠΆΠ΅ вычисляСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΈΡ… пСрСсСчСния.

2. ВычисляСт области спрайтов, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… потрСбуСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пиксСлСй.

3. Если ΠΎΠ±Π° спрайта находятся Π½Π° ΠΎΠ΄Π½ΠΎΠΉ повСрхности β€” выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, для Ρ‡Π΅Π³ΠΎ сначала Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ просматриваСт Π΅Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² соотвСтствии с ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΠΎΠΈΡ… спрайтов. Если спрайты находятся Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… повСрхностях, функция Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±Π΅ повСрхности ΠΈ просматриваСт ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ….

4. Π‘Π½ΠΈΠΌΠ°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ с ΠΎΠ±Π΅ΠΈΡ… повСрхностСй ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE ΠΈΠ»ΠΈ FALSE.

На этапС 1 ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° CRect Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Sprite::GetRect(). Ѐункция GetRect() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ CRect, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ спрайта. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ & (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ пСрСсСчСния класса CRect) опрСдСляСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ пСрСсСчСния Π΄Π²ΡƒΡ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ². НиТС снова ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ листинга 9.1:

CRect rect1=sprite1->GetRect();

CRect rect2=sprite2->GetRect();

CRect irect = rect1 & rect2;

ASSERT(!(irect.left==0 && irect.top==0 &&  irect.right==0 && irect.bottom==0));

Как ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SpritesCollideRect(), ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ пСрСсСчСния класса CRect обнуляСт всС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ поля CRect, Ссли ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ. Π’ этом случаС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SpritesCollidePixel() Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ слСдуСт, поэтому ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ситуации сообщаСт макрос ASSERT().

На этапС 2 ΠΌΡ‹ вычисляСм ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ спрайта, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° пиксСлСй. Для этого снова ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ пСрСсСчСния:

CRect r1target = rect1 & irect;

r1target.OffsetRect(-rect1.left, -rect1.top);

r1target.right--;

r1target.bottom--;

CRect r2target = rect2 & irect;

r2target.OffsetRect(-rect2.left, -rect2.top);

r2target.right--;

r2target.bottom--;

Π’ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°Ρ… r1target ΠΈ r2target хранятся области спрайтов, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… потрСбуСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ пиксСлСй. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ пСрСсСчСниС Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, ΠΎΠ±Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΡΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CRect::OffsetRect() Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»Π΅Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΈΠΌΠ΅Π» ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ (0, 0). Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ поля right ΠΈ bottom ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CRect Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ повСрхностям ΠΎΠ±ΠΎΠΈΡ… спрайтов, Π° это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ систСмам ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ этих повСрхностСй.

Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΈ Π½ΠΈΠΆΠ½ΠΈΠΉ края ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΎΠ±Ρ€Π΅Π·Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ пиксСль. Π­Ρ‚ΠΎ связано с особСнностями Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CRect.

Π‘ΠžΠ’Π•Π’

КоС-Ρ‡Ρ‚ΠΎ ΠΎ классС CRect

Класс MFC CRect Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠΈ поля left ΠΈΠ· поля right ΠΏΠΎΠ»ΡƒΡ‡Π°Π»Π°ΡΡŒ ΡˆΠΈΡ€ΠΈΠ½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΡƒΠ΄ΠΎΠ±Π΅Π½, Π½ΠΎ смысл поля right нСсколько измСняСтся. НапримСр, рассмотрим ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅ left Ρ€Π°Π²Π½ΠΎ 0, Π° полю right присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4. Π’ соотвСтствии с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ класса CRect Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ ΡˆΠΈΡ€ΠΈΠ½Ρƒ Π² 4 ΠΏΠΈΠΊΡΠ΅Π»Ρ, Π½ΠΎ Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΆΠ΅ значСния для ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ пиксСлям, ΡˆΠΈΡ€ΠΈΠ½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° окаТСтся Ρ€Π°Π²Π½ΠΎΠΉ 5 ΠΏΠΈΠΊΡΠ΅Π»ΡΠΌ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½Π΅Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ пиксСли с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΎΡ‚ 0 Π΄ΠΎ 4). Π’Π°ΠΊΠΈΠ΅ ΠΆΠ΅ расхоТдСния Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΈ для ΠΏΠΎΠ»Π΅ΠΉ top ΠΈ bottom. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ поля CRect для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с пиксСлями, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π½Π° 1 значСния ΠΏΠΎΠ»Π΅ΠΉ right ΠΈ bottom.

Настоящая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° столкновСний происходит Π½Π° этапС 3. Бпособ Π΅Π΅ выполнСния зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π»ΠΈ ΠΎΠ±Π° спрайта ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ повСрхности ΠΎΠ±ΠΎΠΈΡ… спрайтов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Sprite::GetSurf():

LPDIRECTDRAWSURFACE surf1=sprite1->GetSurf();

LPDIRECTDRAWSURFACE surf2=sprite2->GetSurf();

Если повСрхности ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° выполняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠΌ:

if (surf1==surf2) {

 surf1->Lock(0, &desc1, DDLOCK_WAIT, 0);

 surfptr1=(BYTE*)desc1.lpSurface;

 for (int yy=0;yy<height;yy++)  {

  for (int xx=0;xx>width;xx++)  {

   pixel1=surfptr1+(yy+r1target.top)*desc1.lPitch +(xx+r1target.left);

   pixel2=surfptr1+(yy+r2target.top)*desc1.lPitch +(xx+r2target.left);

   if (*pixel1 && *pixel2) {

    ret=TRUE;

    goto done_same_surf;

   }

  }

 }

done_same_surf:

 surf1->Unlock(surfptr1);

 return ret;

}

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π΅Π΅ памяти. ПослС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ пиксСли повСрхности ΠΈ ΠΏΠΎ Π½ΠΈΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π»ΠΈ столкновСниС. Π’ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»Π°Ρ… содСрТимоС памяти просматриваСтся Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ€Π°Π·Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ спрайта. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ Π΄Π²Π° пиксСля (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ спрайта), Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π½Π° экранС. Π‘Ρ‚ΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ считаСтся ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ, Ссли ΠΎΠ±Π° пиксСля ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌΠΈ. НаконСц, Π½Π° этапС 4 функция снимаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ с повСрхности ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE ΠΈΠ»ΠΈ FALSE.

Если Π΄Π²Π° спрайта находятся Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… повСрхностях, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° столкновСний выполняСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SpritesCollidePixel(). НиТС снова ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ листинга 9.1:

surf1->Lock(0, &desc1, DDLOCK_WAIT, 0);

surfptr1=(BYTE*)desc1.lpSurface;

surf2->Lock(0, &desc2, DDLOCK_WAIT, 0);

surfptr2=(BYTE*)desc2.lpSurface;

for (int yy=0;yy<height;yy++) {

 for (int xx=0;xx>width;xx++) {

  pixel1=surfptr1+(yy+r1target.top)*desc1.lPitch +(xx+r1target.left);

  pixel2=surfptr2+(yy+r2target.top)*desc2.lPitch +(xx+r2target.left);

  if (*pixel1 && *pixel2) {

   ret=TRUE;

   goto done;

  }

 }

}

done:

surf2->Unlock(surfptr2);

surf1->Unlock(surfptr1);

return ret;

Π­Ρ‚ΠΎΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Π΅ повСрхности ΠΈ каТдая ΠΈΠ· Π½ΠΈΡ… просматриваСтся ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π‘Ρ‚ΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ снова обнаруТиваСтся ΠΏΠΎ совпадСнию Π΄Π²ΡƒΡ… Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹Ρ… пиксСлСй. ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE ΠΈΠ»ΠΈ FALSE, ΠΎΠ½Π° снимаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ с ΠΎΠ±Π΅ΠΈΡ… повСрхностСй.

Класс Sprite 

Π’ ΠΊΠΎΠ΄Π΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° класс Sprite использовался для прСдставлСния спрайтов, провСряСмых Π½Π° столкновСниС. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½.

Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, класс Sprite содСрТит ряд Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ столкновСний ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ свСдСния ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ спрайтС. Π’ частности, функция GetRect() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π½Ρ‹ΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ спрайта, Π° функция GetSurf() β€” ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находится спрайт. Однако класс Sprite Π½Π΅ ограничиваСтся функциями простого ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° для Π΄Π°Π½Π½Ρ‹Ρ… спрайта. Он ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ для обнаруТСния столкновСний, сколько для ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

На ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ΅ столкновСниС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΏΡ€ΠΎΡ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ столкновСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π½ΠΎ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Ρ‚Π°ΠΊ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ±Ρ‰ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ.

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

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