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

ЖАНРЫ

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

Совет Разработчику

Скорость спрайтов – это один из самых интересных моментов в мобильных играх. Поскольку спрайты осьминогов не дрейфуют, а плывут, попробуйте увеличить их скорость и посмотрите, как это отразится на игре. Хотя осьминоги по-прежнему двигаются хаотично, они стали более грозными противниками, потому что быстро перемещаются по игровому экрану.

Замощенные слои и игровые спрайты объединяются менеджером слоев, который заботится об их упорядочивании и создании. Следующий код добавляет спрайты в менеджер слоев:

layers = new LayerManager;

layers.append(playerSprite);

for (int i = 0; i < 2; i++) {

layers.append(pirateSprite[i]);

layers.append(barrelSprite[i]);

}

for (int i = 0; i < 5; i++) {

layers.append(mineSprite[i]);

layers.append(squidSprite[i]);

}

layers.append(landLayer);

layers.append(waterLayer); //Последним добавляется слой воды, он будет выведен под остальными элементами

Не забудьте, что порядок, в котором вы добавляете спрайты в менеджер слоев, очень важен, первый добавленный спрайт будет выводится на экран поверх остальных объектов. Поэтому фоновые слои добавляются в последнюю очередь. Звуковые эффекты и музыка играют большое значение в оформлении большинства игр, и High Seas – не исключение. Приведенный ниже код устанавливает проигрыватели:

try {

InputStream is = getClass.getResourceAsStream("Music.mid");

musicPlayer = Manager.createPlayer(is, "audio/midi");

musicPlayer.prefetch;

musicPlayer.setLoopCount(-1);

is = getClass.getResourceAsStream("Rescue.wav");

rescuePlayer = Manager.createPlayer(is, "audio/X-wav");

rescuePlayer.prefetch;

is = getClass.getResourceAsStream("Mine.wav");

minePlayer = Manager.createPlayer(is, "audio/X-wav");

minePlayer.prefetch;

is = getClass.getResourceAsStream("GameOver.wav");

gameoverPlayer = Manager.createPlayer(is, "audio/X-wav");

gameoverPlayer.prefetch;

}

catch (IOException ioe) {

}

catch (MediaException me) {

}

Как видно, для музыки создается один MIDI-проигрыватель, а также три проигрывателя – по одному на каждый из воспроизводимых в игре звуков (звук спасения пирата, звук подрыва на мине и звук окончания игры). Последний фрагмент метода start начинает новую игру, для чего вызывается метод newGame:

newGame;

Чуть позже вы узнаете, как работает этот метод. А пока давайте перейдем к рассмотрению метода update, который выполняет всю основную работу мидлета.

Разработка метода update

Как вы знаете, метод update вызывается один раз за игровой цикл, он отвечает за обновление спрайтов, слоев, проверяет столкновения, именно он обеспечивает работу приложения. В игре High Seas этот метод начинается с проверки окончания игры. Если результат положительный, начинается новая игра, для чего пользователь должен нажать клавишу «огонь»:

if (gameOver) {

int keyState = getKeyStates;

if ((keyState & FIRE_PRESSED) != 0)

// Start a new game

newGame;

// игра окончена, обновление не требуется

return;

}

Для начала игры вызывается метод newGame, о котором упоминалось ранее. Обратите внимание, что метод update заканчивает свою работу сразу после вызова этого метода, потому что нет необходимости обновлять только что запущенную игру. Следующая функция метода update – это обработка пользовательского ввода. Следующий код обрабатывает нажатие четырех клавиш со стрелками и перемещает окно вида:

int keyState = getKeyStates;

int xMove = 0, yMove = 0;

if ((keyState & LEFT_PRESSED) != 0) {

xMove = -4;

playerSprite.setFrame(3);

}

else if ((keyState & RIGHT_PRESSED) != 0) {

xMove = 4; //Чтобы корабль игрока передвигался быстрее, нужно изменить это значение

playerSprite.setFrame(1);

}

if ((keyState & UP_PRESSED) != 0) {

yMove = -4;

playerSprite.setFrame(0);

}

else if ((keyState & DOWN_PRESSED) != 0) {

yMove = 4;

playerSprite.setFrame(2);

}

if (xMove != 0 || yMove != 0) { //Изменить положение окна вида и переместить спрайт игрока в соответствии с нажатой клавишей

layers.setViewWindow(xView + xMove, yView + yMove, getWidth,

getHeight – infoBar.getHeight);

playerSprite.move(xMove, yMove);

}

Если вы вспомните, в игре High Seas пиратский корабль остается неподвижным в центре экрана, а остальные элементы перемещаются. Код обработки пользовательского ввода достигает этого эффекта, перемещая окно вида в соответствии с нажатыми клавишами. Сначала определяется, на какое расстояние необходимо переместить изображение, а затем окно перемещается вызовом метода setViewWindow. Спрайт игрока перемещается на это расстояние, чтобы оставаться в центре экрана. Класс DriftSprite проверяет столкновение со слоем-барьером всех спрайтов, кроме спрайта пиратского корабля. Приведенный далее код выполняет проверку столкновения корабля игрока со слоем-барьером:

if (playerSprite.collidesWith(landLayer, true)) {

// восстановить исходные положения окна вида и спрайта игрока

layers.setViewWindow(xView, yView, getWidth,

getHeight – infoBar.getHeight);

playerSprite.move(-xMove, -yMove);

}

else {

// если столкновение не произошло, изменить координаты окна вида

xView += xMove;

yView += yMove;

}

Если столкновение произошло, то окно вида возвращается в исходное положение, которое было сохранено в переменных xView, yView. Спрайт игрока также возвращается в исходное положение таким образом, что он остается в центре игрового экрана. Если столкновения нет, то окно вида перемещается в новое положение, определяемое переменными xView и yView. Обновление спрайтов игры High Seas – это та часть кода, в которой выполняется большее число действий. Вот как это делается:

for (int i = 0; i < 2; i++) {

// обновить спрайты пиратов, бочек и мин

pirateSprite[i].update;

barrelSprite[i].update;

// проверить столкновение спрайта корабля и спрайта пирата

if (playerSprite.collidesWith(pirateSprite[i], true)) {

// воспроизвести звук спасения пирата

try {

rescuePlayer.start;

}

catch (MediaException me) {

}

// увеличить число спасенных пиратов

piratesSaved++; //Увеличить счетчик пиратов, потому что был спасен пират

// поместить пирата в новое положение

placeSprite(pirateSprite[i], landLayer); //Использовать спрайт пирата снова, поместив его в новое место

}

// проверить столкновение спрайта корабля со спрайтом бочки

if (playerSprite.collidesWith(barrelSprite[i], true)) {

// воспроизвести звук пополнения энергии

try {

Manager.playTone(ToneControl.C4 + 12, 250, 100);

}

catch (MediaException me) {

}

// увеличить энергию игрока

energy = Math.min(energy + 5, 45); //Увеличить энергию игрока, потому что была подорвана бочка

// поместить бочку в новое положение

placeSprite(barrelSprite[i], landLayer); //Использовать спрайт бочки снова, поместив его в новое положение

}

}

После обновления обоих спрайтов этот код проверяет столкновение между спрайтом корабля и спрайтом пирата. Если столкновение определено, то воспроизводится звук спасения, означающий, что пират спасен. Число спасенных пиратов, определяемое переменной piratesSaved, увеличивается на 1. Спрайт пирата помещается в новое случайное положение, для чего вызывается метод placeSprite. Для игрока пират исчез, а в реальности он просто переместился в другое место на карте. Это удобный способ убрать пирата и создать нового простым перемещением спрайта. Наконец, в этом фрагменте кода показано, как применять метод placeSprite. После того, как было определено столкновение между спрайтами корабля и пирата, проверяется столкновение корабля с бочкой. В этом случае воспроизводится тоновый сигнал, а не wav-файл. Энергия игрока увеличивается, а бочка перемещается в новое место на карте.

...

Совет Разработчику

Максимальный объем энергии игрока в игре High Seas равен 45, поэтому код, изменяющий энергию игрока при столкновении с бочкой, восстанавливает уровень энергии до 45. Если бы не было этого ограничения, то индикатор энергии мог бы бесконечно расти, загородив индикатор спасенных пиратов.

Спрайты мины и осьминога обновляются в методе update так же, как и спрайты бочки и пирата. Но этот код отделен от обновления бочек и пиратов, потому что число мин и осьминогов больше числа бочек и пиратов. Именно поэтому необходим другой цикл for:

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