Глава 6. Открытая дверь
Как долго вы можете оставаться в одной комнате? Сколько вы можете смотреть на одну и туже картинку? О, вам нужно много комнат. Один из путей изменения карты, создать новую карту с использованием плиток и корректно разместить в ней Героя. Чтобы создать две комнаты, задаем два массива описания карт: myMap1 = [ [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 2], [1, 1, 1, 1, 1, 1, 1, 1] ];
myMap2 = [ [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1], [3, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1] ];
В главном объекте также установим свойство - номер используемой карты. game={tileW:30, tileH:30, currentMap:1}
Итак мы начинаем с карты myMap1. Чтобы вызвать функцию buildMap для построения карты, мы формируем требуемое имя переменной _root["myMap"+game.currentMap] и получаем то, что хотели - myMap1: buildMap(_root["myMap"+game.currentMap]);
Теперь нам нужен новый объект двери: // Плитка шаблон с новыми свойствами game.Doors = function (newMap, newcharx, newchary) { this.newMap=newMap; // Карта this.newcharx=newcharx; // Позиция Х старта Героя this.newchary=newchary; // Позиция У старта Героя }; game.Doors.prototype.walkable = true; game.Doors.prototype.frame = 3; game.Doors.prototype.door = true;
// Плитка Дверь тип 2 на основе нового шаблона game.Tile2 = function () { }; game.Tile2.prototype = new game.Doors(2, 1, 4); // Плитка Дверь тип 3 на основе нового шаблона game.Tile3 = function () { }; game.Tile3.prototype = new game.Doors(1, 6, 4);
Как вы уже заметили, плитка дверь является проходимой, анимацию показываем 3-им кадром и установим новое свойство door значением true. Будем его использовать, чтобы определить поведение Героя, остановившегося около двери. Двери (как объекты) используют механизм наследования, возможно, это будет какой-либо ужасный звук, но это сейчас нам не интересно. Объекты "doors" созданы с использованием шаблона "Doors" и все экземпляры плиток этого типа будут иметь свойства: будут проходимы и показываться 3-им кадром. Каждая дверь должна содержать следующую информацию: номер следующей карты (переход на другой уровень) и начальную позицию Героя на карте. Если не перемещать Героя в новую позицию, то может получиться конфуз (например, Герой окажется в стене). Внимание, несколько слов о новых координатах Героя. Предположим, разместим Героя на следующей карте на плитке двери, как будто он выходит из стены. В этом случае возможно зацикливание перехода Героя с одной карты на другую, так как на обеих картах Герой будет на плитке двери. В результате процесс движения зацикливается. Напоминаю, лучше размещать Героя на плитке рядом с дверью. Для объекта дверь у нас есть 3 свойства - newmap, newcharx, newchary. Итак, когда число 2 установлено в свойстве newmap , мы знаем, что плитки этой карты должны быть созданы на основе шаблона Tile2, но, так как объект Tile2 создан на основе шаблона Doors, то он (объект Tile2) приобретает все свойства объекта Doors. Tile2 объекты, расположенные на новой карте, будут посылать Героя на карту map2. Но на карте может распологаться не одна дверь. Возможно вы захотите разместить плитку типа дверь на нескольких картах и все они будут посылать Героя на карту map2. Больше действийВ функции moveChar добавим код в конце, прежде чем вернем true: // Проверим (Объект в Двери)? if (game["t_"+ob.ytile+"_"+ob.xtile].door and ob==_root.char) { // ДА меняем карту changeMap (ob); }
Здесь, после перемещения объекта мы проверим обект стоит на плитке двери. Т.к. мы не хотим изменения карты для шаров или кеглей, то нужно проверить что текущий объект - Герой.Будем использвоать функцию changeMap для смены карты: //**************** // Функция: changeMap // Назначение: Смена карты // Параметры: // ob - объект, // Возвращает: // **************************** function changeMap (ob) { // Сформируем имя плитки, где стоит объект var name = "t_"+ob.ytile+"_"+ob.xtile; // Запомним новый номер карты game.currentMap = game[name].newMap; // Запомним новое местоположение объекта (Героя) ob.ytile = game[name].newchary; ob.xtile = game[name].newcharx; // Запомним текущий кадр ob.frame = ob.clip._currentframe; // Построим новую карту buildMap(_root["myMap"+game.currentMap]);
}
Код простой как 3 рубля, получаем значения из объекта дверь и обновляем переменные - currentMap, ytile and xtile . Новые свойства объекта - ob.frame текущее направление движения Героя по клипу. Без этого, наш Герой будет показывать свое движение в frame1 каждый раз, когда он вступает на новую карту. И, конечно, нужно добавить строку вызова функции построения карты, после того как разместим Героя. char.clip.gotoAndStop(char.frame);
Все, теперь можно создавать карты и поиграть с дверями. Можно загрузить исходные коды отсюда. Эта глава была переработана 13 дек. 2003, чтобы включить идеи об объектах двери и решения проблемы множества дверей. Есть вопросы - пишите мне на semikin@dionaholding.ru Читаем дальше - Глава 7. Прыжки Возвращаемся на Начало учебника
|