Скроллинг

Пожалуй, всем знакомы игры с прокручивающимся фоном. Вы, как программист, можете использовать скроллинг по разным причинам. Например, поле действия игры сильно превосходит ту часть, которую может видеть игрок на экране (назовем ее "полем зрения"). Давайте рассмотрим маленькую стрелялку вроде моей игры UfoAttacks, где я впервые в апплете использовал прокручивание экрана. Когда пользователь двигает мышь к левой или правой границе апплета, его поле зрения двигается в соответствующем направлении. В данной главе вы узнаете, как это реализуется.

Основная идея

Каждый раз, когда мы используем статические объекты (стены, камни) в играх, эти объекты не меняют свое местоположение (именно поэтому я называю их статическими). Только движение объектов меняет их позицию. А теперь скажем "до свидания" этим милым простым статическим объектам, и сделаем игру с прокручиванием экрана. В этой игре статических объектов не будет - все они будут менять позицию в процессе скроллинга.

Простой пример

Давайте смоделируем конкретную ситуацию: возьмем апплет размером 300 x 300 пикселей и задним фоном, полным звезд :). Место действия игры в два раза превышает окно апплета, и составляет 600 x 300 пикселей (см. пример апплета). Когда апплет стартует, мы видим самый центр поля игры, так что центр поля зрения находится в между точками с x-координатами 150 и 450. А теперь - трюк: хотя в поле игры координаты объектов, которые мы видим в окне апплета, расположены в диапазоне от 150 до 450, их реальные x-координаты находятся в диапазоне от 0 до 300, так как в противном случае они будут прорисованы вне окна апплета. Таким образом, на старте апплета, объекты с координатами в поле игры менее 150, имеют фактическую, относительную позицию менее нуля, а объекты с координатами более 450 имеют реальную x-позицию более 300.

  Эта картинка показывает ситуацию в начале загрузки апплета. Желтые цифры показывают позиции объектов относительно всего поля игры, а зеленые - относительные позиции. Все объекты в синей области имеют относительную позицию > 300, а в красной области < 0. Все объекты с относительной позицией от 0 до 300 прорисованы в нашем поле зрения, остальные объекты прорисовываются вне зоны апплета.

Теперь мы перемещаемся в левую сторону. Это означает, что мы должны прибавить значение скорости прокрутки к относительной позиции каждого объекта, и все объекты будут двигаться в правую сторону. Таким образом, некоторые звезды будут исчезать в правой части, потому что их относительная позиция больше 300, а другие звезды будут появляться с левой стороны, потому что их позиция становится больше 0.

  Эта картинка показывает ситуацию после прокрутки влево. Наше поле зрение сдвинулось к левой границе игрового пространства, и объектов с позицией меньше 0 не осталось. Количество объекто с относительной позицией больше 300 увеличилось. Значения и цвета имеют те же значения, что и на картинке выше.

Как инициализировать игровые объекты

Я надеюсь, вы поняли, что относительная позиция объектов не одно и то же, что и позиция объекта в игре. Давайте, к примеру, посмотрим на границы игрового пространства. Как я сказал, игровое поле имеет ширину 600 пикселей. Когда апплет стартует, мы видим середину этого поля. Это значит, что левый край поля зрения имеет в игре x-координату 150. Но граница игрового пространства расположена на 150 пикселей левее и имеет относительную позицию -150. Правая граница игрового поля расположена на 150 пикселей правее, чем правая граница поля зрения и имеет относительную позицию 450. Мы можем вывести маленькую формулу, чтобы инициализировать все объекты игры. Эта формула должна возвращать правильное значение относительной позиции заданной позиции игрового пространства.

Начальная позиция объекта = позиция в игровом пространстве - (размер апплета / 2)

Надеюсь, вы поняли идею, и сейчас я впишу только несколько строк в исходник.

Несколько слов об исходном коде

Как уже говорилось, единственная разница с играми, не использующими скроллинг, состоит в том, что все объекты двигаются, когда экран прокручивается и позиции объектов в игроом поле инициализируются другим путем (см. выше). Каждый объект в нашей игре имеет метод scrollObject (int speed). Этот метод добавляет значение скорости прокрутки к реальной x-позиции объекта, и он движется в правильном направлении.
Сам апплет прокручивается с использованием метода scrollGame(int speed). Этот метод вызывается каждый раз, когда поток выполняется и вызывает (если скорость прокрутки не равна 0) метод scrollObject каждого объекта игры (в нашем примере это звезды в массиве stars и НЛО).
Объекты, которые перремещаются, могут двигаться как обычно, только не забудьте позаботиться that these objects are scrolled too additionally to their movement!

Апплет в примере

В апплете, прилагающемся к данной главе, вы можете найти оба вида объектов (двигающиеся и статичные). Звезды и границы (синего цвета) статичны, и меняются свое положение только во время прокрутки. Летающий НЛО демонстирует, как управлять движущимися объектами. Числа вставлены только для того, чтобы показать вам позицию середины текущего поля зрения и относительные позиции левой и правой границы игрового пространства. Все остальные мелочи в исходном коде довольно просты, и если вы поняли основную идею, их понимание не составит для вас труда.

Скачать исходный код апплета
Запустить апплет

Следующая глава:
Стреляющий космический корабль

Fabian Birzele, 2001-2003.
перевод и веб-дизайн: В.Мурзагалин, 2004.