Шрифт:
Совет Разработчику
Скорость спрайтов – это один из самых интересных моментов в мобильных играх. Поскольку спрайты осьминогов не дрейфуют, а плывут, попробуйте увеличить их скорость и посмотрите, как это отразится на игре. Хотя осьминоги по-прежнему двигаются хаотично, они стали более грозными противниками, потому что быстро перемещаются по игровому экрану.
Замощенные слои и игровые спрайты объединяются менеджером слоев, который заботится об их упорядочивании и создании. Следующий код добавляет спрайты в менеджер слоев:
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 – это та часть кода, в которой выполняется большее число действий. Вот как это делается: