Чтение онлайн

ЖАНРЫ

Создание игр для мобильных телефонов
Шрифт:

Этот код понять очень просто, он создает массив объектов Image и инициализирует каждый элемент, загружая с помощью метода Image.createImage соответствующее изображение. Важно отметить, что имя каждого файла изображения начинается с символа / (Косой слеш), обозначающего, что файл расположен в корневой директории мидлета. Это важно, так как эти изображения упакованы в JAR-архив вместе с классом мидлета, а следовательно, они должны быть доступны для чтения.

...

В копилку Игрока

Если вам интересно, что за изображения помещены в слайд-шоу, то это фотографии общественного скейт-парка, строящегося в моем городе, Нэшвилле, штат Теннеси. Я помогал с оформлением документов на строительство парка нашему сообществу скейтбордистов.

Основные

действия выполняются в методе paint класса SSCanvas, который выводит текущее изображение слайд-шоу и подпись на экран. Ниже приведен код метода paint:

public void paint(Graphics g) {

// очистить экран

g.setColor(255, 255, 255); // белый

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

// вывести текущее изображение

g.drawImage(slides[curSlide], getWidth / 2, getHeight / 2, //Текущее изображение выводится в центре экрана

Graphics.HCENTER | Graphics.VCENTER);

// настроить шрифт

Font f = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,

Font.SIZE_MEDIUM);

g.setFont(f);

// вывести текущее изображение

g.setColor(0, 0, 0); // Черный //Текущая надпись центрирована и выводится вдоль верхней границы экрана

g.drawString(captions[curSlide], getWidth / 2, 0,

Graphics.HCENTER | Graphics.TOP);

}

Метод paint сначала очищает экран, тем самым удаляя то, что осталось от предыдущего слайда. Затем в центре экрана выводится текущее изображение. Далее выполняется настройка шрифта – полужирный, среднего размера, пропорциональный. Наконец, устанавливается черный цвет, и по центру у нижнего края экрана выводится текст. Когда вывод графики завершен, последняя часть кода класса SSCanvas занимается обработкой пользовательского ввода. Нажимая клавиши со стрелками влево и вправо, пользователь может перелистывать слайды. Технически до главы 6 вы не научитесь обрабатывать ввод в играх, но здесь я познакомлю вас с основами. Ниже приведен код метода keyPressed:

public void keyPressed(int keyCode) {

// Get the game action from the key code

int action = getGameAction(keyCode);

// Process the left and right buttons

switch (action) {

case LEFT:

if (–curSlide < 0) //Перейти к последнему слайду, если первый уже показан

curSlide = slides.length – 1;

repaint;

break;

case RIGHT:

if (++curSlide >= slides.length) //Перейти к первому слайду, если последний уже показан

curSlide = 0;

repaint;

break;

}

}

Метод keyPressed открывает новые горизонты программирования игровых мидлетов – обработку игровых событий. Игровое событие – это особое событие, которое ассоциировано с клавишами, обычно используемыми в играх. Смысл заключается в том, что вы можете привязать действия к определенным клавишам, чтобы настроить пользовательский интерфейс. В методе keyPressed с помощью метода getGameAction определяется игровое событие, ассоциированное с клавишами. Константы LEFT и RIGHT используются для описания нажатий клавиш со стрелками влево и вправо. Если значение action совпадает со значением одной из констант, то номер текущего слайда увеличивается или уменьшается, а затем отображается новый слайд. Листинг 4.3. Так выглядит класс SSCanvas, который выполняет большую часть работы мидлета Slideshow. В листинге 4.3 приведен полный код этого класса:

import javax.microedition.lcdui.*;

import java.io.*;

public class SSCanvas extends Canvas {

private Display display;

private Image[] slides;

private String[] captions = { "Love Circle Bowl", "Double Wide Spine", //Индексы массива соответствуют изображениям

"Flume Zoom Over-vert", "Kulp De Sac Bowl",

"Louie\'s Ledge" };

private int curSlide = 0;

public SSCanvas(Display d) {

super;

display = d;

// загрузить изображения

try {

slides = new Image[5];

slides[0] = Image.createImage("/LoveCircle.jpg");

slides[1] = Image.createImage("/DoubleWide.jpg");

slides[2] = Image.createImage("/FlumeZoom.jpg");

slides[3] = Image.createImage("/KulpDeSac.jpg");

slides[4] = Image.createImage("/LouiesLedge.jpg");

}

catch (IOException e) {

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

}

}

void start {

display.setCurrent(this);

repaint;

}

public void keyPressed(int keyCode) {

// получить игровое событие

int action = getGameAction(keyCode);

// обработать нажатия клавиш

switch (action) {

case LEFT:

if (–curSlide < 0)

curSlide = slides.length – 1;

repaint;

break;

case RIGHT:

if (++curSlide >= slides.length)

curSlide = 0;

repaint;

break;

}

}

public void paint(Graphics g) {

//

очистить экран

g.setColor(255, 255, 255); // белый

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

// вывести текущее изображение

g.drawImage(slides[curSlide], getWidth / 2, getHeight / 2,

Graphics.HCENTER | Graphics.VCENTER);

// установить шрифт

Font f = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD,

Font.SIZE_MEDIUM);

g.setFont(f);

// вывести текущее содержание

g.setColor(0, 0, 0); // черный

g.drawString(captions[curSlide], getWidth / 2, 0,

Graphics.HCENTER | Graphics.TOP);

}

}

Чтобы интегрировать холст в мидлет, необходимо создать объект класса SSCanvas в классе SlideshowMIDlet:

private SSCanvas canvas;

Затем в конструкторе класса SlideshowMIDlet эта переменная инициализируется. Полный код мидлета Slideshow приведен в листинге 4.4. Листинг 4.4. Код мидлета Slideshow

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class SlideshowMIDlet extends MIDlet implements CommandListener {

private SSCanvas canvas; //Использование настраиваемого холста – это уникальный фрагмент кода мидлета

public void startApp {

if (canvas == null) {

canvas = new SSCanvas(Display.getDisplay(this));

Command exitCommand = new Command("Exit", Command.EXIT, 0);

canvas.addCommand(exitCommand);

canvas.setCommandListener(this);

}

// Start up the canvas

canvas.start;

}

public void pauseApp {}

public void destroyApp(boolean unconditional) {}

public void commandAction(Command c, Displayable s) {

if (c.getCommandType == Command.EXIT) {

destroyApp(true);

notifyDestroyed;

}

}

}

Как вы, вероятно, заметили, этот код практически идентичен классу мидлета Olympics, созданного нами ранее. Это подтверждает, что большая часть функций возложена на класс, производный от Canvas.

Тестирование готового приложения

После того как мидлет Slideshow собран, вы непременно захотите протестировать его в J2ME-эмуляторе. Не забудьте, что кнопки Влево и Вправо используются для навигации по слайд-шоу. На рис. 4.6 показан фрагмент работы мидлета Slideshow.

Рис. 4.6. Мидлет Slideshow реализует интерактивное слайд-шоу, в котором выводятся изображение и описание

Резюме

В этой главе вы узнали многое о программировании графики в MIDP API. Большая часть главы была посвящена объектам Graphics и Canvas, которые просты в применении. Вы познакомились с координатными системами и их использованием в мидлетах. Затем вы научились рисовать графические примитивы, настраивать шрифты и применять анкеры. Наконец, глава завершилась рассмотрением вывода изображений. Но, вероятно, самое важное в этой главе – написание двух примеров программ, демонстрирующих все приобретенные навыки работы с графикой.

Я думаю, что вам уже надоела эта подготовка, и вы готовы приступить к созданию полноценной игры. В следующей главе рассматривается наиболее важная тема, относящаяся к программированию игр, – спрайтовая анимация.

Заключение

Самая большая трудность, стоящая перед разработчиком мобильных игр – это необходимость работы с большим числом мобильных устройств с экранами различных размеров. Если в своих программах вы используете простейшую графику, нет необходимости заботиться о масштабировании и изменении изображений. Мидлет Olympics – хороший пример того, как вы можете масштабировать изображения в зависимости от размеров экрана. Как вы, вероятно, заметили, мидлет рисует олимпийский символ фиксированного размера вне зависимости от размеров экрана. Ниже приведены шаги, которые необходимо сделать, чтобы олимпийский символ занимал все свободное место на экране вне зависимости от размера экрана:

1. вызовите методы getWidth и getHeight и определите размеры эк рана;

2. вычислите диаметр каждой окружности символа как одну четвертую высоты экрана устройства;

3. измените код метода paint так, чтобы окружности имели вычисленный диаметр и располагались соответственно, все изображение должно быть центрировано;

4. соберите и запустите мидлет в эмуляторе J2ME. Измените эмулируемое устройство на QwertyDevice и посмотрите, как символ будет изображен на экране.

Это очень важное заключение, поскольку оно демонстрирует важность масштабирования изображения в зависимости от размеров экрана. В реальности далеко не всегда возможно сделать универсальный мидлет для любого типа экрана, однако простейший графический мидлет проиллюстрировал это.

Поделиться с друзьями: