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

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

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

private Sprite[] roidSpace = new Sprite[3];

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ start() выполняСтся инициализация спрайтов астСроида ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:

Image img = Image.createImage(Β«/Roid.pngΒ»);

roidSprite[0] = new Sprite(img, 42, 35);

roidSprite[1] = new Sprite(img, 42, 35);

roidSprite[2] = new Sprite(img, 42, 35);

Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ астСроида (Roid.png) создаСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π° Π·Π°Ρ‚Π΅ΠΌ пСрСдаСтся ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ конструктору спрайта. Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ измСнилось ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΠ›Πž:

ufoSprite.setPosition((getWidth() – ufoSprite.getWidth()) / 2, (getHeight() – ufoSprite.getHeight()) / 2);

Π₯отя этот ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным, Π½ΠΎ ΠΎΠ½ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного, просто Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ спрайт Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ экрана, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΠ›Πž сразу Π½Π΅ столкнулся с астСроидом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ стартуСт ΠΈΠ· Ρ‚ΠΎΡ‡ΠΊΠΈ (0,0). Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ update() находятся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ интСрСсныС Π½ΠΎΠ²Ρ‹Π΅ строки ΠΊΠΎΠ΄Π°. Вся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° сосрСдоточСна Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π°:

int keyState = getKeyStates();

if ((keyState & LEFT_PRESSED) != 0)

ufoXSpeed–;

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

ufoXSpeed++;

if ((keyState & UP_PRESSED) != 0)

ufoYSpeed–;

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

ufoYSpeed++;

ufoXSpeed = Math.min(Math.max(ufoXSpeed, -8), 8); //Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΠ›Πž устанавливаСтся случайно ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ -8 Π΄ΠΎ 8

ufoYSpeed = Math.min(Math.max(ufoYSpeed, -8), 8);

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ просто провСряСт наТатия Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… клавиш управлСния ΠΈ Π² соотвСтствии с этим измСняСт ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΠ›Πž. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² этом случаС ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° 8 Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, сколько Ρ€Π°Π· Π±Ρ‹Π»Π° Π½Π°ΠΆΠ°Ρ‚Π° Ρ‚Π° ΠΈΠ»ΠΈ иная клавиша. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π°, ΠΠ›Πž обновляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ:

ufoSprite.move(ufoXSpeed, ufoYSpeed); checkBounds(ufoSprite);

Π˜Π·Π²Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ move() ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ спрайт, Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ checkBounds() провСряСт, Π½Π΅ Π²Ρ‹ΡˆΠ΅Π» Π»ΠΈ ΠΠ›Πž Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ экрана. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π΅ измСнилась, Π½ΠΎ Π΅Π΅ ΠΊΠΎΠ΄ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΈ для астСроидов. Для этого нСцСлСсообразно ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, Ссли ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ. ОбновлСниС спрайтов астСроидов производится Π² Ρ†ΠΈΠΊΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π½Π°Ρ‡Π°Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°:

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

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅, β€“ это ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ астСроиды ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ Π²Ρ‹ΡˆΠ»ΠΈ Π»ΠΈ ΠΎΠ½ΠΈ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ экрана:

roidSprite[i].move(i + 1, 1 – i); checkBounds(roidSprite[i]);

ЕдинствСнная Ρ…ΠΈΡ‚Ρ€ΠΎΡΡ‚ΡŒ Π² этом ΠΊΠΎΠ΄Π΅ – пСрСмСщСния астСроидов. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ астСроид двигался со своСй особой ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ, для пСрСмСщСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ индСкс ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…. Аналогичный ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для измСнСния очСрСдности слСдования Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ:

if (i == 1)

roidSprite[i].prevFrame();

else

roidSprite[i].nextFrame();

ИдСя этого ΠΊΠΎΠ΄Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ астСроид вращаСтся Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ. Для этого достаточно ΠΏΡ€ΠΎΠ»ΠΈΡΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΡ‹ спрайта Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ…. ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π² Ρ†ΠΈΠΊΠ»Π΅ обновлСния астСроидов провСряСт ΠΈΡ… столкновСниС с ΠΠ›Πž:

if (ufoSprite.collidesWith(roidSprite[i], true)) {

// воспроизвСсти ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ Π·Π²ΡƒΠΊ

AlertType.ERROR.playSound(display);

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

ufoSprite.setPosition((getWidth() – ufoSprite.getWidth()) / 2, //Π‘ΠΏΡ€Π°ΠΉΡ‚ выводится Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ экрана, Π΅Π³ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π²Π½Π° 0

(getHeight() – ufoSprite.getHeight()) / 2);

ufoXSpeed = ufoYSpeed = 0;

for (int j = 0; j < 3; j++)

roidSprite[j].setPosition(0, 0);

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

break;

}

}

Если столкновСниС ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, Ρ‚ΠΎ воспроизводится стандартный Π·Π²ΡƒΠΊ возникновСния ошибки (ΠΎΠ½ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°), для Ρ‡Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ AlertType. Π’ Π³Π»Π°Π²Π΅ 8 Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ Π·Π²ΡƒΠΊΠΈ Π² ΠΈΠ³Ρ€Π°Ρ…. Π’ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ столкновСниС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΠ›Πž Π² исходноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ Π΅Π³ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ. Если Π±Ρ‹ Π²Ρ‹ создавали ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ, Ρ‚ΠΎ Π² этом мСстС Π²Ρ‹ Π±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΈ число ΠΆΠΈΠ·Π½Π΅ΠΉ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ, Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π° Π»ΠΈ ΠΈΠ³Ρ€Π°. Но Π² этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Ρ‹ просто измСняСтС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ спрайтов, ΠΈ анимация продолТаСтся. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΌΠΈΠ΄Π»Π΅Ρ‚ΠΎΠΌ UFO Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ draw() Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ – ΠΊΠΎΠ΄, Ρ€ΠΈΡΡƒΡŽΡ‰ΠΈΠΉ астСроиды:

for (int i = 0; i < 3; i++) roidSprite[i].paint(g);

На этом вСсь Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΈΠ΄Π»Π΅Ρ‚Π° UFO 2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½. Π’ листингС 6.1 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½ΠΎΠ²ΠΎΠ³ΠΎ класса UFOCanvas. Листинг 6.1. Класс UFOCanvas, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Ρ€ΠΎΠ»ΡŒ холста для ΠΌΠΈΠ΄Π»Π΅Ρ‚Π° UFO 2

import javax.microedition.lcdui.*;

import javax.microedition.lcdui.game.*;

import java.util.*;

import java.io.*;

public class UFOCanvas extends GameCanvas implements Runnable {

private Display display;

private boolean sleeping;

private long frameDelay;

private Random rand;

private Sprite ufoSprite;

private int ufoXSpeed, ufoYSpeed;

private Sprite[] roidSprite = new Sprite[3]; //Π’ ΠΈΠ³Ρ€Π΅ UFO 2 Π΅ΡΡ‚ΡŒ 3 спрайта астСроида

public UFOCanvas(Display d) {

super(true);

display = d;

// ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ частоту ΠΊΠ°Π΄Ρ€ΠΎΠ² (30 fps)

frameDelay = 33;

}

public void start() {

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

display.setCurrent(this);

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

rand = new Random();

// ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ спрайты ΠΠ›Πž ΠΈ астСроидов

ufoXSpeed = ufoYSpeed = 0;

try {

ufoSprite = new Sprite(Image.createImage("/Saucer.png"));

ufoSprite.setPosition((getWidth() – ufoSprite.getWidth()) / 2,

(getHeight() – ufoSprite.getHeight()) / 2);

Image img = Image.createImage("/Roid.png");

roidSprite[0] = new Sprite(img, 42, 35);

roidSprite[1] = new Sprite(img, 42, 35);

roidSprite[2] = new Sprite(img, 42, 35);

}

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() {

// ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ скорости ΠΠ›Πž

int keyState = getKeyStates();

if ((keyState & LEFT_PRESSED) != 0) //Клавиши со стрСлками ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΠ›Πž ΠΏΠΎ всСм Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ направлСниям

ufoXSpeed–;

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

ufoXSpeed++;

if ((keyState & UP_PRESSED) != 0)

ufoYSpeed–;

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

ufoYSpeed++;

ufoXSpeed = Math.min(Math.max(ufoXSpeed, -8), 8);

ufoYSpeed = Math.min(Math.max(ufoYSpeed, -8), 8);

// ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ спрайт ΠΠ›Πž

ufoSprite.move(ufoXSpeed, ufoYSpeed);

checkBounds(ufoSprite);

// ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ спрайты астСроидов

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

// ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ спрайты астСроидов

roidSprite[i].move(i + 1, 1 – i);

checkBounds(roidSprite[i]); //Π­Ρ‚Π° строка ΠΊΠΎΠ΄Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° отрисовку астСроида ΠΏΡ€ΠΈ достиТСнии Π³Ρ€Π°Π½ΠΈΡ† экрана

// ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌ астСроида

if (i == 1) //ИндСкс астСроида опрСдСляСт Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

roidSprite[i].prevFrame();

else

roidSprite[i].nextFrame();

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ столкновСниС ΠΠ›Πž с астСроидом

if (ufoSprite.collidesWith(roidSprite[i], true)) { //ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° collidesWith() Ρ€Π°Π²Π΅Π½ true, Ρ‚ΠΎ выполняСтся пиксСльноС Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ столкновСния

// воспроизвСсти ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ Π·Π²ΡƒΠΊ

AlertType.ERROR.playSound(display);

// Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ исходныС полоТСния ΠΈ скорости ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

ufoSprite.setPosition((getWidth() – ufoSprite.getWidth()) / 2,

(getHeight() – ufoSprite.getHeight()) / 2);

ufoXSpeed = ufoYSpeed = 0;

for (int j = 0; j < 3; j++)

roidSprite[j].setPosition(0, 0);

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

break;

}

}

}

private void draw(Graphics g) {

// Clear the display

g.setColor(0x000000);

g.fillRect(0, 0, getWidth(), getHeight());

// Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ спрайт ΠΠ›Πž

ufoSprite.paint(g);

// Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ спрайты астСроидов

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

roidSprite[i].paint(g);

// ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ содСрТимоС Π±ΡƒΡ„Π΅Ρ€Π° Π½Π° экранС

flushGraphics();

}

private void checkBounds(Sprite sprite) {

// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ спрайта

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());

}

}

Π’Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ со всСми тонкостями этого ΠΊΠΎΠ΄Π°, поэтому я избавлю вас ΠΎΡ‚ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… рассуТдСний. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

ВСстированиС прилоТСния

Π’Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΈΠ΄Π»Π΅Ρ‚ UFO 2 Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ интСрСснСС, Ρ‡Π΅ΠΌ всС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ прилоТСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π»Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. На рис. 6.4 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΌΠΈΠ΄Π»Π΅Ρ‚ UFO 2.

Рис. 6.4. Π’ ΠΌΠΈΠ΄Π»Π΅Ρ‚Π΅ UFO 2 Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π»Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ с астСроидами

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

РСзюмС

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ взаимодСйствиС ΠΈΠ³Ρ€ΠΎΠΊΠ° с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ – это критичСский Ρ„Π°ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈΠ³Ρ€. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» максимально эффСктивным Π² условиях ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса мобильного устройства. Π’ этой Π³Π»Π°Π²Π΅ шла Ρ€Π΅Ρ‡ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ мобильного устройства – это ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ просто. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ столкновСния спрайтов ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ²ΡƒΡŽ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ. Π₯отя, нСсомнСнно, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ UFO 2, созданный Π² этой Π³Π»Π°Π²Π΅, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ, ΠΎΠ½ сочСтаСт Π² сСбС всС элСмСнты Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ мобильной ΠΈΠ³Ρ€Ρ‹.

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

Π•Ρ‰Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ± ΠΈΠ³Ρ€Π°Ρ…

ΠŸΠΎΡ€Π° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΡ€Π΅Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅! Π― Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ спрайт Π² ΠΌΠΈΠ΄Π»Π΅Ρ‚ UFO 2. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ спутник, странный ΠΏΡ€ΠΈΡˆΠ΅Π»Π΅Ρ† ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ΅Ρ‚Π°, бороздящая космичСскиС просторы, β€“ всС, Ρ‡Ρ‚ΠΎ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ пошаговоС описаниС, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ: