Чтение онлайн

на главную - закладки

Жанры

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;

}

Перед созданием нового шара необходимо провести три проверки. Первая определяет, остались ли в игре шары, вторая – прошло ли достаточно времени после создания предыдущего

шара. Последняя проверка представляет собой своего рода игру орел и решка: новый шар создается с вероятностью 50 %.

После завершения проверок функция 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);

}

}

}

}

Поделиться:
Популярные книги

Рядовой. Назад в СССР. Книга 1

Гаусс Максим
1. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Рядовой. Назад в СССР. Книга 1

Смерть может танцевать 4

Вальтер Макс
4. Безликий
Фантастика:
боевая фантастика
5.85
рейтинг книги
Смерть может танцевать 4

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Энфис 3

Кронос Александр
3. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 3

Восход. Солнцев. Книга V

Скабер Артемий
5. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга V

Старатель

Лей Влад
1. Старатели
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Старатель

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Холодный ветер перемен

Иванов Дмитрий
7. Девяностые
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Холодный ветер перемен

Безымянный раб [Другая редакция]

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
боевая фантастика
9.41
рейтинг книги
Безымянный раб [Другая редакция]

Брак по-драконьи

Ардова Алиса
Фантастика:
фэнтези
8.60
рейтинг книги
Брак по-драконьи

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Серые сутки

Сай Ярослав
4. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Серые сутки