for (int i = 0; i < 4; i++) {
// переместить спрайты автомобилей
carSprite[i].move(0, carYSpeed[i]);
checkBounds(carSprite[i], true);
// проверить столкновение спрайта цыпленка и спрайтов автомобилей
if (chickenSprite.collidesWith(carSprite[i], true)) {
// воспроизвести звук в случае гибели цыпленка
AlertType.ERROR.playSound(display);
// Check for a game over
if (–numLives == 0) {
gameOver = true;
} else {
// восстановить исходное положение цыпленка
chickenSprite.setPosition(2, 77); //Если игра не закончена, цыпленок возвращается в исходное положение, чтобы еще раз попытаться перейти дорогу.м
}
// не нужно обновлять спрайты автомобилей
break;
}
}Все спрайты автомобилей перемещаются в вертикальном направлении, их скорости хранятся в массиве carYSpeed. Затем выполняется проверка, достиг ли автомобиль противоположной стороны экрана, для чего вызывается метод checkBounds со вторым параметром true. Наиболее важный код – это детектирование столкновений спрайтов цыпленка и автомобилей. Если они столкнулись, то воспроизводится звук «ошибка» и переменная numLives уменьшается на 1. Если значение переменной равно 0, то игра закончена, значение переменной gameOver приравнивается true. Если нет, положение спрайта цыпленка обнуляется, а игра возобновляется. Важно отметить, что при столкновении спрайтов цикл прерывается, потому что нет необходимости проверять, был ли сбит цыпленок еще раз. Поскольку в игре используется не так много графики, метод draw класса HCanvas очень прост. Первое, что он выполняет, – выводит фоновое изображение:
g.drawImage(background, 0, 0, Graphics.TOP | Graphics.LEFT);
После этого выводится число оставшихся жизней цыпленка:
for (int i = 0; i < numLives; i++)
g.drawImage(chickenHead, 180 – ((i + 1) * 8), 170, Graphics.TOP |
Graphics.LEFT);Проще всего нарисовать, вероятно, самый важный спрайт игры – спрайт цыпленка. Для этого необходима единственная строка кода:
chickenSprite.paint(g);
Спрайты автомобилей нарисовать также несложно, просто вызывайте метод paint внутри цикла:
for (int i = 0; i < 4; i++) carSprite[i].paint(g);
И, наконец, последнее, что остается вывести, – это сообщение «game over» (игра закончена), но его необходимо отображать только в случае, если игра закончена. Ниже приведен код, выполняющий это:
if (gameOver) {
// вывести сообщение о конце игры и счет
g.setColor(255, 255, 255); // white
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD,
Font.SIZE_LARGE));
g.drawString("GAME OVER", 90, 40, Graphics.TOP | Graphics.HCENTER);
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD,
Font.SIZE_MEDIUM));
g.drawString("You scored " + score + " points.", 90, 70, Graphics.TOP |
Graphics.HCENTER);
}Для каждой строки текста используется шрифт разного размера, поэтому сообщение «game over» больше, нежели набранное число очков. Больше ничего особенного в этом коде нет. Последний фрагмент кода, который я хотел бы выделить, – это код нового улучшенного метода checkBounds, который или возвращает спрайт в исходное положение, или ограничивает его дальнейшее перемещение: