Π ΠΌΠ΅ΡΠΎΠ΄Π΅ 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 β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ Ρ ΠΎΠ»ΡΡ ΠΌΠΈΠ΄Π»Π΅ΡΠ° Henwayimport 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())