Создаем и показываем карту
Читатель, готов к созданию некоторых плиток? Создадим функцию 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 - Больше плиток
|