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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ КПК ΠΈ смартфонов Π½Π° .NET Compact FrameworkΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 37

Автор АлСксандр Климов

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ пСрСчислСния Keys, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.15.

Листинг 11.15

/// <summary>

/// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ keyArgs Π² качСствС Ρ„Π»Π°Π³Π°

/// </summary>

private System.Windows.Forms.KeyEventArgs keyArgs = null;


private void Form1_KeyDown(object sender,

 System.Windows.Forms.KeyEventArgs e) {

 keyArgs = e;

}


private void Form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) {

 keyArgs = null;

}

Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² события Form1_KeyDown, Ρ„Π»Π°Π³ keyArgs ссылаСтся Π½Π° класс KeyEventArgs. ΠŸΡ€ΠΈ наступлСнии события Form1_KeyUp Ρ„Π»Π°Π³ keyArgs сбрасываСтся Π² null, ΠΈ ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚Ρ‹Ρ… клавиш игнорируСтся. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ updatePositions, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.16.

Листинг 11.16

private void updatePositions() {

 // Код для кусочка сыра остался ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ

 ...


 // Для Π±Π°Ρ‚ΠΎΠ½Π° Ρ…Π»Π΅Π±Π°

 if (keyArgs != null) {

  switch (keyArgs.KeyCode) {

  case Keys.Up:

   by-=ySpeed;

   break;

  case Keys.Down:

   by+=ySpeed;

   break;

  case Keys.Left:

   bx-=xSpeed;

   break;

  case Keys.Right:

   bx+=xSpeed;

   break;

  }

 }

}

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

ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ столкновСний

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

Рис. 11.4. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Π”Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»ΠΎΠ² ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π’ .NET Compact Framework сущСствуСт структура RECTANGLE, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ эти ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. НСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эту структуру для обнаруТСния пСрСсСчСния Π΄Π²ΡƒΡ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ². Π‘ ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ столкновСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π Π°Π½Π΅Π΅ использовавшиСся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π°Π΄ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ структурой RECTANGLE, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ информация ΠΎ мСстонахоТдСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.17.

Листинг 11.17

/// <summary>

/// ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ для сыра

/// </summary>

private Rectangle cheeseRectangle;


/// <summary>

/// ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ для Π±Π°Ρ‚ΠΎΠ½Π° Ρ…Π»Π΅Π±Π°

/// </summary>

private Rectangle breadRectangle;

Π‘Ρ€Π°Π·Ρƒ послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π°Π΄ΠΎ ввСсти ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 11.18.

Листинг 11.18

// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ

cheeseRectangle = new Rectangle(0, 0, cheeseImage.Width.cheeseImage.Height);

breadRectangle = new Rectangle(0, 0, breadImage.Width, breadImage.Height);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ Π½Π° экран Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Form1_Paint ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 11.19.

Листинг 11.19

g.DrawImage(breadImage, breadRectangle.X, breadRectangle.Y);

g.DrawImage(cheeseImage, cheeseRectangle.X, cheeseRectangle.Y);

ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ свойств X ΠΈ Y этих ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ экрану. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ updatePosition Π½Π°Π΄ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΡƒΡŽ Π·Π° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ сыра ΠΈ Π±Π°Ρ‚ΠΎΠ½Π°, с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ созданных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.20.

Листинг 11.20

private void updatePositions() {

 // Π”Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ кусочка сыра

 if (goingRight) {

  cheeseRectangle.X += xSpeed;

 } else {

  cheeseRectangle.X -= xSpeed;

 }

 if ((cheeseRectangle.X + cheeseImage.Width) >= this.Width) {

  goingRight = false;

 }

 if (cheeseRectangle.X <= 0) {

  goingRight = true;

 }

 if (goingDown) {

  cheeseRectangle.Y += ySpeed;

 } else {

  cheeseRectangle.Y -= ySpeed;

 }

 if ((cheeseRectangle.Y + cheeseImage.Height) >= this.Height) {

  goingDown = false;

 }

 if (cheeseRectangle.Y <= 0) {

  goingDown = true;

 }


 // Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π°Ρ‚ΠΎΠ½ΠΎΠΌ

 if (keyArgs != null) {

  switch (keyArgs.KeyCode) {

  case Keys.Up:

   breadRectangle.Y -= ySpeed;

   break;

  case Keys.Down:

   breadRectangle.Y += ySpeed;

   break;

  case Keys.Left:

   breadRectangle.X -= xSpeed;

   break;

  case Keys.Right:

   breadRectangle.X += xSpeed;

   break;

  }

 }

 /// ΠΈ Π΄Π°Π»Π΅Π΅...

Когда сыр ударяСтся ΠΎ Π±Π°Ρ‚ΠΎΠ½ Ρ…Π»Π΅Π±Π°, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΡΠΊΠΎΡ‡ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎΠ³ΠΎ эффСкта ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, просто ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² направлСния двиТСния ΠΏΠΎ оси Y Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ updatePosition, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.21.

Листинг 11.21

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° столкновСниС

if (cheeseRectangle.IntersectsWith(breadRectangle)) {

 goingDown = !goingDown;

}

ΠœΠ΅Ρ‚ΠΎΠ΄ IntersectsWith ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ². Если ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ, Ρ‚ΠΎ возвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True, послС Ρ‡Π΅Π³ΠΎ мСняСтся Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ двиТСния сыра.

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

БтолкновСния Π±Π°Ρ‚ΠΎΠ½Π° ΠΈ мяча

Π₯отя ΠΊΠΎΠ΄ Π²ΠΏΠΎΠ»Π½Π΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, всС-Ρ‚Π°ΠΊΠΈ хочСтся большС Ρ€Π΅Π°Π»ΠΈΠ·ΠΌΠ°. ΠžΡ‚Π²Π»Π΅Ρ‡Π΅ΠΌΡΡ Π½Π° ΠΌΠΈΠ½ΡƒΡ‚ΠΊΡƒ ΠΈ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ столкновСний мячСй с ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΌ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠΌ (рис. 11.5).

Рис. 11.5. Π‘Ρ‚ΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Когда мяч ударяСтся ΠΎ ΠΊΡ€ΡƒΠ³Π»Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠ½ отскакиваСт ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рисункС. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π²ΠΈΠ΄ столкновСния для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ мяча. По схоТСму ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.

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

Рис. 11.6. Π’ΠΈΠ΄Ρ‹ столкновСний

НуТно снова ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° updatePosition для Π½ΠΎΠ²ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ столкновСний, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.22.

Листинг 11.22

if (goingDown) {

 // Ссли сыр двиТСтся Π²Π½ΠΈΠ·

 if (cheeseRectangle.IntersectsWith(breadRectangle)) {

  // столкновСниС

  bool rightIn =

   breadRectangle.Contains(cheeseRectangle.Right, cheeseRectangle.Bottom);

  bool leftIn =

   breadRectangle.Contains(cheeseRectangle.Left, cheeseRectangle.Bottom);

  // способ отраТСния

  if (rightIn & leftIn) {

   // отраТаСтся Π²Π²Π΅Ρ€Ρ…

   goingDown = false;

  } else {

   // отраТаСтся Π²Π²Π΅Ρ€Ρ…

   goingDown = false;

   // Π² зависимости ΠΎΡ‚ Π²ΠΈΠ΄Π° столкновСний

   if (rightIn) {

    goingRight = false;

   }

   if (leftIn) {

    goingRight = true;

   }

  }

 }

}

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сыр отскакиваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ Π² ниТнюю Ρ‡Π°ΡΡ‚ΡŒ экрана. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ Π½Π΅ Π΄Π°Ρ‚ΡŒ сыру ΡƒΠΏΠ°ΡΡ‚ΡŒ Π½Π° Π΄Π½ΠΎ экрана, отбивая Π΅Π³ΠΎ Π±Π°Ρ‚ΠΎΠ½ΠΎΠΌ.

НовыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΈΠ³Ρ€Ρƒ Π±ΡƒΠ΄ΡƒΡ‚ Π²Π²Π΅Π΄Π΅Π½Ρ‹ ΠΈ ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€Ρ‹. Π˜Ρ… изобраТСния Ρ‚ΠΎΠΆΠ΅ Π½Π°Π΄ΠΎ ввСсти Π² состав ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.23.

Листинг 11.23

/// <summary>

/// Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, содСрТащСС ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€

/// </summary>

private Image tomatoImage = null;


// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€Π°

tomatoImage = new System.Drawing.Bitmap(

 execAssem.GetManifestResourceStream(@"Bouncer.tomato.gif"));

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€ΠΎΠ² Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части экрана. ΠŸΠΎΠΌΠΈΠ΄ΠΎΡ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС мишСнСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒ, сбивая ΠΈΡ… кусочком сыра.

Для отслСТивания ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΉ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€Π° ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚ столкновСния. МоТно Π±Ρ‹Π»ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив, содСрТащий ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€Π°, Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ структурой, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² листингС 11.24.