Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Секреты разработки игр в Macromedia Flash MX - Макар Дж.

Макар Дж. Секреты разработки игр в Macromedia Flash MX — М.: КУДИЦ-ОБРАЗ , 2004. — 608 c.
ISBN 0-201-77021-0
Скачать (прямая ссылка): sekretirazrabotkiigr2004.djvu
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 210 >> Следующая

4 var zm = temp[1};
5 if (!world.char.moving SS xm>=0 SS xm<=worId.width
SS zm>=world.length SS zm<=0) (
6 var x = worId.char.x;
7 var z = world.char.z;
8 world.char.startx = x;
9 world.char.startz = z;
10 worId.char.endx = xm;
11 world.char.end2 = zm;
12 var angleSpan = 360/8;
xnum, z, znum, object) {
innerTile.gotoAndStop
ва 8. Изометрический взгляд на мир
217
13 var angle = Math.atan2(zm-z, xm-x);
14 var realAngle = angle*180/Math.PI;
15 realAngle += angleSpan/2;
16 if (realAngle<0) {
17 realAngle + = 3 6 0 ;
18 }
19 var frame = Math . cei1(realAng1e/angleSpan);
20 world.char.clip.gotoAndStop("walk"+frame);
''I wor Id . char . f rame = frame;
22 world.char.moving = true;
3 var cosAngle = Math.cos(angle) ;
4 var sinAngle = Math.sin(angle);
5 world.char.xmov = world.char.speed*cosAngle;
6 world.char.zmov = world.char.speed*sinAngle;
7 world.char.feelerx = world.char.feeler*cosAngle;
8 world.char.feelerz = world.char.feeler*sinAngle;
9 }
I ° 1
К ювный оператор в строке 5 проверяет, находится ли нажимаемая область
пределах мира и не двигается ли уже персонаж. Если условие
удовлетворяется, блок условного оператора выполняется и подготавливает
персонажа к движе-ш. Что входит в эту подготовку? Для персонажа,
способного к движению, мы ||>сделяем угол, в котором он движется, кадр
угла поворота (1 из 8), под кото-м отображается персонаж, и скорость в
каждом направлении движения пер-мжа. В строках 8 и 9 мы храним начальное
положение персонажа. (Это на-II.мое положение используется позднее для
определения, достиг ли персонаж т.) В следующих двух строках мы храним
конечное положение персонажа. |ем в строке 12 мы создаем переменную с
именем angleSpan, которая хранит •чение градусов для каждого из восьми
возможных углов, в которых может Г 1стать персонаж. Мы потом будем
использовать это значение (наряду с уг-1. образованным курсором мыши и
персонажем, найденным в строке 14) для ч-делсния, какой из восьми кадров
отображать в строке 19. При использова-и метода Math.atan2() для
определения угла мы будем иногда получать отри-it-льные углы.
Отрицательные углы вполне допустимы, но я предпочитаю ра-i.iгь с
положительными углами. Поскольку углы цикличны (то есть 350 то же,
I -10), мы можем просто добавить 360 к любому отрицательному углу,
чтобы пчить положительное представление угла. Этот переключатель
реализован ' роке 16. Как упомянуто выше, строка 19 вычисляет, какой
номер кадра пер-|.1жа отображать в клипе персонажа. Мы используем его в
строке 20 и сохра-
218
Часть 2. Исследование ос
няем значение в строке 21. Затем устанавливаем свойство moving в true в
объек char. Далее мы сохраняем значение синуса и косинуса угла, поскольку
они пользуются более одного раза (строки 23 и 24), затем мы используем
триго! метрию для вычисления скорости движения персонажа (строки 25 и
26), тем способом, который мы применяли не раз в этой книге. И наконец,
мы устанц ливаем значения feelerx и feelerz. Эти значения мы будем
прибавлять к врем ным координатам, когда делаем проверку на столкновения.
Далее у нас идет функция moveCharacter(). Эта функция вызывается в к дом
кадре.
1 function moveCharacterf) {
2 if (worId.char.raoving) {
3 worId.char.tempx = world.char.x+worId.char.xmov;
4 wor1d.char.tempz = worId.char.z+world.char.zmov;
5 worId . char.tempy = world.char.y + worId.char.ymov ;
6 var sx = world.char.startx;
7 var sz = world.char.startz;
8 var ex = world.char.endx;
9 var ez = worId.char.endz;
10 var tempx = worId.char.tempx;
11 var tempz = world.char.tempz;
12 if ((ex-sx)/Math.abs(ex-sx)
!= (ex-tempx)/Math.abs(ex-tempx)
II (ez-sz)/Math.abs (ez-sz)
!= (ez-tempz)/Math.abs(ez-tempz)) {
13 world.char.moving = false;
14 world.char.xmov = 0;
15 world.char.zmov = 0;
16 worId.char.tempx = ex;
17 world . char ..tempz = ez;
18 worId.char.cl ip.gotoAndStop ("stand"+world.char.frame);
19 }
20 }
21 }
Первой задачей этой функции является проверка, двигается ли персонаж, да
(то есть moving равна true), то мы перемещаем его. Строки 3-5 устанавл ют
временную позицию персонажа на основе его текущей позиции и его ск сти в
каждом направлении. Зачем мы создаем ссылки на его начальную и ki ную
позиции с тем, чтобы уже довольно длинное выражение if в строке 12
ава 8. Изометрический взгляд на мир
219
ядело немного более рациональным. Условие, которое мы ищем в строке 12,
миольно просто, хотя оно и выглядит сложным. Мы пытаемся определить, дос-
III ли персонаж своей цели назначения. Если да, то знаки (+ или -)
разности жду 1) его текущего положения и цели назначения и 2) между
начальной потней и целью назначения будут различны (как в х, так и в z-
паправпениях).
Давайте возьмем пример с персонажем, который двигается только в
направлении х. Начальная позиция равна 10, а конечная позиция равна 100.
Знак разности между конечной и начальной позицией + (положительный). Вы
найдете его делением разности на абсолютное значение этой разности:
Предыдущая << 1 .. 66 67 68 69 70 71 < 72 > 73 74 75 76 77 78 .. 210 >> Следующая