91824841

Бросаем яблоко, если прошло достаточно


function dropNewApple() {

// Бросаем яблоко, если прошло достаточно времени,

if (timeSinceLastApple > 20) {

// Бросаем, если не превышено

// предельное количество яблок, которые можно бросить
. if (lastApple < totalApples) {

// Устанавливаем вероятность падения яблока в 10%.

if (Math.random!) < .1) {

// Создаем объект-яблоко.

lastApple++;

attachMovief"apple", "apple"+lastApple, lastApple);

_root["apple"+lastApple]._x = Math.random!)*490+30;

_root["apple"+lastApple]._y = 0;

// Сбрасываем счетчик времени ожидания.

timeSinceLastApple = 0;

// Увеличиваем скорость падения яблока

if (appleSpeed < 10) appleSpeed += .5;

}

}



}

// ЕСЛИ не бросили яблоко, сокращаем время ожидания.

timeSinceLastApple++;

}

Функция, выполняющая перемещение яблок, должна не только изменять их вертикальное положение, но и проверять, упало ли яблоко на землю или в корзину.
Чтобы определить, упало ли яблоко на землю, функция должна проверить, находится ли яблоко ниже нижней границы экрана. Определить попадание в корзину немного сложнее: необходимо установить, соответствует ли расстояние между яблоком и лисой заданному диапазону. Если яблоко находится от лисы на расстоянии в 10 пикселов по вертикали и 25 пикселов по горизонтали, считается, что оно попало в корзину. Имейте в виду, что центр клипа с лисой находится в центре изображения корзины, поэтому положение корзины фактически определяется положением всего клипа с лисой. На 9.3 показан прямоугольник, который представляет область попадания.



Рисунок 9.3 Если центр яблока попадает в прямоугольную область размером 50x20 пикселов, расположенную вокруг центра корзины, оно считается пойманным

функция Math. abs () (модуль числа) используется, чтобы определить, столкнулись ли объекты. Если из координат одного объекта вычесть координаты другого, получается положительное или отрицательное значение. Например, если первый объект находится на расстоянии 7 пикселов вправо от второго, вы получаете значение 7, если слева -значение -7. Функция Math. abs () убирает знак, благодаря чему в обоих случаях вы получаете значение 7. Аналогичным образом вы можете проверить, находится ли объект на определенном расстоянии слева или справа от другого.





Рисунок 9. 8 Область возможного столкновения показана прямоугольником. Поскольку контроль пересечения с камнем ведется по центру клипа "rocks", то реальная область столкновения выглядит несколько меньше

Количество столкновений сохраняется в переменной spills. После шести столкновений игра переходит к кадру с меткой "lose", и игра считается завершенной. При этом происходит вызов функции removeAll, которая будет рассмотрена далее.

function moveRocks() {

// Проверяем все камни.

for (i=firstRock;i

// Определяем координаты камня.

x = _root["rock"+i]._x; y = _root["rock"+i]._y - riverSpeed;

// Выясняем, вышел ли камень из поля зрения.

if (y < -50) {

removeRock(i);

// Проверяем, что с камнем не было столкновений.

} else if ((_root["rock"+i].hit == false) and (Math.abs(y-fox._y) < 60) and (Math.abs(x-fox._x) < 25)) {

spills += 1;

// Столкновение.

_root["rock"+i].hit = true;

// Переворачиваем байдарку.

fox.gotoAndPlay("spill");

// Останавливаем байдарку.

riverSpeed = 0;

// Игра закончена?

if (spills > 5) {

removeAll();

gotoAndPlay("lose");

}

}

// Продолжаем перемещать камень.

_root["rock"+i]._y = y;

}

}

Как и функция removeApple, функция removeRock предназначена для проверки того, является ли данный камень последним. В этом случае игра переходит к кадру с меткой "win".

function removeRock(n) {

// Убираем со сцены клип камня.

_root["rock"+n].removeMovieClip();

// Увеличиваем счетчик для первого камня.
firstRock = n+1;

// Проверяем, был ли этот камень последним,

if (n == totalRocks) {

removeAll();

gotoAndPlay("win");

}

}

В предыдущем фрагменте кода указаны два случая завершения игры. В обоих случаях вызывается функция removeAll, которая убирает с экрана все оставшиеся скалы и клип лисы. Иначе эти элементы останутся на экране даже после завершения игры.

function removeAll() {

// Убираем со сцены все объекты

for (i=firstRock;i

_root["rock"+i].removeMovieClip();

}

fox.removeMovieClip();

}



onClipEvent(load) {

// Рассчитываем время окончания игры.

endTime = getTimer()+15000;

onClipEvent(enterFrame) {

// Подсчитываем, сколько времени прошло.

timeLeft = (endTime - getTimer())/1000;

// Конец игры.

if (timeLeft

_root.speed = 0;

_root.timeDisplay = "0";

_root.gotoAndStop("game over");

} else {

// Отображаем оставшееся время.

_root.timeDisplay = timeLeft;

}}

Кроме команды stop () в первом кадре, есть еще только один сценарий временной шкалы - в главном кадре игры. Он перемешает машину на передний план (уровень) экрана, так что центральная линия и бонусные звезды оказываются под ней. Кроме того, короткий цикл дублирует клип "sideObject" 5 раз. Каждой копии придано разное значение _у, поэтому камни не появляются все одновременно.

// Помещаем машину на передний план,

car.swapDepths(999);

// Создаем пять камней.

for(i=0;i

mc = sideobject.duplicateMovieClip("side object"+i,i);

mc._у = 400+Math.random()*200;

}


Содержание раздела