Майкл Моррисон - Создание игр для мобильных телефонов
- Название:Создание игр для мобильных телефонов
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Майкл Моррисон - Создание игр для мобильных телефонов краткое содержание
Книга «Создание игр для мобильных телефонов» – это практическое руководство, которое поможет разработать и реализовать игру для мобильного телефона.
Книга написана простым языком, не содержит сложной и скучной теории программирования и шаг за шагом знакомит с методикой создания технологии «plug-and-play» применительно к созданию огромного количества игр.
В издание включены подробные описания и примеры кодов для четырех игр, а также информация, необходимая для реализации вашей собственной задумки.
Если вы любите играть в игры и занимаетесь программированием, то эта книга – для вас!
Перевод: К. Михалкин
Создание игр для мобильных телефонов - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Другой фрагмент кода, представляющий интерес, – это метод checkBounds(), который проверяет, что цыпленок остается на экране. Если вы вспомните программу UFO 2, то одноименный метод использовался для проверки того, что астероиды находятся на экране. В игре Henway новая версия этого метода, второй параметр говорит о том, следует ли ограничить перемещение спрайта (значение false) или вернуть его на противоположную сторону (значение true). Чуть позже будет приведен код этого метода.
В методе 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;
Читать дальшеИнтервал:
Закладка: