- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript - Гэри Розенцвейг
Шрифт:
Интервал:
Закладка:
function moveFox() {
(1) → // Определяем границы возможного перемещения лисы.
foxBounds = determineBounds(foxPos);
(2) → // Если под лисой пусто, она начинает падать.
if ((foxBounds.bottom > 0) and (!falling)) falling = true;
(3) → // Падение.
if (falling) checkFall();
(4) → // Если нажата левая стрелка, то движемся влево, если там нет препятствия.
if (Key.isDown(Key.LEFT)) {
if (foxSpeed < foxBounds.left) {
foxPos.x -= foxSpeed;
}
if (foxPos.x < 0) foxPos.x = 0;
fox._xscale = 25;
moving = true;
// Если нажата правая стрелка, то движемся вправо, если там нет препятствия.
} else if (Key.isDown(Key.RIGHT)) {
if (foxSpeed < foxBounds.right) {
foxPos.x += foxSpeed;
}
if (foxPos.x > worldEnd) foxPos.x = worldEnd;
fox._xscale = -25;
moving = true;
// Если не движемся.
} else {
moving = false;
}
(5) → // Если стоим на поверхности и нажат пробел – прыгаем.
if (Key.isDown(Key.SPACE) and (!falling)) {
fallSpeed = jumpPower; // Прыжок = падение вверх
falling = true;
if (!moving) { // Используем анимацию прыжка только если лиса не идет.
fox.gotoAndPlay("jump");
}
}
(6) → // Если идет и не падает, то анимируем ходьбу.
if (moving and !falling) {
fox.nextFrame();
// Если не идет или падает – кадр со стоящей лисой.
} else if (!moving and !falling) {
fox.gotoAndStop(1);
}
(7) → // Позиция лисы по вертикали.
fox._y = floor – foxPos.y;
// Активируем кролика.
moveBunnies();
// Перерисовываем все объекты в соответствии с новой позицией.
drawObjects();
// Проверяем, не съеден ли орех.
getAcorns();
}Функция determineBounds выглядит сложно, но на самом деле она двольно простая. Вначале мы предполагам, что пространство слева, справа и сверху вокруг лисы пустое на расстоянии 1000 пикселов. Также полагаем, что нет пустого пространства под лисой. Вертикальную позицию лисы мы храним в свойстве pos.y.
Далее следует цикл по всем объектам типа box. Вычисляется расстояние от лисы до блока и записывается в переменные dx и dy.
Если блок занимает то же положение по вертикали, что и лиса (другими словами – если он на том же расстоянии от земли), то функция проверяет, находится ли он справа или слева. Далее проверяется, если расстояние до блока справа (слева) меньше текущего значения bounds.right (.left) , то значение bounds. right (. left) переопределяется. Аналогично проверяются вертикальные границы.
После того как все блоки были проверены, объект bounds содержит горизонтальные и вертикальные границы для лисы в текущем положении. Например, если bounds.left равно 20, то ближайший к лисе блок справа находится на расстоянии 20 пикселов.
Функция determineBounds написана в достаточно общем виде, чтобы ее можно было использовать как для лисы, так и для кроликов. В качестве аргумента pos функции можно передать как объект foxPos, так и элемент массива objects, например кролика.function determineBounds(pos) {
// Определяем границы перемещения.
var bounds = {left:1000,right:1000,top:1000,bottom:pos.y};
// Цикл по всем объектам.
for(var i=0;i<objects.length;i++) {
// Рассматриваем только блоки.
if (objects[i].type == "box") {
var dx = objects[i].x – pos.x;
var dy = objects[i].y – pos.y;
// Если блок в той же вертикальной позиции.
if ((dy >= 0) and (dy <= 50)) {
// Определяем, является ли ближайшим левый блок.
if ((dx+50 <= 0) and (Math.abs(dx+50) < bounds.left)) {
bounds.left = Math.abs(dx+50);
// Определяем, является ли ближайшим правый блок.
} else if ((dx >= 0) and (dx < bounds.right)) {
bounds.right = dx-50;
}
}
// Блок в той же горизонтальной позиции.
if ((dx >= -50) and (dx <= 50)) {
// Определяем, является ли ближайшим нижний блок.
if ((dy+50 <= 0) and (Math.abs(dy+50) <=
bounds.bottom)) {
bounds.bottom = Math.abs(dy+50);
// Определяем, является ли ближайшим верхний блок.
} else if ((dy-50 >= 0) and (dy-50 < bounds.top)) {
bounds.top = dy-50;
}
}
}
}
return(bounds);
}Если лиса находится в воздухе, то независимо от того, прыгает ли она вверх или падает вниз, это состояние рассматривается как падение. Функция CheckFall следит за вертикальным перемещением лисы. Когда игрок прыгает, переменная fallSpeed принимает значение jumpPower, которое равно 60. Таким образом, лиса пытается переместиться на 60 пикселов по вертикали. В каждом кадре, в котором происходит процесс «прыжок/падение», переменная fallSpeed уменьшается на 10, что создает эффект силы тяжести. В конечном счете значение fallSpeed обнулится в верхней точке прыжка и начнет уменьшаться, а лиса устремится вниз.
Если значения скорости падения еще недостаточно, чтобы лиса достигла земли, то падение продолжается. Но как только уровень земли достигнут или пройден, падение прекращается, и вертикальная позиция лисы устанавливается равной положению земли.
Функция checkFall также обращается к свойству foxBound.top, чтобы проверить, нет ли блока над лисой. Если лиса упирается в верхнюю границу возможного движения, то импульс, направленный вверх, пропадает, переменная fallSpeed обнуляется. Процесс «прыжок/падение» продолжается, но является теперь только падением.function checkFall() {
// Учитываем силу тяжести.
fallSpeed -= 10;
// Проверяем, есть ли место для падения.
if (fallSpeed > -foxBounds.bottom) {
foxPos.y += fallSpeed;
// Прекращаем падение и устанавливаем лису на уровень земли.
} else {
foxPos.y -= foxBounds.bottom;
fallSpeed = 0;
falling = false;
fox.gotoAndStop(1); // stand
}
// Смотрим, не упирается ли лиса в верхний блок.
if (foxPos.y > foxBounds.top) {
foxPos.y = foxBounds.top;
fallSpeed = 0;
}
}Функция drawObjects создает эффект движения лисы. Она перерисовывает все объекты в соответствии с положением лисы.
function drawObjects() {
// Цикл по всем объектам.
for(var i=0;i<objects.length;i++) {
// Устанавливаем горизонтальную позицию в соответствие с положением лисы.
_root["object "+i]._x = x = 275 + objects[i].x – foxPos.x;
// Устанавливаем горизонтальную позицию в соответствие со значением floor.
_root["object "+i]._y = floor – objects[i].y;
}
}Функция getAcorns просматривает объекты в поисках орехов. Каждый орех проверяется, достаточно ли близко он находится к лисе, чтобы она могла его взять. Если орех съеден, его свойство type устанавливается в значении used. Этот орех теперь игнорируется всеми функциями, так как они не проверяют объекты типа used.
function getAcorns() {
// Просматриваем все объекты.
for(var i=objects.length-1;i>=0;i—) {
if (objects[i].type == "acorn") {
// Если ближе 30 пикселов – хватаем орех.
if (distance(_root["object "+i],fox) < 30) {
_root["object "+i].play();
objects[i].type = "used";
score += 100;
}
}
}
}Функция getAcorns вызывает функцию distanse для определения расстояния между лисой и орехом. Эта же функция будет в дальнейшем использоваться функцией moveBunnies.
// Функция для определения расстояния между клипами.
function distance(mc1,mc2) {
d = Math.sqrt(Math.pow(mc1._x-mc2._x,2)+Math.pow(mc1._y-mc2._y,2));
return d;
}Все кролики контролируются функцией moveBunnies. Нет смысла следить за кроликами вне экрана, поэтому перемещаются только кролики, находящиеся не далее чем 275 пикселов от лисы. Перед перемещением кролика вызывается функция determineBounds для определения границ его возможного перемещения. Если границы позволяют, кролик начинает передвигаться в сторону позиции игрока. Если лиса оказывается достаточно бестолковой, чтобы подобраться близко к кролику, игра заканчивается.
function moveBunnies() {
// Просматриваем все объекты в поисках кроликов.
for(var i=objects.length-1;i>=0;i—) {
if (objects[i].type == "bunny") {
// Перемещаем только видимых кроликов.
if (Math.abs(objects[i].x-foxPos.x) < 275) {
// Движемся в сторону лисы.
if (foxPos.x < objects[i].x) {
var dx = -bunnySpeed;
} else if (foxPos.x > objects[i].x) {
var dx = bunnySpeed;
}
// Определяем границы.
bunnyBounds = determineBounds(objects[i]);
// Движемся только в пределах этих границ.
if ((dx < 0) and (bunnyBounds.left > Math.abs(dx))) {
objects[i].x += dx;
} else if ((dx > 0) and (bunnyBounds.right > Math.abs(dx))) {
objects[i].x += dx;
}
// Не подобрался ли кролик достаточно близко к лисе.
if (distance(_root["object "+i],fox) < 30) {
_root.onEnterFrame = undefined;
trace("got ya");
}
}
}
}
}
К сведению
Клип с лисой содержит три части: «stand», «run» и «jump». В первом кадре содержится команда stop(). В последнем кадре анимации «run» содержится команда gotoAndPlay(«run»). Благодаря этому движение зацикливается.
Клип "acorn" также содержит команду stop() в первом кадре.
Еще один важный момент – это установка центра координат клипов. Он расположен внизу и отцентрован по горизонтали. На рис 16.9 изображен клип "box" и его центр.
Рисунок 16.9. Во всех клипах центр находится внизу точно посерединеДругие возможности
Эта игра демонстрирует лишь простейшие возможности платформенного скроллера. Она настолько проста, что даже не имеет завершения. Существует несколько возможностей оформить конец игры.
Во первых, вы можете достигать крайней правой точки для окончания игры или уровня. Пространство этой игры относительно невелико, но если сделать его в несколько раз больше, то прохождение до границы уже будет некоторым достижением.
В другом варианте игра оканчивается, когда игрок собрал все орехи. Опять же вы можете сделать пространство игры больше.
Большинство платформенных скроллеров предлагают также избавляться от разных отрицательных героев. Обычно для этого достаточно прыгнуть сверху на такого плохого парня. В существующем варианте игры, если вы запрыгнете на кролика, игра окончится точно так же, как если бы вы пересеклись с ним по горизонтали. Но если вы сможете определить, что лиса падает сверху в момент столкновения с кроликом, то получите сражающуюся лису, которая будет получать дополнительные очки за побежденных кроликов.

