Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Шрифт:
onClipEvent(load) {
_root.initGame;
}
onClipEvent(enterFrame) {
_root.newBalloon ;
_root.moveBalloons ;
_root.moveFox;
_root.moveBullets;
}Функция initGame задает все основные переменные, используемые в игре.
function initGame {
// Инициализируем переменные, связанные с объектами-шарами.
nextBalloonTime = 0;
nextBalloon = 0;
balloons = [];
numBalloons = 10;
// Инициализируем переменные, связанные с объектом-пулей.
nextBulletTime = 0;
nextBullet = 0;
bullets = [];
// Количество очков равно 0.
score = 0;
}Перед созданием нового шара необходимо провести три проверки. Первая определяет, остались ли в игре шары, вторая – прошло ли достаточно времени после создания предыдущего
После завершения проверок функция newBalloon создает новый шар с 50-процентной возможностью появления шара с левой или правой стороны. Скорость шара принимает произвольное значение от 3 до 5. Число является положительным, если шар будет пролетать слева направо и отрицательным в противном случае.
Цвет нового шара выбирается из пяти возможных оттенков. Для задания цвета используется функция setTransform.
Клипы шаров можно упорядочить, поместив их имена и значения скоростей в массив balloons.
Затем задаются переменные nextBallon и nextBalloonTime, при помощи которых осуществляется обращение к переменной newBalloon.function newBalloon {
// Определяем, могут ли появиться новые шары.
if (nextBalloon < numBalloons) {
// Проверяем, пришло ли достаточно времени
// после появления последнего шара.
if (getTimer > nextBalloonTime) {
// "Бросаем монетку".
if (Math.Random<.5) {
// Создаем новый шар.
attachMovie("balloon", "balloon"+nextBalloon,
nextBalloon);
// Выбираем, с какой стороны
// и с какой скоростью полетит шар.
if (Math.Random<.5) {
_root["balloon"+nextBalloon]._x = -30;
dx = int(Math.Random*3)+3;
} else {
_root["balloon"+nextBalloon]._x = 580;
dx = -int(Math.Random*3)-3;
}
// Выбираем высоту.
_root["balloon"+nextBalloon]._y =
int(Math.Random*100)+20;
// Выбираем цвет.
balloonColor = new Color("balloon"+nextBalloon);
r = int(Math.Random*5)+1;
if (r == 1) {
balloonColor.setTransform({rb:255}) ;
} else if (r == 2) {
balloonColor.setTransform({gb:255}) ;
} else if (r == 3) {
balloonColor.setTransform({bb:255}) ;
} else if (r == 4) {
balloonColor.setTransform({rb:255,gb:255});
} else if (r == 5) {
balloonColor.setTransform({rb:255,bb:255});
}
// Добавляем новый шар.
balloons.push({clip:"balloon"+nextBalloon,d:dx});
// Изменяем значение переменных. nextBalloon++;
nextBalloon++;
nextBalloonTime = getTimer + 2000;
}
}
}
}Созданные шары перемещаются на определенное расстояние с помощью функции moveBalloons. Если шар достиг противоположной границы рабочего поля, его клип удаляется. Соответствующий элемент также удаляется из массива balloons.
Примечание
Чтобы быстро задать 50-процентную вероятность, лучше использовать фрагмент кода (Math.Random <.5). Функция Math.Random всегда принимает значение от 0 до 1,0 и никогда не бывает равна 1,0, поэтому условие <.5 дает 50-процентную вероятность возникновения некоторого события.
Совет
Имейте в виду, что в цикле for функции moveBalloons перечисление осуществляется в обратном порядке: начинается с последнего элемента в массиве balloons и заканчивается 0. Благодаря этому удаление элемента не влияет на остальную часть массива. Предположим, из массива, состоящего из пяти элементов, был удален третий элемент. Тогда четвертый элемент становится третьим, а пятый – четвертым. Если бы вы считали в прямом направлении, вы бы пропустили третий элемент и сразу перешли к четвертому. При счете в обратном порядке такой проблемы не возникает.
Функция moveBalloons проверяет, все ли шары созданы и все ли шары исчезли, что говорит об окончании игры.
function moveBalloons {
// Перемещаем все шары.
for(i=balloons.length-1;i>=0;i–) {
// Определяем скорость шара
// и получаем ссылку на клип.
dx = balloons[i].d;
balloon = _root[balloons[i].clip];
// Перемещаем шар.
balloon._x += dx;
// При вылете за экран шар удаляется.
if ((dx < 0) and (balloon._x < -20)) {
balloon.removeMovieClip ;
balloons. splice (i,1);
} else if ((dx > 0) and (balloon._x > 570)) {
balloon.removeMovieClip;
balloons.splice(i,1);
}
}
// Если шары закончились, игра завершается.
if ((nextBalloon >= numBalloons) and (balloons.length < 1)){
gotoAndStop("game over");
}
}Функция moveFox определяет, нажаты ли клавиши со стрелками «влево» или «вправо», и перемещает лису на 10 пикселов влево или вправо при нажатии соответствующей клавиши. Как и в предыдущих играх, параметр _xscale клипа, содержащего лису, используется для поворота лисы. Функция также задает переход клипа к анимационной последовательности (изображает идущую лису и начинается в кадре 2), а также к кадру 1 (изображает стоящую лису).
function moveFox {
// Подвинуть лису влево.
if (Key.isDown (Key.LEFT)) {
dx = -10;
fox._xscale = Math.abs(fox._xscale);
// Подвинуть лису вправо, перевернув ее клип по вертикали [12] .
} else if (Key.isDown(Key.RIGHT)) {
dx = 10;
fox._xscale = -Math.abs(fox._xscale);
// Иначе лиса не двигается.
} else {
dx = 0;
}
// Перемещаем лису.
fox._x += dx;
if ((dx == 0) and (fox._currentFrame != 1)) {
// Переходим к кадру, в котором лиса стоит.
fox.gotoAndStop(l);
} else if ((dx != 0) and (fox._currentFrame == 1)) {
// Переходим к кадру, где лиса бежит.
fox.gotoAndPlay(2);
}
}Для того чтобы выстрелить, пользователь должен нажать на клавишу пробела. На нажатие клавиши реагирует скрытая кнопка, которая вызывает функцию shootBullet. Код кнопки будет рассмотрен далее, в разделе «К сведению».
Функция shootBullet проверяет, прошло ли достаточно времени после предыдущего выстрела. Это не дает игроку возможности стрелять залпом по всем мишеням.
Подобно шарам снаряды представлены одновременно клипом и элементом массива, в данном случае массива bullets. Массив используется функцией moveBullets для осуществления выстрелов.
Обратите внимание, что движение клипа, содержащего снаряд, начинается в точке, расположенной в 2 пикселах вправо и 55 пикселах влево от центра клипа лисы. Эта точка соответствует кончику соломинки.function shootBullet {
// Проверяем, что с момента
// предыдущего выстрела прошло достаточно времени.
if (getTimer > nextBulletTime) {
// Создаем новую пулю.
attachMovie("bullet","bullet"+nextBullet,nextBullet+9999);
// Устанавливаем ее координаты.
_root["bullet"+nextBullet]._x = fox._x+2;
_root["bullet"+nextBullet]._y = fox._y-55;
// Добавляем новую пулю к массиву.
bullets.push(nextBullet) ;
// Изменяем значение переменных, отвечающих
// за появление пуль.
nextBullet++;
nextBulletTime = getTimer+1000;
}
}Функция moveBullets работает аналогично функции moveBalloons, но перемещает снаряды не вправо и влево, а вверх. Она проверяет одно из следующих условий: снаряд достиг верхнего края экрана либо попал в шар и вызвал функцию checkCollision. В обоих случаях и клип, и элемент массива удаляются.
function moveBullets {
// Проверяем, попали ли пули в шар.
for(i=bullets.length-1;i>=0;i–) {
// Выбираем элемент.
bullet = _root["bullet"+bullets[i]];
// Передвигаем пулю вверх.
bullet._y -= 10;
// Выясняем, достигла ли она конца экрана.
if (bullet._y < 0) {
bullet.removeMovieClip;
bullets.splice(i,1);
// Определяем, не попал ли игрок по шару.
} else {
if (checkCollision(bullet)) {
bullet.removeMovieClip;
bullets.splice(i,1);
}
}
}
}