Создание игр для мобильных телефонов - Майкл Моррисон
Шрифт:
Интервал:
Закладка:
Игрок может стрелять вверх пирожными-ракетами, долетающими до верхней части экрана.
Пришельцы в игре Space Out могут перемещаться в любом направлении и с любой скоростью. Пришельцы Blobbo и Jelly отталкиваются от краев экрана. Тимми может появляться с другой стороны экрана, потому что он движется преимущественно горизонтально, в то время как остальные пришельцы движутся более хаотично. Все пришельцы стреляют ракетами, которые взрываются при попадании в автомобиль игрока или землю. Ракеты пришельцев не могут причинить вреда самим пришельцам.
В Space Out нет отдельных уровней или какой-либо другой цели, чем выжить. Однако сложность игры увеличивается со временем, она основана на набранных игроком очках. В итоге игрок должен будет стараться приложить максимум усилий, сражаясь с бесконечной армией пришельцев. Попробуйте их победить!
Чтобы помочь вам представить, как выглядит игра Space Out, взгляните на рис. 18.1.
Рис. 18.1. Игра Space Out состоит из фонового изображения пустыни, автомобиля, пришельцев и ракет игрока и пришельцев
На рис. 18.1 показано фоновое изображение – пустыня и звездное небо. Спрайт автомобиля перемещается по пустыне. Пришельцы появляются в небе и перемещаются, пытаясь уничтожить автомобиль ракетами. Конечно, автомобиль ведет ответный огонь по пришельцам. Счет игры выводится в верхнем правом углу игрового экрана, а число оставшихся автомобилей (жизней) – в верхнем левом.
Вы поняли основы игры, теперь важно изучить необходимые спрайты. Ниже приведен список спрайтов, используемых в игре:
► спрайт автомобиля;
► спрайты пришельцев;
► спрайты ракет (автомобиля и пришельцев);
► спрайт взрыва.
Единственный спрайт, о котором я еще не говорил, – это спрайт взрыва, который используется для изображения взрыва корабля пришельца или автомобиля. Кроме спрайтов, в игре Space Out необходимы несколько растровых изображений:
► фоновое изображение пустыни;
► изображение автомобиля (рис. 18.2);
Рис. 18.2. Растровое изображение маленького автомобиля, направленного вправо► изображение пришельца Blobbo (рис. 18.3);
Рис. 18.3. Растровое изображение пришельца Blobbo состоит из пяти фреймов► изображение пришельца Джелли (рис. 18.4);
Рис. 18.4. Изображение пришельца Jelly состоит из пяти фреймов, имитирующих движение щупалец► изображение пришельца Timmy (рис. 18.5);
Рис. 18.5. Изображение пришельца Timmy состоит из трех фреймов, имитирующих его полет► изображение ракеты, содержащее различные фреймы, – ракеты игрока и ракеты пришельца (рис. 18.6);
Рис. 18.6. Изображение ракеты состоит из нескольких фреймов, каждый из которых соответствует определенному типу ракеты► анимационное изображение взрыва (рис. 18.7);
Рис. 18.7. Изображение взрыва► маленькое изображение автомобиля (рис. 18.8).
Рис. 18.8. Маленькое изображение автомобиля используется для отображения числа оставшихся жизнейЭти изображения определены самим дизайном игры, речь о котором шла ранее, поэтому здесь не должно быть ничего удивительного. Стоит отметить, что спрайты пришельцев являются анимационными (рис. 18.3—18.5), что делает героев интереснее. Другой традиционный для игр спрайт – это анимационный спрайт взрыва (рис. 18.7).
В игре Space Out используется традиционный анимационный спрайт и для изображения ракеты (рис. 18.6). Изображение содержит несколько фреймов анимации, но каждый фрейм – это отдельный тип ракеты, а не кадр анимации. Иначе говоря, фреймы изображения ракет никогда не выводятся последовательно, как в случае с обыкновенными анимационными изображениями. Напротив, каждый фрейм изображения – это отдельный тип ракеты. Четыре типа ракеты – это ракеты игрока и трех пришельцев.
Другие важные элементы игры Space Out – это счет, который необходимо вести во время игры, а также число жизней (автомобилей). Игра завершается, когда уничтожены все четыре автомобиля. Сложность игры хранится в переменной и увеличивается по мере уничтожения пришельцев игроком. Другое важное хранилище информации – это переменная булевского типа, которая отслеживает, завершена ли игра.
Итак, разработка игры привела нас к следующим важным аспектам, которыми необходимо управлять во время игры:
► число оставшихся жизней (автомобилей);
► счет;
► булевская переменная, отслеживающая окончание игры.
Эта информация отражает ядро игровых данных, которые необходимо отслеживать во время игры. Помните, что игровые спрайты – очень важный компонент состояния игры. Зная это, вы можете перейти к проработке кода игры Space Out. Так же, как и игра High Seas, созданная в главе 12, игра Space Out потребует значительных сил, но труд будет вознагражден! Вы увидите!
Реализация игры
Структура игры аналогична структуре игр, разработанных ранее. В следующих разделах вы разработаете код и ресурсы игры.
Создание движущихся спрайтов
Разработку игры Space Out начнем с создания нового класса спрайтов, который будет использоваться в игре для реализации движущихся спрайтов. Этот класс MovingSprite аналогичен классу DriftSprite из главы 12 за исключением того, что в первом будут использоваться компоненты X и Y скорости, а также обрабатываться столкновения спрайта со стенкой экрана.
Любой спрайт в итоге может достичь края экрана, и в этом случае возможны несколько вариантов. Например, в игре Pong спрайт, достигающий границы экрана, отскакивает от нее. В игре Asteroids при достижении границы экрана спрайт может появиться у противоположной стороны. В некоторых играх спрайт просто замирает или уничтожается (скрывается). Все эти возможности реализует класс MovingSprite. Давайте перечислим эти возможности снова:
► скрыться – сокрытие спрайта по достижении им края экрана;
► переместиться – при достижении спрайтом края экрана он появляется у противоположного края;
► оттолкнуться – по достижении спрайтом границы экрана направление его движения изменяется на противоположное;
► остановиться – если спрайт достигает края экрана, он останавливается.
Все эти случаи реализуются константами класса MovingSprite. Ниже приведены константы и переменные этого класса:private int xSpeed, ySpeed;
private int action;
private Canvas canvas;
public static final int BA_HIDE = 1; //Эти константы описывают различные действия на границах игрового поля при перемещении спрайтов
public static final int BA_WRAP = 2;
public static final int BA_BOUNCE = 3;
public static final int BA_STOP = 4;Переменные xSpeed и ySpeed хранят соответствующие компоненты скорости спрайта, которые измеряются в пикселях за один игровой цикл. Переменная action содержит код действия, выполняемого по достижении спрайтом границы экрана – значение одной из констант класса. Поэтому каждый движущийся спрайт по достижении края экрана должен остановиться, появиться у другого края экрана, оттолкнуться или скрыться.
Граница экрана определяется переменной canvas, которая хранит холст, на котором выводится спрайт. Цель этой переменной – создать прямоугольную границу, ограничивающую движения спрайта. Иначе говоря, размеры переменной canvas служат размерами области, в которой может перемещаться спрайт – движение вне области невозможно.
Переменные класса MovingSprite инициализируются конструктором MovingSprite (листинг 18.1).
Листинг 18.1. Конструктор класса MovingSprite создает как анимационный, так и неанимационный спрайтpublic MovingSprite (Image image, int xMoveSpeed, Int yMoveSpeed,
int boundsAction, Canvas parentCanvas) {
super(image); //Вызов родительского конструктора Sprite()
// скорость XY
xSpeed = xMoveSpeed;
ySpeed = yMoveSpeed;
// действие при достижении границы экрана
action = boundsAction;
// родительский холст
canvas = parentCanvas;
}
public MovingSprite(Image image, int frameWidth, int frameHeight, int xMoveSpeed,
int yMoveSpeed, int boundsAction, Canvas parentCanvas) {
super(image, frameWidth, frameHeight); //Вызов родительского анимационного конструктора Sprite()
// скорости XY
xSpeed = xMoveSpeed;
ySpeed = yMoveSpeed;
// действие при достижении границы экрана
action = boundsAction;
// родительский холст
canvas = parentCanvas;
}В классе MovingSprite реализованы два конструктора – для создания анимационного и обычного спрайтов. Оба конструктора вызывают конструктор родительского метода Sprite(), который создает ядро спрайта, после чего выполняется инициализация специфических переменных класса. В отличие от класса DriftSprite, разработанного в главе 12, метод update() в классе MovingSprite удивительно прост:
public void update() {
// Move the sprite based on its speed
move(xSpeed, ySpeed);
// Check for a collision with the screen boundary
checkBounds();
}Сначала метод update() перемещает спрайт на основании текущей скорости, хранящейся в целочисленных переменных xSpeed и ySpeed. Метод завершается проверкой, находится ли спрайт внутри границ. Это выполняется методом checkBounds(), код которого приведен в листинге 18.2. Листинг 18.2. Метод checkBounds() проверяет столкновение спрайта с границей экрана и в случае столкновения выполняет соответствующие действия
private void checkBounds() {