Если вы вспомните, в игре 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-файл. Энергия игрока увеличивается, а бочка перемещается в новое место на карте.