Глава 14. Больше скроллинга
Пока Герой в центре все будет отлично, при перемещении к границе карты, появляется необходимость показа фона за пределами карты. Можно не обращать внимания на эту проблему, если построить высокие стены по границе карты, тогда при подходе Героя к краю, стенки еще наращиваются, и все дела, ничего не будет видно. Но это - не решение проблемы, нужно еще что-нибудь придумать. Например, показывать некоторый фон за пределами карты. Лучшая идея передвигать (скроллировать) границу показа фона, а фон можно и не трогать. Что значит далеко – очень далеко?Герой всегда движется, только по разному, и, когда он подойдет к краю карты, нужно будет проскроллировать фоновые плитки. Такое скроллирование создается особым способом. На левой картинке Герой находится слева на расстоянии halfvisx от края. Если Герой начнет движение влево, нужно скроллировать карту и тогда увидим, что находится за стеной. 
Справа на картинке, Герой внизу на расстоянии halfvisy от края. Нам нужно что-то показывать, если Герой пойдет вниз. Нам нужно решение для новой позиции Героя, когда первый раз строится карта. Если Герой начинает свое движение от угла карты, он не может быть размещен в центре. А что произойдет, если мы разместим все плитки, включая Героя, в функции buildMap с некоторым смещением. После строк размещения клипов плиток и вычисления значений свойств halfvisx/halfvisy в функции buildMap добавим строки кода: game.mapwidth=map[0].length; game.mapheight=map.length;
Свойство game.mapwidth хранит число горизонтальных плиток текущей карты, а свойство game.mapheight число вертикальных плиток. Будем это использовать, если Герой окажется справа или внизу около края карты. Давайте вычислим сколько нам нужно пройти плиток до края: // Проверим (Позиция Героя далеко от границы по Х)? if(game.halfvisx>char.xtile){ // ДА - Вычислим поправку var fixx=char.xtile-game.halfvisx; var fixx1=0;
// НЕТ Проверим (Герой близко к краю)? }else if(char.xtile>game.mapwidth-game.halfvisx-1){ // ДА Вычислим поправку var fixx=char.xtile-game.mapwidth+game.halfvisx+1; var fixx1=1; }
// Проверим (Позиция Героя далеко от границы по У)? if(game.halfvisy>char.ytile){ // ДА Вычислим поправку var fixy=char.ytile-game.halfvisy; var fixy1=0;
// НЕТ Проверим (Герой близко к краю)? }else if(char.ytile>game.mapheight-game.halfvisy-1){ // ДА Вычислим поправку var fixy=char.ytile-game.mapheight+game.halfvisy+1; var fixy1=1; }
Переменные fixx / fixy будут содержать номера плиток, где может находится Герой в пределах карты. В первой строке проверяется положение Героя в левом углу, что бывает при xtile меньше halfvisx, и затем перемещаем плитки на величину xtile-halfvisx . В правом углу Герой останавливается, если уtile больше mapheight-halfvisy. Переменные fixx1 / fixy1 (прошу прощения за неудобоваримые названия переменных) будут использоваться в цикле, когда мы будем спрыгивать с плиток. Без этих строк кода, плитки не будут размещаться вне видимой области карты при подходе Героя к краю карты. Теперь добавим свойства fixx / fixy в расчет позиции плитки: // Добваление поправок в расчет координат Х и У game.clip._x = game.centerx-((char.xtile-fixx)*game.tileW)-game.tileW/2; game.clip._y = game.centery-((char.ytile-fixy)*game.tileH)-game.tileH/2;
И добавим их (переменные) в цикл для создания видимых плиток. Убедимся, что начинаем расчет с правой плитки и добавляем эти переменные для xstep and ystep : char.xstep=char.x-(fixx+fixx1)*game.tileW; char.ystep=char.y-(fixy+fixy1)*game.tileH;
Это все изменения в функции построения карты buildMap. Теперь перейдем в функцию движения Героя. Перемещение на краю картыВ функции moveChar сначала вычисляем переменные fixx / fixx1 тем же самым путем, как и в функции построения карты buildMap. Затем возьмем часть кода скроллинга из условного выражения, для случая, когда Герой достаточно далеко от края карты. Аналогично модифицируем код для вертикального перемещения около края карты. С тех пор, как функция changeTile вызывается для изменения плитки, которой на самом деле нет, добавим простой и быстрый способ расчета. Если старая плитка не существует, то ничего и не делаем. if(game[nameold].walkable==undefined){ return; }
Это все по департаменту скроллинга, далее посмотрим на уровни клипов и то, что называется страшными словами «z-сортировка». (На самом деле очень интересная вещь, так как затрагивает основу показа клипов на экране.) Можно загрузить исходный код отсюда. Эта глава была переписана 9.04.2004, потому что оригинальный код не работал для правого и нижнего краев карты. Благодарности Дэйву (Dave) за найденные ошибки. Есть вопросы - пишите мне на semikin@dionaholding.ru Читаем дальше - Глава 15. Уровень клипа (Глубина резкости) Возвращаемся на Начало учебника
|