на главную почта поиск
 
поиск
Диона Холдинг
   
   
FLASH-версия 
 Версия для печати 
  Новости
 

   
Новости  
   

Создаем и показываем карту

Читатель, готов к созданию некоторых плиток? Создадим функцию buildMap, которая будет создавать и сохранять размещенные плитки. Если у вас есть желание, можно использовать ту же функцию для выполнения подобных и других действий над разными массивами карт. Итак функция buildMap будет выполнять следующее:

  • присоединение контейнера с клипом,
  • создание структуры плиток карты на основе массива описания карты
  • создание нового объекта для каждой плитки
  • присоединение клипа плиток к объекту в общую структуру клипов
  • размещение плиток в требуемой позиции
  • корректный показ кадров плитки.

Здесь код функции:

//****************
// Функция: buildMap
// Назначение: Создание объектов и построение карты
// Параметры: map – двумерный массив описания карты
// Возвращает:
// ****************************
function buildMap (map) {

// Присоединяем клип empty из билиотеки и назовем его tiles, клип кладем на уровень d+1
_root.attachMovie("empty", "tiles", ++d);
// Клип tiles сохраним в объекте
// Клип empty в билиотеке может быть некоторым фоном, на который будут накладываться плитки
game.clip=_root.tiles;
// Переменные задают размер карты
var mapWidth = map[0].length;
var mapHeight = map.length;

// Цикл (по строкам массива карты) делать
for (var i = 0; i < mapHeight; ++i) {
// Цикл (по столбцам массива карты) делать

for (var j = 0; j < mapWidth; ++j) {

// Формируем Имя плитки
var name = "t_"+i+"_"+j;
// Создаем новый объект и сохраняем его в массиве объектов, индекс которого - имя плитки
// Это, пожалуй самый хитрый трюк в работе с массивом
game[name]= new game["Tile"+map[i][j]]();
// Присоединяем клип плитки из библиотеки и называем его, клип кладем на уровень i*100+j*2
// Теперь у нас уже в клип empty включаются клипы плиток, т.е. иерархия клипов будет выглядеть:
// _root (корень)

// tiles

// t_YYY_XXX

// -----------------------------
game.clip.attachMovie("tile", name, i*100+j*2);
// Координаты Х и У клипа
game.clip[name]._x = (j*game.tileW);
game.clip[name]._y = (i*game.tileH);
// Устанавливаем кадр в клипе
game.clip[name].gotoAndStop(game[name].frame);

}

}

}

Первая строка – объявляется функция и устанавливаются аргументы для ее вызова. Когда мы вызываем функцию, мы передаем в нее массив описания карты, это переменная уже объявленного двумерного массива.

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

_root.attachMovie("empty", "tiles", ++d);

Нам будет нужен пустой клип (без графики) в библиотеке. Кликните ПКМ (правой кнопкой «мыши») на панели library, выбирите "Linkage..." , выбираем тип присоединяемого элемента "Export this symbol" и вводим "empty" в поле Identifier . Теперь команда attachMovie будет показывать клип "empty" из библиотеки. Теперь мы создадим экземпляр этого клипа и назовем его "tiles" . Этот клип будет сохранять клипы всех плиток, которые мы разместим на карте. Что замечательно в использовании контейнера клипа, так это простота удаления всех плиток (например, в конце игры). Нам достаточно удалить контейнер клипа tiles и все клипы плиток будут удалены. Если мы присоединим все плитки на уровень _root, то при окончании игры и удалении всех присоединенных плиток, нам придется удалять их с помощью команд actionscript для каждой плитки.

Ну раз у нас есть клип для присоединения всех плиток, то свяжем два объекта game.clip = _root.tiles. Теперь, когда нам нужно будет получить доступ к плитке, можно использовать game.clip. Это замечательно, если нам потребуется разместить плитку где-нибудь еще, достаточно переименовать эту строку, а не пользать по всему коду.

Теперь, создаем две новых переменных – mapWidth и mapHeight. Их мы будем использовать для просмотра массива описания карты. mapWidth - задает ширину карты, т.е. количество элементов первого элемента массива карты - map[0].length. (Забыли, посмотрите еще раз главу «Формат карты», чтобы вспомнить, как выглядит массив описания карты). Первый элемент массива карты содержит массив [1, 1, 1, 1, 1, 1, 1, 1] и mapWidth будет определять количество элементов этого массива. Теперь мы знаем ширину нашей карты.

Аналогично mapHeight будет определять map.length - количество строк в массиве карты. И теперь нам известно, сколько строк нам нужно создать.

Организуем пересчет всех элементов массива описания карты:

for (var i = 0; i < mapHeight; ++i) {

for (var j = 0; j < mapWidth; ++j) {

Начинаем пересчет с начала по i (счетчик строк массива) с 0 и шагом 1, до тех пор, пока i меньше высоты карты. Далее пересчитываем элементы по j (счетчик элементов внутреннего массива) с 0 и шагом 1, до тех пор, пока j меньше ширины карты.

Переменная "name" в следующей строке получает имя var name = "t_"+i+"_"+j для нового объекта плитка. Предположим i=0 j=1, тогда переменная name = "t_0_1", если i=34 j=78, то переменная примет значение - "t_34_78".

Теперь создаем новый объект плитка:

game[name]= new game["Tile"+map[i][j]]();

В левой части, game[name] будем указывать, что новый объект располагается внутри объекта game , как и все другие объекты. Значение map[i][j] даст нам номер из массива описания карты, по индексам i, j. Использование ключевого слова обеспечивает создание нового объекта плитка по прототипу, который был описан ранее. Теперь у нас есть новый объект в объекте game, содержащий текущую плитку.

(В выражении game[name] используется скрытая особенность actionscript Flash, такое написание равносилько записи - game.<значение name>. Т.е. при name = "t_34_78", получаем game.t_34_78 . Где t_34_78 - некоторый объект. Вся строка целиком говорит о том, что в объекте game, создан некое свойство с именем name, в которое записан адрес объекта созданного на основе шаблона game.TileX, где Х - число из элемента i,j массива описания карты map. Уф, кажись закончилась эта кладезь мудрости. )

В следующей строке присоединяем новый клип и используем конструкцию game.clip[name] для доступа к нему. Клип будет размещаться в корректной позиции с использованием индексов массива карты. Так как наш новый объект плитка наследует свойство "frame" из прототипа, то, используя команду gotoAndStop, переходим к кадру клипа, который и будет показывается.

Для создания карты из плиток вызываем функцию построения карты:

buildMap(myMap);

Можно загрузить исходный код отсюда.

Есть вопросы - пишите мне на semikin@dionaholding.ru

Продолжение Главы 2 - Больше плиток

 

Всего: 5

Электронные формы от Adobe

14 ноября с.г. компания представила новую версию всем известного средства Adobe Acrobat. 8-ая по счету версия принесла новые возможности по переходу от бумажных документов к электронным.
читать
 

АрмПарк - Универсальная учетная система

Серия материалов о программе - АрмПарк - Универсальная учетная система. Решение для тех кому необходимо быстро создать и внедрить электронную картотеку по учету - документов, матералов, оборудования, ресурсов или зеленых человечков.
читать
 

Программирование игр на основе плиток

Представляется перевод замечательного учебника по созданию движка игры на основе плиток (Tile Based Games). Я благодарен автору Tonypa за разрешение публикации перевода. Если у Вас возникают вопросы, пишите и я постараюсь Вам помочь.
читать
 

Универсальная информационная система-конструктор Учет документов (Доклад на конференции).

Доклад на Третьей практической конференции по Электронному Документообороту - "Программа "Учет документов" ", 9 декабря, Москва, Мэрия Москвы.
читать
 

Интеграция систем с использованием новых технологий

Один из ключевых моментов совершенствования электронного бизнеса - это повышение гибкости процессов за счет ускорения реализации решений в области интеграции.
читать
Всего: 5

Rambler's Top100

   
   

новости

продукты

решения

услуги

о компании

   
   
125315, Москва, Часовая ул., д.30
Телефон: (095)797-32-82; Факс: (095)797-32-81
© 2005 ООО "Диона Холдинг"
Администратор: admin@dionaholding.ru