Читаем Создание игр для мобильных телефонов полностью

На этом весь новый код мидлета 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);

}

}

Перейти на страницу:

Похожие книги

С компьютером на ты. Самое необходимое
С компьютером на ты. Самое необходимое

Рассказывается о работе в операционной системе Windows (на примере версий XP и 7), текстовом редакторе Word 2010 и других приложениях, необходимых каждому пользователю: архиваторах, антивирусах и программах для просмотра видео и прослушивания музыки (Winamp, QuickTime Pro). Большое внимание уделяется работе в Интернете. Рассказывается о программах для просмотра Web-страниц, об электронной почте, а также о различных полезных приложениях для работы в сети — менеджерах закачек файлов, ICQ, Windows Live Messenger, MSN и многих других. Во втором издании рассмотрена новая ОС — Windows 7, а также последние версии приложений для пользователей.Для начинающих пользователей ПК.

Андрей Александрович Егоров , Андрей Егоров

Зарубежная компьютерная, околокомпьютерная литература / Прочая компьютерная литература / Книги по IT
От «кирпича» до смартфона
От «кирпича» до смартфона

Перед вами уникальное исследование мира мобильной индустрии, превращенное его автором Эльдаром Муртазиным, ведущим аналитиком Mobile Research Group и главным российским специалистом по мобильным телефонам, в захватывающий бизнес-триллер. Гигантские компании — Nokia, Motorola, Samsung бросают на мобильный фронт колоссальные силы, создают альянсы, охотятся за лучшими специалистами, шпионят друг за другом. Разработки ведутся в обстановке строжайшей секретности. Цель — выпустить на рынок новую, уникальную модель раньше конкурентов или даже полностью изменить наше представление о мобильном телефоне, как это недавно удалось Apple со своим iPhone.Эта книга предназначена для тех, кто видит в мобильном телефоне не просто средство связи, а чудо инженерной мысли, смелое воплощение дизайнерских фантазий, символ нашей эпохи.

Эльдар Викторович Муртазин , Эльдар Муртазин

Справочная литература / Прочая компьютерная литература / Прочая справочная литература / Книги по IT / Словари и Энциклопедии