Гэри Розенцвейг - Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
На экране должны быть два динамических текстовых поля: "timeDisplay" и "score". Они оба должны быть привязаны к переменным с такими же именами.
В ролике-примере я обозначил вводный кадр как кадр 1, таким образом, все действие начинается с кадра 2. Есть еще третий кадр с меткой "game over".
Создание кода
Основная часть кода – это сценарий клипа машины. Он начинается с задания переменной speed значения 0. Эта переменная должна быть на уровне _root, поскольку остальные клипы будут к ней обращаться.
onClipEvent(load) {
// Инициализируем переменную скорости.
_root.speed = 0;
}Обработчик onClipEvent(enterFrame) сначала проверяет все четыре клавиши с изображением стрелок. Левая и правая клавиши со стрелкой перемещают машину влево или вправо и также заставляют клип с машиной показывать соответствующий кадр поворота.
Клавиши со стрелками вверх и вниз изменяют скорость машины на 0,1. Постоянно осуществляется проверка, не упала ли скорость ниже 0.
Если ни одна из клавиш со стрелками не нажата, клип с машиной возвращается к первому кадру. Обработчик осуществляет еще две проверки. Первая нужна, чтобы узнать, не находится ли под машиной клип "bonus". Если да, игрок получает очки, и бонус очень быстро проезжает далее, чтобы игрок не получил за него очки еще раз.
Вторая проверка выясняет, не коснулась ли машина обочины. Если да, движение машины в сторону ограничивается и замедляется.onClipEvent(enterFrame) {
if (Key.isDown(Key.LEFT)) {
// Поворачиваем влево.
this._x -= 10;
this.gotoAndStop(“left”);
} else if (Key.isDown(Key.RIGHT)) {
// Поворачиваем вправо.
this._x += 15;
this.gotoAndStop(“right”);
} else if (Key.isDown(Key.UP)) {
// Увеличиваем скорость.
_root.speed += .1;
} else if (Key.isDown(Key.DOWN)) {
// Тормозим.
_root.speed -= .1;
// Проверяем, что скорость не меньше 0.
if (_root.speed < 0) _root.speed = 0;
} else {
_root.car.gotoAndStop(“straight”);
}
// Проверяем бонус.
if (this.hitTest(_root.bonus._x,_root.bonus._y)) {
_root.score++;
_root.bonus._y += 100;
}
// Замедляем движение, если коснулись обочины.
if (this._x < 80) {
this._x = 80;
_root.speed /= 2;
} else if (this._x > 470) {
this._x = 470;
_root.speed /= 2;
}
}Клип «sideObject» содержит сценарий, двигающий объект вниз и в сторону от центра. Для каждого следующего кадра значение _y увеличивается, а _x – изменяется. Оба параметра используют переменную speed для характеристики этого изменения, но _х использует коэффициент dx, который может быть равен 1 или -1. Объект перемещается соответственно вправо или влево.
Когда объект достигает значения 600 по вертикали, что на 200 пикселов ниже границы экрана, он возвращается назад к значению 200, то есть вновь появляется на горизонте. С вероятностью 50/50 он помещается слева или справа от дороги. Именно в этот момент определяется значение переменной dx.
И наконец, масштаб объекта определяется в соответствии со значением _y. Это означает, что объект становится больше по мере приближения.onClipEvent(enterFrame) {
// Движемся вниз.
this._y += _root.speed;
// Движемся в стороны.
this._x += dx*_root.speed;
// Возвращаем объект на исходную озицию, если он проехал за
// нижнюю границу экрана.
if (this._y > 600) {
this._y = 200;
if (Math.random() < .5) {
// Объект слева.
this._x = Math.random()*170;
dx = -1;
} else {
// Объект справа.
this._x = 550-Math.random()*170;
dx = 1;
}
}
// Задаем масштаб в соответствие со значением _y.
this._xscale = this._y/4;
this._yscale = this._y/4;
}Обратите внимание, что клип «sideObject» не взаимодействует с машиной. Это делает только клип «bonus». Но объекты по сторонам дороги направляют взгляд игрока так, что создается ощущение глубины. Центральная линия движется, как и камни, но, поскольку она находится в центре экрана, она не передвигается ни вправо, ни влево. Она просто движется вниз и изменяет масштаб.
onClipEvent(enterFrame) {
// Движемся вниз.
this._y += _root.speed;
// Возвращаемся к горизонту.
if (this._y > 400) {
this._y = 200;
}
// Устанавливаем масштаб.
this._xscale = this._y/4;
this._yscale = this._y/4;
}Бонусные звезды ведут себя более похоже на объекты по сторонам. Однако они не появляются где попало. Они появляются с равной вероятностью в одном из двух мест на дороге. Таким образом, двигаясь вниз по экрану, бонусная звезда движется в сторону со скоростью вполовину меньшей, чем вниз. Это позволяет создавать более точную перспективу, поскольку звезды находятся ближе к центру дороги.
onClipEvent(enterFrame) {
// Движемся вниз.
this._y += _root.speed;
this._x += dx*_root.speed;
// Возвращаемся к горизонту.
if (this._y > 600) {
this._y = 200;
if (Math.random() < .5) {
// Переходим на левую сторону дороги.
this._x = 250;
dx = -.5;
} else {
// Переходим на правую сторону дороги.
this._x = 300;
dx = .5;
}
}
// Устанавливаем масштаб в соответствии с вертикальным
// положением.
this._xscale = this._y/4;
this._yscale = this._y/4;
}Клип «actions» расположен вне экрана и содержит игровые часы. Он замечает время начала и производит обратный счет до 0. В клипе-примере игра очень короткая, всего 15 секунд. Вы можете увеличить ее до минуты или двух. Когда обратный отсчет доходит до 0, главная временная шкала отправляется к кадру "game over". Параметр speed становится равным 0, и машина замирает на месте.
onClipEvent(load) {
// Рассчитываем время окончания игры.
endTime = getTimer()+15000;
}
onClipEvent(enterFrame) {
// Подсчитываем, сколько времени прошло.
timeLeft = (endTime – getTimer())/1000;
// Конец игры.
if (timeLeft <= 0) {
_root.speed = 0;
_root.timeDisplay = "0";
_root.gotoAndStop("game over");
} else {
// Отображаем оставшееся время.
_root.timeDisplay = timeLeft;
}
}Кроме команды stop() в первом кадре, есть еще только один сценарий временной шкалы – в главном кадре игры. Он перемещает машину на передний план (уровень) экрана, так что центральная линия и бонусные звезды оказываются под ней. Кроме того, короткий цикл дублирует клип «sideObject» 5 раз. Каждой копии придано разное значение _у, поэтому камни не появляются все одновременно.
// Помещаем машину на передний план.
car.swapDepths(999);
// Создаем пять камней.
for(i=0;i<5;i++) {
mc = sideobject.duplicateMovieClip("side object"+i,i);
mc._y = 400+Math.random()*200;
}
К сведению
Ролик-пример содержит вводный кадр и в нем кнопку начала игры. Третий кадр содержит сообщение «Game over» и не включает в себя клип с бонусом, который содержится только во втором кадре. Это предотвращает получение игроком очков после окончания игры. Я также добавил в ролик-пример фоновый пейзаж.
Другие возможности
Игра уже достаточно сложна для примера в книге. Однако существует много мелких деталей, которые вы можете добавить, чтобы она стала еще более увлекательной. Например, вы можете изменить холмы фона в клипе и заставить их увеличиваться по мере приближения машины. Это создаст иллюзию, что машина подъезжает к холмам.
Вы можете добавить разные типы бонусов, стоящие разное количество очков. Вы также можете ограничить скорость машины, но ввести бонусы, позволяющие эту скорость увеличить.Глава 10 Игры типа "Прицелься и выстрели"
• Стрельба по воздушным шарам
• Стрельба с прицелом
• Шарики-захватчики
Игры типа «Прицелься и выстрели» похожи на игры вида «Поймай или пропусти» тем, что и главное действующее лицо, и другие объекты игры перемещаются. Однако в играх, которые рассматриваются в этой главе, есть и новый элемент – стрельба. Главный герой и объекты никогда не соприкасаются. Вместо этого герой стреляет по объектам. Первая игра, которую мы создадим в данной главе, дает игроку возможность перемещать действующее лицо вдоль нижней части экрана и стрелять по объектам строго вверх. Во второй игре действующее лицо неподвижно, но может целиться и стрелять по объектам по диагонали. В третьей игре объекты перемещаются строем, как в старых аркадных играх.
Стрельба по воздушным шарам
Исходный файл: Balloonshoot.fla
Первая игра состоит из трех основных элементов: лисы, воздушных шаров и снарядов. В нашем примере лиса стреляет всего лишь горошинами из соломинки (рис. 10.1). Поэтому игра подойдет для любой аудитории.
Рисунок 10.1. Лиса стреляет по пролетающим воздушным шарам из соломинки
Задача проекта
Задача этого проекта – создать игру, в которой лиса перемещается влево и вправо и стреляет вверх по воздушным шарам. Шары появляются слева и справа, на разной высоте и летят с разной скоростью. После того как пролетит определенное количество шаров, игра заканчивается. Счет определяется количеством лопнувших шаров. Готовую игру можно просмотреть на Web-сайте (ролик Balloonshoot.fla).
Подход
Лиса перемещается так же, как и во всех играх предыдущей главы. Перемещение лисы будет анимированным, направление движения задается горизонтальным поворотом.
Воздушные шары будут созданы как копии одного клипа, представляющего собой светло-серый воздушный шар. Подобно высоте, скорости и направлению, цвет будет произвольным.
Снаряды, которыми стреляет лиса, создаются из другого клипа. Выстрел будет производиться при нажатии на клавишу пробела. На кончике соломинки создается новый клип, перемещающийся вверх. Также будет создан таймер, дающий игроку возможность делать только один выстрел в секунду.