91824841

Уменьшаем расстояние до корабля на


function moveRocks() {

// Перемещаем все астероиды,

for(i=rocks.length-1;i>=0;i-) {

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

rocks[i].dist *= 1.1;

// Проверяем, может ли астероид задеть корабль.
if (rocks[i].dist > 1.0) {

// Проверяем, ударил ли астероид корабль,

if (rocks[i].destx > 0 and rocks[i].destx < 550 and rocks[i].desty > 0 and rocks[i].desty < 400) {

// Взрываем астероид и увеличиваем количество

// повреждений.

_root[rocks[i].clip].gotoAndPlayf"explode blue");

damage++;

foreground.displayDamage = damage;

// Смотрим, превысило ли количество повреждений

// допустимый уровень.

if (damage >= 20) {

removeAllRocks();

Mouse.show();



gotoAndStop("game over");}

// Если астероид не попал по кораблю, то убираем его.

} else {

_root[rocks[i].clip].removeMovieClip();

}

// Убираем элемент из массива,

rocks.splice(i,1);

// Перемещаем астероид.

} else {

rocks[i].x = (1.0-rocks[i].dist)*rocks[i].startx + rocks [i].dist*rocks[i].destx;

rocks[i].y = (1.0-rocks[i].dist)*rocks[i].starty + rocks[i].dist*rocks[i].desty;

_root[rocks[i].clip]._x = rocks[i].x; _root[rocks[i].clip]._y = rocks[i].y;

// Увеличиваем астероид.

_root[rocks[i].clip]._xscale = 100*rocks[i].dist;

_root[rocks[i].clip]._yscale = 100*rocks[i].dist;

}}}

Когда пуля достигает своей цели, вызывается функция checkForHit. Она проверяет все астероиды: находится ли один из них там же, где и пуля. Если да, астероид взрывается и удаляется из массива, увеличивается значение переменной hits.

function checkForHit(x,у) {

// Просматриваем все объекты-астероиды

//на предмет попадания по ним.

for(j=rocks.length-1; j>=0; j--) {

// Выясняем, попадет ли пуля в этот астероид,

if (_root[rocks[j].clip].hitTest(x,y)) {

// Если да, взрываем астероид

//и удаляем из массива.

hits++;

foreground.displayHits = hits;

_root[rockfj].clip].gotoAndPlay("explode red");

rocks.splice(j,1);

}}}

В конце каждой анимации взрыва (16.2) небольшой сценарий вызывает функцию killRock, которая удаляет любой вызывающий ее клип. Таким образом, можно удалить астероид сразу же, как только он взорвался.

function killRock(clip) {

вызываем эту функцию,

// Когда астероид взорвался,
// чтобы удалить его.

clip.removeMovieClip();
}

Когда игра заканчивается, вызывается функция removeAllRocks, чтобы в кадре "game over" не отображались оставшиеся пули и астероиды.

function removeAllRocks() {

// Удаляем все астероиды.

for (i=rocks.length-1; i>=0; i--) {

_root[rocks[i].clip.removeMovieClip();

}}



// Удаляем клип и элемент массива,

bullets[i].removeMovieClip();

bullets.splice(i,1);
}}}

Астероиды создаются с помощью функции newRock, которая, как и функция fire, добавляет новый клип. Однако здесь функция выбирает один из трех эталонов: "rock1", "rock2" и "госк3".
Параметры, передаваемые функции, определяют положение и размер астероида. Направление движения указывается случайным образом, при переходе на следующий уровень скорость астероидов увеличивается.
Астероиды вращаются либо по часовой стрелке, либо против со скоростью, значение которой определяется произвольно.
Для всех астероидов добавляются указатели в массив rocks, чтобы потом можно было к ним обратиться.

function newRock(size,x,у) {

// Создаем клип астероида.

level++;

rockNum = int(Math.random()*3+1);

attachMovie("rock"+rockNum,"rock"+level,level);

// Указываем положение и размер астероида.

clip = _root["rock"+level];

clip._x = x;

clip._y = y;

clip._xscale = size;

clip._yscale = size;

// Определяем скорость и направление движения астероида.

speed = gameLevel*2;

clip.dx = Math.random()*speed+2;

if (math.random() < .5) clip.dx *= -1;

clip.dy = Math.random()*speed+2;

if (math.random() < .5) clip.dy *= -1;

// Устанавливаем направление и скорость вращения,

clip.spin = Math.random()*б-3;

// Добавляем астероид в массив rocks,

rocks.push(clip); }

Для движения астероида используется такой же код, что и для движения корабля. Астероиды, как и корабль, возвращаются на рабочее поле с противоположной стороны, если достигают его границы. Не забывайте поворачивать астероид в соответствии с созданным вами свойством spin.

function rocksMove() {

// Просматриваем все астероиды,

for(i=rocks.length-1; i>=0; i-) {

clip rocks[i].clip;

// Перемещаем астероид по горизонтали и, если нужно,

//на противоположную сторону экрана.

rocks[i]._x += rocks[i].dx;

if (rocks[i]._x > 550) rocks[i]._x -= 550;

if (rocks[i]._x < 0) rocks[i]._x += 550;



function nextMove () {
// Предположим, что лиса двигаться не будет.
fox.move.х =0;

fox. move, у =0;
// Проверяем клавиши со стрелками.
// Определяем потенциальное направление движения.

// Если нужно, поворачиваем лису влево или вправо.
if (Key.isDownfKey.LEFT)) {
fox.move.x = -1;

fox._xscale = Math.abs(fox._xscale);

} else if (Key.isDown(Key.RIGHT)) {

fox.move.x = 1;

fox._xscale = -Math.abs(fox._xscale);

} else if (Key.isDown(Key.UP)) {

fox.move.у = -1;

} else if (Key.isDownfKey.DOWN)) {

fox.move.у = 1;

}

// Определяем потенциальное положение цели.

newx = fox._x + fox.move.x*25;

new = fox._y + fox.move.y*25;

okToMove = false;

// Просматриваем массив berries: совпадают ли координаты

// потенциального положения цели с координатами какой-либо

// ягоды,

for(i=0;i< berries.length;i++) {

// Совпадение найдено, указываем новое положение цели,

if ((berries[i]._x == newx) and (berries[i]._y == newy)) {

fox.dest.x = newx;

fox.dest.y = newy;

okToMove = true;

}}

// Указываем специальные установки для прохода сквозь тоннель,

if (newx == 550) {

okToMove = true;

fox.dest.x = 25;

} if (newx == 0) {

okToMove = true;

fox.dest.x = 525;}

// Если совпадение не найдено, не перемещаем лису.

if (!okToMove) {

fox.move.x = 0;

fox.move.у = 0;
}}

Кролик двигается непредсказуемо. Когда он доходит до ягоды, следующий фрагмент кода просматривает массив berries и определяет, какие клипы ягод находятся рядом с текущим положением кролика. Затем случайным образом выбирается один из этих клипов, координаты которого и будут положением цели кролика. Не может быть выбрано только то направление, откуда пришел кролик. Другими словами, кролик не может вдруг повернуть назад. Таким образом, кролик идет по длинным коридорам, не останавливаясь и не шарахаясь из стороны в сторону. Однако если кролик заходит в тупик, он может идти в обратном направлении, так как это единственно возможный путь.
И последнее, что делает функция move Bunny, - это проверяет, не находится ли кролик вблизи от лисы. Если да, то кролик ловит лису, и она теряет одну жизнь.



// Луны в этой точке.

if (activeground.hitTest(ship._x+hitPoints[i].x, ship._y+hitPoints[i].y, true)) {

ship.gotoAndPlay("explode");

// Уменьшаем количество жизней

// или завершаем игру.

gotoAndPlay("lost ship");
break;
}}}}

Еще одна полезная функция в этом ролике - showFuel. Она берет клип "meter" и присваивает его свойству _xscale величину fuel. Так как сначала значение переменной fuel (запас горючего) равно 100, а затем уменьшается до 0, его легко использовать для свойства _xscale. Если бы диапазон значений fuel был другим, вам бы пришлось сначала преобразовать их так, чтобы они находились в диапазоне от 0 до 100, а лишь затем присваивать их свойству _xscale.

function showFuel() {

gauge.meter._xscale = fuel;

}

Обратите внимание: для того чтобы размеры клипа "meter" уменьшались справа налево, необходимо поместить центр клипа так, чтобы центр прямоугольника располагался справа от него. Если центр клипа окажется слева, то изменение величины _xscale приведет к тому, что объект будет сокращаться к центру, а не справа налево.



function determineBounds(pos) {

// Определяем границы перемещения.

var bounds = {left: 1000 , right: 1000, top: 1000 ,bottom:pos.у};

// Цикл по всем объектам.

for(var i=0;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

// Определяем, является ли ближайшим левый блок,

if ((dx+50

bounds.left = Math.abs(dx+50);

// Определяем, является ли ближайшим правый блок.

} else if ((dx >= 0) and (dx < bounds.right)) {

bounds. right = dx-50;

}} // Блок в той же горизонтальной позиции,

if ((dx >= -50) and (dx

// Определяем, является ли ближайшим нижний блок.

if ((dy+50

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, чтобы проверить, нет ли блока над лисой. Если лиса упирается в верхнюю границу возможного движения, то импульс, направленный вверх, пропадает, переменная falispeed обнуляется. Процесс "прыжок/падение" продолжается, но является теперь только падением.


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