Беларусь, рогачёв |
Классы и клипы
Сложности с удалением клипов и счетчиками
Все объекты, созданные с помощью attachMovie или duplicateMovieClip, можно благополучно удалять посредством removeMovieClip. Здесь все достаточно очевидно, за исключением того, что при удалении определенных объектов у вас будут образовываться "дырки", то есть пустые уровни, а счетчик уровней будет расти, и в конце концов, уровни закончатся. Примером может быть известная игра "жизнь", в которой общее число объектов невелико, но постоянно рождаются новые и умирают старые. Для реализации такой игры нам понадобился бы специальный механизм - механизм распределения уровней.
Распределители уровней
Распределители уровней могут использоваться с разными целями. Вот пример некоторых полезных функций, которые они могли бы выполнять:
- Вернуть любой свободный уровень;
- Вернуть свободный уровень, выше (ниже) которого гарантированно ничего не лежит.
- Вернуть свободный уровень, который гарантированно находится между уровнями двух заданных объектов (или просто выше какого-то объекта или ниже какого-то объекта).
Даже только одной первой функции уже достаточно для реализации игры "жизнь", поскольку там не важно, как размещены объекты друг относительно друга по вертикальной оси.
Для реализации такого распределителя достаточно хранить самый верхний занятый уровень, а также массив "дырок", и при каждом запросе возвращать любой элемент массива, если он не пустой, или самый верхний занятый уровень плюс 1 в противном случае.
Опишем два ключевых момента в реализации более сложного распределителя уровней, который поддерживает все три функции (из перечисленных выше).
Во-первых, такой распределитель должен хранить оптимизированную для поиска структуру данных с "дырками" (свободными уровнями ), например, сортированный массив. Это может понадобиться, скажем, для того, чтобы для двух любых заданных уровней можно было определить дырку между ними.
Во-вторых, нужно помнить, какой объект на каком уровне лежит. Это можно сделать двумя способами: с помощью эффективной хеш-таблицы или же просто запоминать уровень объекта в самом объекте.
Слежение за переменными
Допустим, что вам нужно контролировать изменения значений какого-то поля объекта. Например, нужно запретить изменение значения какой-либо переменной либо "навесить" дополнительное поведение к уже готовому коду.
Классическим решением данной проблемы является использование свойств вместо полей, в таком случае всю обработку изменения вы можете произвести в setter -методе.