} 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
// Устанавливаем горизонтальную позицию в соответствие с положением лисы.
_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" и его центр.
Читать дальше
Конец ознакомительного отрывка
Купить книгу