Шрифт:
Ниже перечислены методы класса Layer, которые очень важны для работы со спрайтами и слоями:
► getX – возвращает координату X верхнего левого угла слоя;
► getY – возвращает координату Y верхнего левого угла слоя;
► getWidth – возвращает ширину слоя;
► getHeight – возвращает значение высоты слоя;
► setPosition – устанавливает координаты XY левого верхнего угла слоя;
► move – переместить слой на заданное расстояние в осях XY;
► isVisible – проверяет, видим ли слой;
► setVisible – устанавливает свойства видимости;
► paint – переопределяется в классах-потомках.
Класс Sprite построен на классе Layer, он реализует методы, необходимые для создания двухмерных графических объектов. В класс Sprite добавлены следующие основные функции:
► спрайты основаны на изображениях, они могут состоять из нескольких фреймов;
► изображения спрайта можно преобразовывать (поворачивать, отображать и т. п.);
► для спрайтов, состоящих из нескольких фреймов, можно точно определить последовательность отображения фреймов;
► столкновения спрайтов можно определять, используя обычные или уменьшенные ограничивающие прямоугольники или данные изображений.
Вы видите, что класс Sprite предлагает массу возможностей для программирования графики в мобильных играх. В этой главе вы не затронете все указанные аспекты, но вскоре восполните этот пробел. Пока мы сосредоточимся на создании и основах работы со спрайтом. Чтобы создать спрайт из одного изображения, передайте созданный объект Image конструктору класса Sprite:
Sprite monsterSprite = new Sprite(Image createImage(«/monster.png»));
В этом примере изображение монстра используется как основа для создания спрайта. Проблема заключается в том, что если вы поместите этот код в мидлет, то получите сообщение компилятора об ошибке, поскольку исключение, вызываемое вводом-выводом, не обрабатывается. Это исключение может быть обработано с помощью метода createImage в случае ошибки загрузки изображения. Ниже приведен код структуры try-catch, выполняющей это:
try {
monterSprite = new Sprite(image.createImage("/Monster.png");
monsterSprite.setPosition(0,0);
}
catch (IOException e) {
System.err.println("Failed loading image!");
}Несмотря на то что класс Layer инициализирует положение каждого слоя в точке (0,0), полезно инициализировать положение каждого спрайта, как показано в коде. Когда вы загрузили спрайт и он готов к использованию, вы можете перемещать его по экрану, вызывая метод setPosition или move. Ниже объясняется, как это сделать: 1. пример использования метода setPosition для центрирования спрайта на экране:
monterSprite.setPosition((getWidth – monsterSprite.getWidth) / 2, (getHeight – monsterSprite.getHeight) / 2);
Этот метод для вычисления положения центра используют высоту и ширину холста и размеры спрайта. 2. перемещение спрайта работает несколько иначе – необходимо указать расстояния вдоль осей, на которые необходимо переместить спрайт:
monsterSprite.move(-5, 10);
В этом примере спрайт перемещается на 5 пикселей влево и 10 пикселей вниз. Отрицательные смещения задают перемещения влево или вверх, а положительные – вправо или вниз. 3. поскольку c каждым объектом класса Sprite ассоциировано изображение, то метод paint рисует изображение в заданном месте:
monsterSprite.paint(g).
В этом коде предполагается, что у вас есть объект класса Graphics с именем g, такой объект обязательно должен присутствовать в любой игре.
Вы познакомились с основами спрайтовой анимации в MIDP API. Нам осталось только рассмотреть класс GameCanvas, специально предназначенный для анимации благодаря двойной буферной анимации.
Создание плавной анимации с помощью класса GameCanvas
Если бы вы попытались использовать все, что узнали о программировании спрайтовой анимации, и создали бы мидлет с использованием обычного класса Canvas,TO в результате получили бы прерывистую анимацию. Такой эффект возникает вследствие того, что перед отображением картинки экран очищается. Иначе говоря, при каждом перемещении объекты анимации стираются и перерисовываются. Поскольку отображение и стирание происходит непосредственно на экране, возникает эффект прерывности анимации. Для наглядности представьте себе фильм, в котором между двумя последовательными кадрами отображается белый экран. Несмотря на то что иллюзия движения будет создаваться по-прежнему, между фреймами будет выводиться пустой экран.
Вы можете решить эту проблему, используя методику, известную как «двойная буферизация». При двойной буферизации выполняется стирание и рисование на невидимом для пользователя экране. По окончании рисования результат выводится непосредственно на игровой экран. Поскольку видимая очистка экрана не выполняется, в результате вы получаете гладкую анимацию. На рис. 5.6 показана разница между традиционной однобуферной анимацией и анимацией с двойной буферизацией.
В копилку Игрока
Буфер – место в памяти, в котором можно создавать графику. В традиционной буферной анимации роль буфера выполняет экран, а при создании анимации с двойной буферизацией к экрану добавляется область памяти.
На рис. 5.6 показано, как используется буфер в памяти для выполнения всех необходимых действий. Это может показаться хитрым приемом программирования, однако все делается очень просто (благодаря MIDP 2.0 API).