Anthill Game Framework

Tiny framework for creating Flash games.

Инструменты пользователя

Инструменты сайта


guide:camera

Работа с камерой

Камера — это объект который представляет собой окно в игровой мир Anthill. Существование камеры упрощает понимание и взаимодействие с игровым миром. Но больше всего камеры упрощают разработку игр с большими игровыми мирами где игровой уровень выходит далеко за пределы одного экрана. Например, если в классической иерархии Flash приложения нам приходится двигать весь мир чтобы игрок мог видеть своего персонажа, то в случае использования камеры мы двигаем только камеру и ничего более. Так же камеры облегчают разработку игр на двоих игроков за одним компьютером. Но давайте рассмотрим все по порядку.


Создание камеры

После инициализации Anthill первое что вы должны сделать — это создать экземпляр камеры и задать ей основные настройки. Как правило камеру необходимо создавать в методе create() вашего игрового состояния, если камера не будет создана после вызова метода create(), то будет создана камера по умолчанию с базовыми настройками. Пример создания камеры вручную:

var camera:AntCamera = new AntCamera(0, 0, 640, 480);
AntG.addCamera(camera);

При создании камеры первыми двумя аргументами мы указываем положение камеры по X и Y на экране Flash приложения, а вторыми двумя аргументами мы задаем размер окна камеры. Второй стройкой мы добавляем камеру в структуру Anthill для обработки.

Например, если вы хотите создать две камеры для split-screen (разделенный экран на двух игроков), то код инициализации может выглядеть следующим образом:

var cameraPlayer1:AntCamera = new AntCamera(0, 0, 320, 480);
var cameraPlayer2:AntCamera = new AntCamera(32, 0, 320, 480);
AntG.addCamera(cameraPlayer1);
AntG.addCamera(cameraPlayer2);

По умолчанию у камеры отключен режим очистки буфера, таким образом если у вас нет графического фона и вы рассчитываете на однотонную заливку, то с настройками камеры по умолчанию вы увидите остающиеся шлефы от ваших графических объектов. Чтобы включить очистку буфера заливкой, следует установить параметры заливки:

camera.fillBackground = true;
camera.backgroundColor = 0xff000000;

После того как в вашей игре появляется графический фон, рекомендуется отключать заливку чтобы не тратить драгоценное время и силы процессора на очистку буффера. Если кадр полностью обновляется, что обычно происходит в 99% играх, то очистка буфера — это просто лишняя трата времени.

Если вы создали одну или несколько камер вручную, то вам необходимо их удалить после выхода из игрового состояния в момент вызова метода состояния destroy(), например:

camera.destroy();
camera = null; // Обнуляем указатель на камеру чтобы её забрал «сборщик мусора»

При этом предварительно удалять камеру из структуры Anthill совершенно не обязательно, камера удалится автоматически при вызове метода destroy().


Перемещение и слежение

Чтобы реализовать перемещение камеры внутри игового мира, вам следует использовать параметр камеры scroll. Например, чтобы сдвинуть положение камеры внутри игрового мира влево, следует использовать следующий код:

camera.scroll.x += 100 * AntG.elapsed;

Чтобы быстро переместить камеру в заданную точку, используйте метод focusOn():

camera.focusOn(500, 600);

В качестве аргументов задается новое положение по X и Y. Так же вы можете указать для камеры объект за которым она будет следить автоматически:

camera.follow(myObject);

В качестве объекта за которым должна следить камера, может быть любой объект унаследованный от класса AntEntity. Так же при указании объекта за которым должна следить камера, вы можете указать стиль слежения указав его вторым аргументом. Существует три стиля слежения:

  • AntCamera.STYLE_FREELY — свободное слежение по вертикали и горизонтали;
  • AntCamera.STYLE_HORIZONTAL — слежение только по горизонтали;
  • AntCamera.STYLE_VERTICAL — слежение только по вертикали.

Пример использования:

camera.follow(myObject, AntCamera.STYLE_HORIZONTAL);

По умолчанию камера следит за объектом используя в качестве его позиции параметры globalX и globalY, но вы можете задать произвольные параметры для слежения. Например, если вы создали свой класс унаследованный от AntEntity и используете свой алгоритм позиционирования который не зависит от globalX и globalY, то вы можете указать камере какие параметры использовать указав их текстовые имена следующим образом:

camera.positionPropertyX = "myPositionX";
camera.positionPropertyY = "myPositionY";

Так же вы можете настроить под себя некоторые параметры слежения камеры чтобы получить наилучший эффект слежения. Например, вы можете задать фактор отставания камеры от цели, что позволит создать более мягкое преследование и/или задать фактор опережения, что наоборот поможет создать хороший эффект видимости, например для гоночной аркады (чем больше скорость машинки, тем больше игрок сможет видеть дорогу перед собой). Факторы слежения и опережения существуют отдельно друг от друга, поэтому вы можете менять их на свое усмотрение одновременно.

camera.leadingFactor = 15; // Фактор опережения, по умолчанию 8
camera.smoothFactor = 0.5; // Фактор отставания, по умолчанию 0.25

Если вы не хотите чтобы камера выезжала за границы вашего игрового мира, то просто задайте ей мертвую зону используя метод setBounds():

var lowerX:int = 0;
var lowerY:int = 0;
var upperX:int = 1500;
var upperY:int = 1500;
camera.setBounds(lowerX, lowerY, upperX, upperY);

В качестве аргументов указываются наименьшие и наибольшие границы по горизонтали и вертикали. После установки мертвой зоны, камера не при каких условиях не сможет покинуть её пределы.


Дополнительные возможности

Используя зум камеры вы можете создавать игры в ретро стиле (с большими пикселями). Чтобы получить такой ретро эффект, при инициализации камеры достаточно указать пятым аргументом зум камеры:

var zoom:Number = 2; // Увеличение в два раза
var camera:AntCamera = new AntCamera(0, 0, 640, 480, zoom);

Так же вы можете поменять зум камеры уже после её создания. Более того, вы можете использовать динамическое приближение камеры во время игры чтобы подчеркнуть какие-либо игровые события.

camera.zoom += 10 * AntG.elapsed;

По умолчанию зум привязан к левому верхнему углу чтобы было удобно работать создавая игры в ретро стиле. Но если вы планируете использовать зумм для создания каких-либо эффектов в игре, то вам следует переключить стиль зума таким образом чтобы он был привязан к центру камеры:

camera.zoomStyle = AntCamera.ZOOM_STYLE_CENTER;

Если при увеличении зума камеры вас не устраивают пиксели, то включите режим сглаживания:

camera.smoothing = true;

guide/camera.txt · Последние изменения: 16.10.2013 14:53 — Anton Karlov