Создание игр для мобильных телефонов - Майкл Моррисон
Шрифт:
Интервал:
Закладка:
private void update() {
// обработка пользовательского ввода
if (++inputDelay > 2) {
int keyState = getKeyStates();
int xMove = 0, yMove = 0;
if ((keyState & LEFT_PRESSED) != 0)
xMove = -12;
else if ((keyState & RIGHT_PRESSED) != 0)
xMove = 12;
if ((keyState & UP_PRESSED) != 0)
yMove = -12;
else if ((keyState & DOWN_PRESSED) != 0)
yMove = 12;
if (xMove != 0 || yMove != 0) { //Если произошло движение, то необходимо изменить положение окна вида, центрировать спрайт героя на экране, воспроизвести анимацию спрайта героя
layers.setViewWindow(xView + xMove, yView + yMove, getWidth(),
getHeight());
personSprite.move(xMove, yMove);
personSprite.nextFrame();
}
// Проверить столкновение спрайта со слоем-барьером
if (personSprite.collidesWith(barrierLayer, true)) {
// Воспроизвести звук столкновения
try {
Manager.playTone(ToneControl.C4 + 12, 100, 100); //Воспроизвести звук, если герой столкнулся со слоем-барьером
}
catch (Exception e) {
}
// Восстановить исходные положения окна вида и персонажа
layers.setViewWindow(xView, yView, getWidth(), getHeight());
personSprite.move(-xMove, -yMove);
}
else {
// если нет столкновения, то применить изменения к окну вида
xView += xMove;
yView += yMove;
}
// обновить анимацию элементов слоя
if (++waterDelay > 2) {
if (++waterTile > 4) //Этот код воспроизводит анимацию изображения воды
waterTile = 1;
barrierLayer.setAnimatedTile(-1, waterTile);
waterDelay = 0;
}
// обнулить задержку ввода
inputDelay = 0;
}
}Первый интересный фрагмент кода – это обработка пользовательского ввода, в результате персонаж перемещается по замощенному слою. В отличие от предыдущего примера Wanderer, в этой версии для отображения текущей видимой области слоев используется окно вида. Временные переменные xMove и yMove используются для того, чтобы определить необходимость перемещения окна вида. При необходимости окно перемещается на значения, хранимые в этих переменных. В этом случае спрайт героя перемещается в центр экрана. Настоящее волшебство начинается в середине метода update(), где определяется столкновение между спрайтом героя и слоем-барьером. Этот код превращает слой в слой-барьер. Если столкновение произошло, то воспроизводится соответствующий звук, а окно вида и спрайт героя возвращаются в положение до столкновения. Если столкновения нет, то положение окна вида изменяется, переменные xView и yView принимают новые значения.
...Совет Разработчику
Важно отметить, что метод update() больше не вызывает метод checkBackgroundBounds(), как это делалось в мидлете Wanderer Этот метод больше не требуется, потому что теперь перемещения героя ограничиваются проверкой столкновений со слоем-барьером.
В конце метода update() вы обнаружите код, обновляющий фрагменты слоя с изображением воды. Счетчик waterDelay контролирует, что обновление будет выполняться на каждом четвертом цикле. Счетчик принимает значения 0, 1, 2, затем выполняется обновление, и счетчик обнуляется. А изображения воды изменяются от 1 до 4 (рис. 11.5). Этот код создает эффект движения воды во всех элементах замощенного слоя с индексом -1.
Несомненно, стоит рассмотреть и последний простой фрагмент кода мидлета Wanderer 2. Чтобы понять, о чем я говорю, посмотрите листинг 11.2.
Листинг 11.2. Метод draw() в менеджер слоев, одной строкой кода
private void draw(Graphics g) {
// вывести слои
layers.paint(g, 0, 0); //Вывод спрайтов и слоев
// вывести содержимое буфера
flushGraphics();
}
Приведенный листинг содержит код метода draw() мидлета Wanderer 2, этот код отвечает за вывод графики на холст мидлета. Как вы видите, этот метод вызывает лишь один метод рисования, метод paint() менеджера слоев. Поскольку в окне вида уже установлена выводимая на экран область слоев, то вы можете передать в метод paint() координаты (0,0).
Изменения кода по сравнению с мидлетом Wanderer не столь значительны, однако эффект, как вы увидите далее, велик.
Тестирование готового приложения
Мидлет Wanderer 2 – это скромное подобие мобильной игры, в которой вы управляете героем, проводите его через лабиринт и исследуете виртуальный мир. Все, что остается сделать, – это усложнить лабиринт и добавить спрайты врагов. Даже если считать, что Wanderer 2 мало похож на мобильную игру, этот мидлет очень интересен с точки зрения применения замощенных слоев и их эффективного использования.
На рис. 11.7 показано, как выглядит экран при первом запуске мидлета Wanderer 2; игровой экран центрирован относительно замощенных слоев, а спрайт героя находится в центре лабиринта.
Рис. 11.7. В мидлете Wanderer 2 герой пробирается через лабиринт, расположенный поверх фонового слояПо мере продвижения героя по лабиринту, вы заметите, что невозможно различить два замощенных слоя, использованных для построения мидлета. Дойдя до края карты, вы увидите анимацию воды. На рис. 11.8 показан герой, стоящий у воды, некоторые элементы – анимационные.
Рис. 11.8. Некоторые из элементов слоя с изображением воды – анимационные, они создают более реалистичный эффектКонечно, печатная страница не может передать анимацию, но если вы посмотрите ближе, заметите, что некоторые из элементов слоя с изображением воды отличаются от других. А еще лучше, запустите мидлет Wanderer 2 самостоятельно и посмотрите на анимацию на экране эмулированного устройства или вашего телефона.
Резюме
В этой главе вы соединили все знания о спрайтах и замощенных слоях, полученные в предыдущих главах, научились управлять ими. Вы узнали, как использовать стандартный класс LayerManager для управления несколькими слоями как единым целым. Вы также изменили мидлет Wanderer, разработанный в предыдущей главе, добавили один слой, который служит лабиринтом, по которому перемещается герой.
Вы, вероятно, удивляетесь, что добрались до середины книги, а сделали лишь одну полноценную игру. Следующая глава решит эту проблему. Вы создадите самую интересную игру книги – приключенческую пиратскую игру High Seas.
В заключение
Вы, вероятно, заметили, что в примере Wanderer 2 я не использовал все пространство слоя-барьера для стен лабиринта. Вы можете сделать этот мидлет интереснее, если увеличите размер слоев и создадите большой лабиринт. Для этого выполните следующие шаги:
1. сначала определитесь с размером карты. После этого на листе бумаги, или, используя специальное программное обеспечение, создайте карту с лабиринтом;
2. измените код создания карты в методе start() в соответствии с новыми размерами замощенного слоя;
3. вставьте карты фонового слоя и слоя-барьера в код мидлета как целочисленный массив (также в методе start());
4. при инициализации замощенного слоя убедитесь, что в цикле for указано верное число строк и столбцов.
Такое сравнительно небольшое число изменений позволит добиться значительных результатов. Вы даже можете использовать какой-нибудь метод автоматического создания лабиринтов, чтобы при каждом запуске мидлета появлялся новый лабиринт.Глава 12 High Seas: почувствуй себя пиратом!
...Архив Аркад
На заре игр про Тарзана, в 1982 году, компания Taito выпустила аркаду Jungle King. В этой захватывающей игре вы перепрыгиваете с лианы на лиану, чтобы спасти девушку, похищенную каннибалами. На протяжении нескольких уровней, герой был должен передвигаться с помощью лиан, перепрыгивать через глыбы и, вооруженный ножом, осторожно пройти реку, полную голодных крокодилов. Компании Taito был предъявлен иск владельцами прав на Тарзана, Edgar Rise Burrogh's estate. В ответ на это игра Jungle King была переименована в Jungle Hunt, а герой, Тарзан, поменял львиную шкуру на костюм исследователя. Конечно, из игры был удален и знаменитый крик Тарзана.
В главе 7 вы разработали свою первую полноценную мобильную игру, Henway. Несмотря на то что вы создали также ряд интересных мидлетов, не было разработано ни одной полной мобильной игры. В этой главе вы пройдете по этапам создания игры High Seas. Это приключенческая игра, в которой вы управляете пиратским кораблем и пытаетесь спасти пиратов, оказавшихся за бортом. В игре High Seas вы используете практически все, что было изучено вами до настоящего момента. Это хороший шанс поиграть и поэкспериментировать.
Прочитав главу, вы узнаете:
► что мобильные игры про пиратов – это не всегда грабеж и разрушение;
► как разработать мобильную игру High Seas, использующую преимущества замощенных слоев;
► как управлять взаимодействием спрайтов в реальной игре;
► как создать код игры High Seas.
Обзор игры High Seas
В игре High Seas, которую вы будете разрабатывать и создавать в этой главе, игрок управляет пиратским кораблем, который во время шторма потерял часть команды. Цель игры – спасти как можно больше членов команды. На вашем пути встретятся водные мины и кровожадные осьминоги, которые усложняют спасательную кампанию. Ваш корабль в игре имеет ограниченный запас энергии, который уменьшается каждый раз, когда вы нарываетесь на мину или попадаетесь в щупальца осьминога. Чтобы пополнить запас энергии, вы должны найти бочки с провизией и подобрать их. Игра заканчивается, когда корабль теряет всю энергию и тонет.