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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ³Ρ€ для ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 29

Автор Майкл ΠœΠΎΡ€Ρ€ΠΈΡΠΎΠ½

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ update() ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пСрСмСщСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π» Π»ΠΈ Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΎΠΊ Ρ‡Π΅Ρ€Π΅Π· шоссС. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΠΈΠΉ, пСрСбрался Π»ΠΈ Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΎΠΊ Ρ‡Π΅Ρ€Π΅Π· шоссС:

if (chickenSprite.getX() > 154) { //Число 154 ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ исходя ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡˆΠΈΡ€ΠΈΠ½Π° Π΄ΠΎΡ€ΠΎΠ³ΠΈ Ρ€Π°Π²Π½Π° 154 пиксСлям

// воспроизвСсти Π·Π²ΡƒΠΊ, Ссли Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΎΠΊ ΡƒΠ΄Π°Ρ‡Π½ΠΎ пСрСбрался Ρ‡Π΅Ρ€Π΅Π· шоссС

AlertType.WARNING.playSound(display);

// Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ° Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ счСт

chickenSprite.setPosition(2, 77);

score += 25;

}

Число 154 ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΌ экранС, Π³Π΄Π΅ заканчиваСтся шоссС. Если Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΎΠΊ находится дальшС этой ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π» Ρ‡Π΅Ρ€Π΅Π· шоссС. Π’ этом случаС воспроизводится Π·Π²ΡƒΠΊ, спрайт Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ° возвращаСтся Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π° счСт увСличиваСтся Π½Π° 25 ΠΎΡ‡ΠΊΠΎΠ². Но спрайт Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ° – это Π½Π΅ СдинствСнный спрайт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСмСщаСтся ΠΏΠΎ экрану. ΠœΠ΅Ρ‚ΠΎΠ΄ update() Ρ‚Π°ΠΊΠΆΠ΅ провСряСт ΠΈ двиТущиСся спрайты Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ:

for (int i = 0; i < 4; i++) {

// ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ спрайты Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ

carSprite[i].move(0, carYSpeed[i]);

checkBounds(carSprite[i], true);

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ столкновСниС спрайта Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ° ΠΈ спрайтов Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ

if (chickenSprite.collidesWith(carSprite[i], true)) {

// воспроизвСсти Π·Π²ΡƒΠΊ Π² случаС Π³ΠΈΠ±Π΅Π»ΠΈ Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ°

AlertType.ERROR.playSound(display);

// Check for a game over

if (–numLives == 0) {

gameOver = true;

} else {

// Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ°

chickenSprite.setPosition(2, 77); //Если ΠΈΠ³Ρ€Π° Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°, Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΎΠΊ возвращаСтся Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π΄ΠΎΡ€ΠΎΠ³Ρƒ.ΠΌ

}

// Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ спрайты Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ

break;

}

}

ВсС спрайты Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, ΠΈΡ… скорости хранятся Π² массивС carYSpeed. Π—Π°Ρ‚Π΅ΠΌ выполняСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, достиг Π»ΠΈ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΉ стороны экрана, для Ρ‡Π΅Π³ΠΎ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ checkBounds() со Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ true. НаиболСС Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ – это Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ столкновСний спрайтов Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ° ΠΈ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ. Если ΠΎΠ½ΠΈ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ, Ρ‚ΠΎ воспроизводится Π·Π²ΡƒΠΊ «ошибка» ΠΈ пСрСмСнная numLives ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° 1. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π°Π²Π½ΠΎ 0, Ρ‚ΠΎ ΠΈΠ³Ρ€Π° Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ gameOver приравниваСтся true. Если Π½Π΅Ρ‚, ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ спрайта Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ° обнуляСтся, Π° ΠΈΠ³Ρ€Π° возобновляСтся. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ столкновСнии спрайтов Ρ†ΠΈΠΊΠ» прСрываСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ нСобходимости ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Π±Ρ‹Π» Π»ΠΈ сбит Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΎΠΊ Π΅Ρ‰Π΅ Ρ€Π°Π·. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΈΠ³Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, ΠΌΠ΅Ρ‚ΠΎΠ΄ draw() класса HCanvas ΠΎΡ‡Π΅Π½ΡŒ прост. ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ выполняСт, β€“ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

g.drawImage(background, 0, 0, Graphics.TOP | Graphics.LEFT);

ПослС этого выводится число ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ ΠΆΠΈΠ·Π½Π΅ΠΉ Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ°:

for (int i = 0; i < numLives; i++)

g.drawImage(chickenHead, 180 – ((i + 1) * 8), 170, Graphics.TOP |

Graphics.LEFT);

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

chickenSprite.paint(g);

Π‘ΠΏΡ€Π°ΠΉΡ‚Ρ‹ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ нСслоТно, просто Π²Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ paint() Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π°:

for (int i = 0; i < 4; i++) carSprite[i].paint(g);

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, послСднСС, Ρ‡Ρ‚ΠΎ остаСтся вывСсти, β€“ это сообщСниС Β«game overΒ» (ΠΈΠ³Ρ€Π° Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°), Π½ΠΎ Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС, Ссли ΠΈΠ³Ρ€Π° Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ это:

if (gameOver) {

// вывСсти сообщСниС ΠΎ ΠΊΠΎΠ½Ρ†Π΅ ΠΈΠ³Ρ€Ρ‹ ΠΈ счСт

g.setColor(255, 255, 255); // white

g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD,

Font.SIZE_LARGE));

g.drawString("GAME OVER", 90, 40, Graphics.TOP | Graphics.HCENTER);

g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD,

Font.SIZE_MEDIUM));

g.drawString("You scored " + score + " points.", 90, 70, Graphics.TOP |

Graphics.HCENTER);

}

Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки тСкста ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡˆΡ€ΠΈΡ„Ρ‚ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, поэтому сообщСниС Β«game overΒ» большС, Π½Π΅ΠΆΠ΅Π»ΠΈ Π½Π°Π±Ρ€Π°Π½Π½ΠΎΠ΅ число ΠΎΡ‡ΠΊΠΎΠ². Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного Π² этом ΠΊΠΎΠ΄Π΅ Π½Π΅Ρ‚. ПослСдний Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ, β€“ это ΠΊΠΎΠ΄ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° checkBounds(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ спрайт Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ»ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ дальнСйшСС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅:

if (wrap) {

// ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΠΈΡ‚ΡŒ спрайт Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

if (sprite.getX() < -sprite.getWidth()) //Код ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ достиТСниС спрайтами Π³Ρ€Π°Π½ΠΈΡ† экрана

sprite.setPosition(getWidth(), sprite.getY());

else if (sprite.getX() > getWidth())

sprite.setPosition(-sprite.getWidth(), sprite.getY());

if (sprite.getY() < -sprite.getHeight())

sprite.setPosition(sprite.getX(), getHeight());

else if (sprite.getY() > getHeight())

sprite.setPosition(sprite.getX(), -sprite.getHeight());

}

else {

// ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ спрайт Ρƒ края экрана

if (sprite.getX() < 0) //Код прСдохраняСт спрайты ΠΎΡ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π° Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ экрана

sprite.setPosition(0, sprite.getY());

else if (sprite.getX() > (getWidth() – sprite.getWidth()))

sprite.setPosition(getWidth() – sprite.getWidth(), sprite.getY());

if (sprite.getY() < 0)

sprite.setPosition(sprite.getX(), 0);

else if (sprite.getY() > (getHeight() – sprite.getHeight()))

sprite.setPosition(sprite.getX(), getHeight() – sprite.getHeight());

}

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ этого ΠΊΠΎΠ΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° ΠΊΠΎΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° chackBounds() ΠΌΠΈΠ΄Π»Π΅Ρ‚Π° UFO 2. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π±Π»ΠΎΠΊ – Π½ΠΎΠ²Ρ‹ΠΉ, ΠΎΠ½ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ спрайта. По ΠΌΠ΅Ρ€Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ½ΠΈΠ³ΠΎΠΉ Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ checkBounds() ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ примСняСтся Π² ΠΈΠ³Ρ€Π°Ρ….

Π₯отя я Π½Π΅ Ρ…ΠΎΡ‡Ρƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ большиС листинги, стоит ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° класс HCanvas Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. Π’ листингС 7.1 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ класса HCanvas.

Листинг 7.1. Класс HCanvas – это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ холст ΠΌΠΈΠ΄Π»Π΅Ρ‚Π° Henway

import javax.microedition.lcdui.*;

import javax.microedition.lcdui.game.*;

import java.util.*;

import java.io.*;

public class HCanvas extends GameCanvas implements Runnable {

private Display display;

private boolean sleeping;

private long frameDelay;

private int inputDelay;

private Random rand;

private Image background;

private Image chickenHead;

private Sprite chickenSprite;

private Sprite[] carSprite = new Sprite[4];

private int[] carYSpeed = new int[4];

private boolean gameOver;

private int numLives;

private int score;

public HCanvas(Display d) {

super(true);

display = d;

// Set the frame rate (30 fps)

frameDelay = 33;

// ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π²Π²ΠΎΠ΄Π°

inputDelay = 0;

}

public void start() {

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ холст ΠΊΠ°ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ экран

display.setCurrent(this);

// ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл

rand = new Random();

// инициализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

gameOver = false;

numLives = 3;

score = 0;

// инициализация Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ изобраТСния ΠΈ спрайтов

try {

background = Image.createImage("/Highway.png");

chickenHead = Image.createImage("/ChickenHead.png");

chickenSprite = new Sprite(Image.createImage("/Chicken.png"), 22, 22);

chickenSprite.setPosition(2, 77);

carSprite[0] = new Sprite(Image.createImage("/Car1.png"));

carSprite[0].setPosition(27, 0);

carYSpeed[0] = 3;

carSprite[1] = new Sprite(Image.createImage("/Car2.png"));

carSprite[1].setPosition(62, 0);

carYSpeed[1] = 1;

carSprite[2] = new Sprite(Image.createImage("/Car3.png"));

carSprite[2].setPosition(93, 67);

carYSpeed[2] = -2;

carSprite[3] = new Sprite(Image.createImage("/Car4.png"));

carSprite[3].setPosition(128, 64);

carYSpeed[3] = -5; //ПослСдний Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ – самый быстрый

}

catch (IOException e) {

System.err.println("Failed loading images!");

}

// Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

sleeping = false;

Thread t = new Thread(this);

t.start();

}

public void stop() {

// ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ

sleeping = true;

}

public void run() {

Graphics g = getGraphics();

// основной ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Ρ†ΠΈΠΊΠ»

while (!sleeping) {

update();

draw(g);

try {

Thread.sleep(frameDelay);

}

catch (InterruptedException ie) {}

}

}

private void update() {

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π»ΠΈ ΠΈΠ³Ρ€Π°

if (gameOver) {

int keyState = getKeyStates();

if ((keyState & FIRE_PRESSED) != 0) {

// Start a new game

chickenSprite.setPosition(2, 77);

gameOver = false;

score = 0;

numLives = 3;

}

// ΠΈΠ³Ρ€Π° ΠΎΠΊΠΎΠ½Ρ‡Π΅Π½Π°, Π½Π΅Ρ‚ нСобходимости обновлСния

return;

}

// ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄

if (++inputDelay > 2) {

int keyState = getKeyStates();

if ((keyState & LEFT_PRESSED) != 0) {

chickenSprite.move(-6, 0);

chickenSprite.nextFrame();

}

else if ((keyState & RIGHT_PRESSED) != 0) {

chickenSprite.move(6, 0);

chickenSprite.nextFrame();

}

if ((keyState & UP_PRESSED) != 0) {

chickenSprite.move(0, -6);

chickenSprite.nextFrame();

}

else if ((keyState & DOWN_PRESSED) != 0) {

chickenSprite.move(0, 6);

chickenSprite.nextFrame();

}

checkBounds(chickenSprite, false);

// ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π²Π²ΠΎΠ΄Π°

inputDelay = 0;

}

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π» Π»ΠΈ Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΎΠΊ Ρ‡Π΅Ρ€Π΅Π· шоссС

if (chickenSprite.getX() > 154) {

// воспроизвСсти Π·Π²ΡƒΠΊ, Ссли Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΎΠΊ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π» шоссС

AlertType.WARNING.playSound(display);

// Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ спрайт Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ° Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ счСт

chickenSprite.setPosition(2, 77);

score += 25;

}

// ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ спрайты Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ

for (int i = 0; i < 4; i++) {

// ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ спрайты Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ

carSprite[i].move(0, carYSpeed[i]);

checkBounds(carSprite[i], true); //Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ достиТСнии Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ экрана появятся Ρƒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ края

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ столкновСния ΠΌΠ΅ΠΆΠ΄Ρƒ спрайтами Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ ΠΈ спрайтом Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ°

if (chickenSprite.collidesWith(carSprite[i], true)) {

// воспроизвСсти Π·Π²ΡƒΠΊ ΠΏΡ€ΠΈ Π³ΠΈΠ±Π΅Π»ΠΈ Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ°

AlertType.ERROR.playSound(display);

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π° Π»ΠΈ ΠΈΠ³Ρ€Π°

if (–numLives == 0) {

gameOver = true;

} else {

// Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ спрайт Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ° Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

chickenSprite.setPosition(2, 77);

}

// Π½Π΅Ρ‚ нСобходимости ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ спрайты Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»Π΅ΠΉ

break;

}

}

}

private void draw(Graphics g) {

// вывСсти Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

g.drawImage(background, 0, 0, Graphics.TOP | Graphics.LEFT);

// вывСсти число ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ ΠΆΠΈΠ·Π½Π΅ΠΉ

for (int i = 0; i < numLives; i++) //Ряд ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ цыплят ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ число ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ ΠΆΠΈΠ·Π½Π΅ΠΉ

g.drawImage(chickenHead, 180 – ((i + 1) * 8), 170, Graphics.TOP |

Graphics.LEFT);

// Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ спрайт Ρ†Ρ‹ΠΏΠ»Π΅Π½ΠΊΠ°

chickenSprite.paint(g);

// Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ спрайт автомобиля

for (int i = 0; i < 4; i++)

carSprite[i].paint(g);

if (gameOver) {

// вывСсти сообщСниС ΠΎ ΠΊΠΎΠ½Ρ†Π΅ ΠΈΠ³Ρ€Ρ‹ ΠΈ счСт

g.setColor(255, 255, 255); // Π±Π΅Π»Ρ‹ΠΉ

g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD,

Font.SIZE_LARGE));

g.drawString("GAME OVER", 90, 40, Graphics.TOP | Graphics.HCENTER);

g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD,

Font.SIZE_MEDIUM));

g.drawString("You scored " + score + " points.", 90, 70, Graphics.TOP |

Graphics.HCENTER);

}

// вывСсти содСрТимоС Π±ΡƒΡ„Π΅Ρ€Π° Π½Π° экран

flushGraphics();

}

private void checkBounds(Sprite sprite, boolean wrap) {

// ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ/ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ спрайт

if (wrap) {

// ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ спрайт Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

if (sprite.getX() < -sprite.getWidth())