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

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

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

/// Π‘Ρ‡Π΅Ρ‚ Π² ΠΈΠ³Ρ€Π΅

/// </summary>

private int scoreValue = 0;


private void updatePositions() {

 if (cheeseRectangle.IntersectsWith(tomatoes[i].rectangle)) {

  // прячСм Ρ‚ΠΎΠΌΠ°Ρ‚

  tomatoes[i].visible = false;

  // отраТаСмся Π²Π½ΠΈΠ·

  goingDown = true;

  // обновляСм счСт

  scoreValue = scoreValue + 10;

  messageString = "Π‘Ρ‡Π΅Ρ‚: " + scoreValue;

  break;

 }

}

Π—Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΎΠΌΠ°Ρ‚ начисляСтся 10 ΠΎΡ‡ΠΊΠΎΠ². Π­Ρ‚ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ постоянно ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈ выводятся Π½Π° экран.

Π—Π²ΡƒΠΊΠΎΠ²Ρ‹Π΅ эффСкты

НСплохо Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΈΠ³Ρ€Ρƒ Π·Π²ΡƒΠΊΠΎΠ²Ρ‹Π΅ эффСкты. К соТалСнию, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° .NET Compact Framework ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ воспроизвСдСниС Π·Π²ΡƒΠΊΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ управляСмого ΠΊΠΎΠ΄Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ придСтся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Platform Invoke (P/Invoke). Π’ Π³Π»Π°Π²Π΅, посвящСнной Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Windows API, эта Ρ‚Π΅ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΠ²Π΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅

Для воспроизвСдСния Π·Π²ΡƒΠΊΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ Ρ„Π°ΠΉΠ» Π² саму ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠ°ΠΊ это дСлалось с изобраТСниями, Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Ρ‚ΡŒ сам Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ располоТСн Π³Π΄Π΅-Ρ‚ΠΎ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС.

Π’ этом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ трСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс для воспроизвСдСния Π·Π²ΡƒΠΊΠΎΠ². НуТно Ρ‰Π΅Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Bouncer Π² ΠΎΠΊΠ½Π΅ Solution Explorer ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ контСкстного мСню Addβ–ΊNew Item... Π’ ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΌΡΡ ΠΎΠΊΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ элСмСнт Class ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ имя Sound.cs. ПослС наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ Add Π½ΠΎΠ²Ρ‹ΠΉ класс Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

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

Π’ Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π° Sound.cs Π½Π°Π΄ΠΎ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ строки для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… пространств ΠΈΠΌΠ΅Π½, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.36.

Листинг 11.36

using System.Runtime.InteropServices;

using System.IO;

Наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ со Π·Π²ΡƒΠΊΠΎΠΌ просто Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² памяти Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ массив с Π°ΡƒΠ΄ΠΈΠΎΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠΌ. Для обращСния ΠΊ этому Π±Π»ΠΎΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, способная ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π²ΡƒΠΊΠΈ. Π’ классС Sound Π±Π»ΠΎΠΊ памяти ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.37.

Листинг 11.37

/// <summary>

/// массив Π±Π°ΠΉΡ‚ΠΎΠ², содСрТащий Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π·Π²ΡƒΠΊΠ΅

/// </summary>

private byte[] soundBytes;

Π­Ρ‚Π° конструкция Π½Π΅ создаСт массив, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π΅Π³ΠΎ. Массив Π±ΡƒΠ΄Π΅Ρ‚ создан ΠΏΡ€ΠΈ конструировании экзСмпляра класса, вСдь ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° нСизвСстСн.

Код конструктора ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.38.

Листинг 11.38

/// <summary>

/// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ экзСмпляра sound ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ Π·Π²ΡƒΠΊΠ΅

/// </summary>

/// <param name="soundStream">ΠΏΠΎΡ‚ΠΎΠΊ для чтСния Π·Π²ΡƒΠΊΠ°</param>

public Sound(Stream soundStream) {

 // создаСм массив Π±Π°ΠΉΡ‚ΠΎΠ² для ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ…

 soundBytes = new byte[soundStream.Length];

 // Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°

 soundStream.Read(soundBytes, 0, (int)soundStream.Length);

}

ΠŸΠΎΡ‚ΠΎΠΊ связываСтся с Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ источником Π΄Π°Π½Π½Ρ‹Ρ…. Он ΠΈΠΌΠ΅Π΅Ρ‚ свойство Length, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ массива. ΠœΠ΅Ρ‚ΠΎΠ΄ Read примСняСтся для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, послС Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Π΅ Π±Π°ΠΉΡ‚Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² массивС. Π—Π²ΡƒΠΊΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ хранятся Π² Π²ΠΈΠ΄Π΅ рСсурсов, ΠΊΠ°ΠΊ ΠΈ изобраТСния.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π²ΡƒΠΊΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ click.wav ΠΈ burp.wav ΠΈ для ΠΈΡ… свойства Build Action Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Embedded Resources. Π’Π΅ΠΏΠ΅Ρ€ΡŒ доступ ΠΊ Π·Π²ΡƒΠΊΠΎΠ²Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ просто, Ρ‡Ρ‚ΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 11.39.

Листинг 11.39

/// <summary>

/// Π—Π²ΡƒΠΊ, воспроизводимый ΠΏΡ€ΠΈ столкновСнии с Π±Π°Ρ‚ΠΎΠ½ΠΎΠΌ Ρ…Π»Π΅Π±Π°

/// </summary>

private Sound batHitSound;


/// <summary>

/// Π—Π²ΡƒΠΊ, воспроизводимый ΠΏΡ€ΠΈ столкновСнии с ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€ΠΎΠΌ

/// </summary>

private Sound tomatoHitSound;


// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π·Π²ΡƒΠΊ ΠΏΡ€ΠΈ столкновСнии с Π±Π°Ρ‚ΠΎΠ½ΠΎΠΌ Ρ…Π»Π΅Π±Π°

batHitSound = new Sound

 (execAssem.GetManifestResourceStream(@"Bouncer.click.wav"));


// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π·Π²ΡƒΠΊ ΠΏΡ€ΠΈ столкновСнии с ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€ΠΎΠΌ

tomatoHitSound = new Sound

 (execAssem.GetManifestResourceStream(@"Bouncer.burp.wav"));

Для воспроизвСдСния Π·Π²ΡƒΠΊΠ° Π² класс Sound Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Play, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.40.

Листинг 11.40

/// <summary>

/// Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π²ΡƒΠΊΠΎΠΌ Π² ΠΈΠ³Ρ€Π΅ (Π’ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ)

/// </summary>

public static bool Enabled = true;


/// <summary>

/// ΠŸΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅ΠΌ Π·Π²ΡƒΠΊ

/// </summary>

public void Play() {

 if (Sound.Enabled) {

  WCE_PlaySoundBytes(soundBytes, IntPtr.Zero,

   (int)(Flags.SND_ASYNC | Flags.SND_MEMORY));

 }

}

ΠœΠ΅Ρ‚ΠΎΠ΄ Play провСряСт Ρ„Π»Π°Π³ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Enabled. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π·Π²ΡƒΠΊ Π² ΠΈΠ³Ρ€Π΅. ВоспроизвСдСниС Π·Π²ΡƒΠΊΠ° обСспСчиваСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Windows API WCE_PlaySoundBytes, Ρ‡Ρ‚ΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 11.41.

Листинг 11.41

private enum Flags {

 SND_SYNC = 0x0000,

 SND_ASYNC = 0x0001,

 SND_NODEFAULT = 0x0002,

 SND_MEMORY = 0x0004,

 SND_LOOP = 0x0008,

 SND_NOSTOP = 0x0010,

 SND_NOWAIT = 0x00002000,

 SND_ALIAS = 0x00010000,

 SND_ALIASID = 0x00110000,

 SND_FILENAME = 0x00020000,

 SND_RESOURCE = 0x00040004

}


/// <summary>

/// Ѐункция Windows API для воспроизвСдСния Π·Π²ΡƒΠΊΠ°.

/// </summary>

/// <param name="szSound">Массив Π±Π°ΠΉΡ‚ΠΎΠ², содСрТащих Π΄Π°Π½Π½Ρ‹Π΅ /// </param>

/// <param name="hMod">ДСскриптор ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ, содСрТащСму Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ

/// рСсурс</param>

/// <param name="flags">Π€Π»Π°Π³ΠΈ для управлСния Π·Π²ΡƒΠΊΠΎΠΌ</param>

/// <returns></returns>

[DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]

private extern static int WCE_PlaySoundBytes( byte[] szSound,

 IntPtr hMod, int flags);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° создан экзСмпляр класса Sound, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π²ΡƒΠΊ ΠΏΡ€ΠΈ столкновСнии сыра с Π±Π°Ρ‚ΠΎΠ½ΠΎΠΌ Ρ…Π»Π΅Π±Π°. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.42.

Листинг 11.42

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

if (cheeseRectangle.IntersectsWith(breadRectangle)) {

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

 // воспроизводим ΡƒΠ΄Π°Ρ€

 batHitSound.Play();

}

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π·Π²ΡƒΠΊΠ°. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π·Π²ΡƒΠΊ ΠΏΡ€ΠΈ столкновСнии сыра с ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€Π°ΠΌΠΈ. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.43.

Листинг 11.43

if (cheeseRectangle.IntersectsWith(tomatoes[i].rectangle)) {

 // воспроизводим Π·Π²ΡƒΠΊ столкновСния сыра с ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€ΠΎΠΌ

 tomatoHitSound.Play();

}

Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ

Но ΠΈΠ³Ρ€Ρƒ всС Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ спискС ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

β–‘ Π Π΅ΠΆΠΈΠΌ Β«attractΒ», Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚.

β–‘ ΠŸΠΎΡ‚Сря ΠΆΠΈΠ·Π½ΠΈ, Ссли сыр ударился ΠΎ ниТнюю Π³Ρ€Π°Π½ΠΈΡ†Ρƒ экрана.

β–‘ ΠŸΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ всСх Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠ² ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅, ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈΠ³Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Π° возрасти.

β–‘ Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΈΠ³Ρ€Ρƒ случайных элСмСнтов.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π°Π΄ΠΎ ввСсти Π±ΡƒΠ»Π΅Π²Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ gameLive, которая ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π΅Π΄Π΅Ρ‚ ΠΈΠ³Ρ€Ρƒ. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π²Π½ΠΎ False, Ρ‚ΠΎ сыр Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΏΠΎ экрану, Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… дСйствий ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

Для этого потрСбуСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΏΡ€ΠΈ стартС ΠΈΠ³Ρ€Ρ‹. Новая вСрсия ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 11.44.

Листинг 11.44

/// <summary>

/// True, Ссли ΠΈΠ³Ρ€Π° Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π½Π° экранС.

/// </summary>

private bool gameLive = false;


/// <summary>

/// Число ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ ΠΆΠΈΠ·Π½Π΅ΠΉ.

/// </summary>

private int livesLeft;


/// <summary>

/// Число ΠΆΠΈΠ·Π½Π΅ΠΉ, доступных для ΠΈΠ³Ρ€ΠΎΠΊΠ°.

/// </summary>

private int startLives = 3;


private void startGame() {

 // УстанавливаСм число ΠΆΠΈΠ·Π½Π΅ΠΉ, счСт ΠΈ сообщСния

 livesLeft = startLives;

 scoreValue = 0;

 messageString = "Π‘Ρ‡Π΅Ρ‚: 0 Π–ΠΈΠ·Π½ΡŒ: " + livesLeft;


 // РасполагаСм ΠΏΠΎΠΌΠΈΠ΄ΠΎΡ€Ρ‹ Π½Π°Π²Π΅Ρ€Ρ…Ρƒ экрана

 tomatoDrawHeight = tomatoLevelStartHeight;

 placeTomatoes();


 // ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΠΌ Π±Π°Ρ‚ΠΎΠ½ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана

 breadRectangle.X = (this.ClientSize.Width - breadRectangle.Width) / 2;

 breadRectangle.Y = this.ClientSize.Height / 2;


 // ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΠΌ сыр Π½Π°Π΄ Π±Π°Ρ‚ΠΎΠ½ΠΎΠΌ Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана

 cheeseRectangle.X = (this.ClientSize.Width - cheeseRectanglΠ΅.Width) / 2;

 cheeseRectangle.Y = breadRectangle.Y β€” cheeseRectangle.Height;


 // Установим Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ