Облака
Наш Герой научился вставать около стены, это здорово. (Хорошо хоть башкой в стенку не бьется.) Но в разных играх и стенки могут быть разными. Во многих играх стенки имеют тип «облако», при этом Герой может их (стенки) проходить или даже прыгнуть на стенку-облако, да, и остаться там. Посмотрите на картинку, Герой не может пройти плитку с любого направления. 
Ну, а если это облако. Герой может войти туда с любого направления, кроме как сверху (как Ежик в тумане). (Все таки странная проекция, ничего странного, вид с лица, вроде, как наверху не тоже самое, что внизу. Если попробовать сверху, то упадем, прямо с квозь облако вниз.) Если Герой будет стараться войти сверху, то он должен упасть сквозь облако. 
Первое, нужно установить свойство плитки "cloud" (прозрачность). Если плитка прозрачна, то значение - true, и плитка проходима. Объявим этот тип плитки: game.Tile4= function () {}; game.Tile4.prototype.walkable=true; game.Tile4.prototype.cloud=true; game.Tile4.prototype.frame=4;
Для такой плитки свойство проходимости также установлено true и Герой может проходить и вставать на нее. Если же Герой должен падать, то создадим новую функцию checkIfOnCloud. Для начала определим функцию: //**************** // Функция: checkIfOnCloud // Назначение: Проверка плитки под объектом // Параметры: // ob - объект // Возвращает: // true - внизу «облако» // false - внизу препятствие // **************************** function checkIfOnCloud (ob) { // Определяем принадлежность плитки снизу-слева и снизу-справа от Объекта к «облаку» var leftcloud = game["t_"+ob.downY+"_"+ob.leftX].cloud; var rightcloud = game["t_"+ob.downY+"_"+ob.rightX].cloud; // Проверим (Внизу «облако» и Объект НЕ падает)? if ((leftcloud or rightcloud) and ob.ytile != ob.downY){ // ДА - конец return(true); } else { // НЕТ - конец return(false); }
}
Мы используем проверку препятствий снизу - слева / справа от того места, где топчется Герой на плитке. Если плитка прозрачна, то вернем true, иначе false. Теперь, нам нужно вызвать эту функцию в двух местах: (1) в функции moveChar, при проверке движения вниз, и (2) в функции fall, при проверке - может ли Герой стоять на плитке или начнет падать. В функции moveChar это строка после if (diry == 1) if (ob.downleft and ob.downright) {
Добавим проверку прозрачности плитки: if (ob.downleft and ob.downright and !checkIfOnCloud (ob)) {
То же самое в функции fall, заменим строку if (ob.downleft and ob.downright) {
на строку if (ob.downleft and ob.downright and !checkIfOnCloud (ob)) {
Итак, прежде мы использовали только проверку наличия препятствий слева/справа внизу от проходной плитки (по свойствам определенным в функции getMyCorners). Теперь мы добавили проверку прозрачности этих плиток. Ура, салют и брызги шампанского ! Можно загрузить исходные коды отсюда. Исправление ошибок 22.06.2004. Наше с кисточкой Карлосу (Carlos) за обнаружение ошибок в работе с прозрачностью. Я обновил учебник и исходные коды, но если у вас ничего не получается, то посмотрите на код определения прозрачности в функции checkIfOnCloud : if (leftcloud or rightcloud) {
а нужно if ((leftcloud or rightcloud) and ob.ytile != ob.downY) {
Пожалста, замените строку. Есть вопросы - пишите мне на semikin@dionaholding.ru Читаем дальше - Глава 8. Лестницы Возвращаемся на Начало учебника
|