Anthill Game Framework

Tiny framework for creating Flash games.

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

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


anthill:antentity

AntEntity

Данный класс унаследован от AntBasic и является базовым для всех стандартных объектов, таких как AntActor, AntButton и AntLabel. Особенность класса AntEntity (сущности) заключается в том, что он несет в себе функционал для работы с объектами как с группами, позволяя их вкладывать друг друга на бесконечное количество уровней.

Сама сущность является не визуальным объектом и, как правило, не имеет размеров, но при этом, если вкладывать в нее другие визуальные объекты, они будут полноценно обрабатываться и отрисовываться.

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

При перемещении или вращении сущности все вложенные в неё объекты будут так же подвержены перемещению или вращению, но при этом их локальные координаты не изменятся. Чтобы узнать глобальное положение объекта в игровом мире с учетом трансформаций родителя, следует обратиться к переменным globalX, globalY и globalAngle. Изменять значения globalX, globalY и globalAngle нет смысла, так как они рассчитываются автоматически, исходя из положения объекта и его родителей.

При вызове метода kill() для сущности, все вложенные в неё объекты так же будут «убиты», но при этом вложенные объекты не будут «воскрешены» методом revive(). После воскрешения сущности вложенные в неё объекты следует «воскрешать» или «перерабатывать» вручную.

При вызове у сущности метода destroy() для всех вложенных в нее объектов так же будет вызван метод destroy(), после чего они будут удалены из самой сущности. Предполагается, что после вызова метода destroy() сущность уже не подлежит «переработке».


Переработка

В реализацию сущности встроен механизм «переработки» объектов, что позволяет переиспользовать ранее созданные и временно неиспользуемые объекты. Данная технология хорошо подходит для любого типа игр, более того она оптимизирует работу игры. Все дело в том, что на создание нового экземпляра класса уходит намного больше времени, чем на возвращение ранее используемого, но уже не нужного экземпляра класса, у которого просто сбрасываются необходимые переменные, такие как жизнь, позиция и т.п.

Механизм переработки очень прост в использовании. Если вам нужно создать новый объект, вложенный в текущую сущность, то достаточно написать следующий код:

var bullet:MyBullet = recycle(MyBullet) as MyBullet;

Метод recycle() проверит наличее доступных для «воскрешения» экземпляров класса MyBullet и вернет первый свободный. Если вдруг доступных для «воскрешения» экземпляров не окажется, то будет автоматически создан и добавлен в сущность новый экземпляр класса MyBullet1).

Но прежде чем использовать «переработанный» экземпляр класса, следует проверить, новый он или нет, и при необходимости «воскресить»:

if (bullet.exists != true)
{
  // Старый экземпляр класса
  bullet.revive();
}
else
{
  // Новый экземпляр класса
  // ...
}

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

Чтобы «убить» экземпляр класса пули после того, как она становится не нужна, но при этом оставить доступной для «переработки», вызывайте метод kill().

bullet.kill();

Чтобы узнать количество живых или мертвых объектов внутри сущности, вы можете использовать методы:

  • numLiving() — возвращает количество объектов, атрибуты exist и alive которых равны true;
  • numDead() — возвращает количество объектов, атрибуты alive которых равны false.

Сортировка

В сущности реализован доступный способ сортировки вложенных объектов по любому атрибуту средствами стандартной сортировки Array. Сортировка вложенных сущностей выполняется только по числовым значениям, а порядок сортировки (по возврастанию или убыванию) задается константами AntEntity.ASCENDING и AntEntity.DESCENDING. По умолчанию сортировка выполняется по возрастанию. Пример сортировки:

myEntity.sort("y");

При вызове данного метода все вложенные объекты будут отсортированы по Y сверху вниз. То есть применительно к игре это означает, что все объекты, находящиеся ближе к нижней части экрана, будут перекрывать те, что находятся ближе к верхней части экрана.

Если порядок сортировки необходимо определить какими-либо более сложными условиями, то для этого вначале следует для каждого вложенного объекта рассчитать условие (значение поля, по которому будет выполнятся сортировка), а потом вызывать метод сортировки. Специально для сортировки по сложным условиям добавлена переменная: z (глубина) которую вы можете использовать для хранения расчетов.

Пример сортировки сверху-вниз и слева-направо:

var e:AntEntity;
for (var i:int = 0; i < numChildren; i++)
{
  e = children[i] as AntEntity;
  if (e != null && e.exists)
  {
    e.z = e.y + e.x;
  } 
}

sort("z");

1) MyBullet — абстрактное имя класса для более наглядного примера.
anthill/antentity.txt · Последние изменения: 11.05.2013 11:14 — Илья Уткин