Переменная waterDelay – это просто счетчик, поэтому она инициализируется значением 0. Переменная waterTile содержит номер первого изображения анимационного элемента замощенного слоя, в данном случае -1 (рис. 11.5). Переменные для создания анимации воды используются в методе update(), в котором также реализована большая часть логики мидлета. В листинге 11.1 приведен код метода update(). Листинг 11.1. Метод update() класса WCanvas перемещает окно вида в соответствии с нажатиями клавиш
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 Этот метод больше не требуется, потому что теперь перемещения героя ограничиваются проверкой столкновений со слоем-барьером.