Иллюстрированный самоучитель по Flash-games

       

Создание кода


При загрузке клипа в нем создается массив found. Следующий код заполняет массив значениями false:

onClipEvent (load) {

// Создаем массив, в который записываем, какие лисы

// найдены.

found = [];

for (i=0; i<7; i++) {

found[i] = false;
}
}

При нажатии кнопки мыши положение курсора сохраняется в переменных х и у. Затем при помощи функции hitTest эти значения соотносятся с координатами клипов лис. Когда совпадение найдено, соответствующее изображение становится красным. Этого достаточно, чтобы изображение спрятанной лисы выделилось из фона. Каждый щелчок мышью запускает проверку массива found на наличие значения false. Это означает, что, по крайней мере, одна лиса еще не найдена. Когда все лисы найдены, клип переходит к следующему кадру:

onClipEvent (mouseDown) {
// Определяем, в каком месте пользователь щелкнул мышью.
х = _root._xmouse;
у = _root._ymouse;
// Проверяем, какое изображение лисы найдено,
for (i=0; i if (_roott"fox"+i],hitTest(x, y, false)) {
// Изменяем цвет лисы.
myColor = new Color(_root["fox"+i]);
myColor.setTransform({rb:128,bb:0,gb:0});
// Запоминаем, что лиса найдена.
found[i] = true;
break;
// Проверяем, все ли лисы найдены.
gameover = true;
for (i=0; i if (found[i] == false) {
// Если хотя бы одна еще не найдена,
// игра не закончена.
gameover = false;
//если пользователь выиграл.
// Заканчиваем игру,
if (gameover) {
_root.gotoAndPlay ("Game Over");
}
}

Команда break используется в цикле for и других для его немедленной остановки. Это удобно, когда по той или иной причине необходимо остановить цикл. В вышеприведенном коде цикл проходит значения от 0 до 6, но может завершиться в случае, если функция hitTest примет значение true.


Весь код данной игры назначен клипу "actions", расположенному за пределами рабочего поля. Он начинается с инициализации всех глобальных переменных. В начале ролика интервал появления лис равен 2 секундам (2000 миллисекундам).

onClipEvent (load) {

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

timeBetweenFoxes = 2000;

// Определяем время до появления следующей лисы.

nextFox = getTimer() + timeBetweenFoxes;

// Инициализируем переменные пораженных и показанных лис.
score = 0;
numFoxes = 0;
}

Функция getTimer () - это своеобразные часы. Функция возвращает количество миллисекунд, прошедших после начала ролика. Значение этих часов постоянно увеличивается, поэтому данную функцию удобно использовать для управления временными интервалами в вашей игре.

Функция onClipEvent (enterFrame) определяет, наступило ли время для появления следующей лисы. Затем она выбирает такое новое отверстие, которое не используется в данный момент. Интервал времени между появлениями лис сокращается на 10 миллисекунд, в результате чего игра с каждым разом все больше ускоряется. Если значение интервала составляет менее 1000 миллисекунд, игра завершается. За 150 секунд пользователь получает 100 возможностей поразить лису.

onClipEvent (enterFrame) {

// Определяем, не пора ли показывать следующую лису,

if (getTimerO >= nextFox) {

// Сокращаем время между показами.

timeBetweenFoxes -= 10;

// Выясняем, не пора ли заканчивать игру,

if (timeBetweenFoxes < 1000) {

_root.gotoAndPlay("End") ;

// Если нет, показываем следующую лису.

} else {

// Увеличиваем счетчик показанных лис.

numFoxes++; _root.showScore = score + "/" + numFoxes;

// Определяем, какая лиса покажется,

while (true) {

fox = Int (Math.Random0*18) ;

if (_root["fox"+fox]._currentFrame == 1) break;

// Выбранная лиса появляется из отверстия.

_root ["fox"+fox].gotoAndPlay ("popup") ;

// Устанавливаем время появления следующей лисы.

nextFox = getTimerO + timeBetweenFoxes;




Как и в предыдущих примерах, основной код назначен клипу "actions". Первая часть кода - функция onClipEvent (load). Клип устанавливает счета на 0 и инициализирует переменную shotsLeft, которой присваивается значение 50. Это позволяет игроку сделать 50 выстрелов и убить как можно больше лис. Переменная shotsLeft используется для отображения счета на экране, а переменная showshotsLeft, связанная с текстовой областью, отображает, сколько выстрелов осталось у игрока.
При помощи функции Mouse.hide () в блоке onClipEvent (load) скрывается курсор мыши.

onClipEvent (load) {

// Задаем время между появлениями лис.

timeBetweenFoxes = 2000;

// Вычисляем, когда должна появиться следующая лиса.

nextFox = getTimer()+timeBetweenFoxes;

// Инициализируем переменную, содержащую количество

// попаданий и число выстрелов.

score = 0;

shotsLeft = 50;

_root.showScore = "Score:"+score;

_root.showShotsLeft = "Shots Left:"+shotsLeft;

// Прячем курсор.

Mouse.hide();

}

Использование объекта Mouse позволяет контролировать видимость курсора, расположенного над рабочим полем ролика. При помощи команды Mouse.hide() вы можете скрыть курсор, при помощи команды Mouse. show () - вновь вывести его на экран. Так как курсор скрыт, его необходимо заменить чем-нибудь, чтобы игрок видел, по какому месту экрана он щелкает. В данном случае клип "cursor" ставится в соответствие положению курсора мыши. В остальном функция onClipEvent (enterFrame) повторяет аналогичную функцию игры "Поймай лису".

onClipEvent (enterFrame) {

// Передвигаем курсор.

_root["cursor"]._x = _root._xmouse;

_root["cursor"]._y = _root._ymouse;

// Проверяем, не пора ли показывать следующую лису

if (getTimer()>=nextFox) {

// Сокращаем время до следующего появления лисы.

timeBetweenFoxes -= 5;

// Проверяем, не завершена ли игра

if (shotsLeft < 1) {

_root.gotoAndPlay("End");

// Если нет, показываем новую лису.

} else {

// Задаем появление новой лисы,




Хотя и клипы и слои отличаются от тех, что использованы в игре "Подстрели лису", основной сценарий этой игры применим и в нашем случае. Это сценарий, назначенный клипу "actions". Необходимо внести только два изменения, и я не буду приводить здесь весь код. Первое изменение состоит в том, что теперь можно выбирать из 10, а не из 7 лисиц, поэтому число внутри функции Math.random должно быть 10.
Второе изменение обращает внимание на положение курсора, так что сцена перемешалась, если пользователь двигает курсор вправо или влево. В этом случае вызывается функция moveScene на корневом уровне. Она принимает значения -1 или 1 в зависимости от направления движения.

// Перемещаем панораму,
if (_root._xmouse < 50) {

_root.moveScene(1);

} else if (_root._xmouse > 500) {

_root.moveScene(-1);

}

Клип "moveScene" находится на главной временной шкале. Этот сценарий начинается с определения нескольких переменных. panAmount отслеживает расстояние, на которое пользователь сдвинулся вправо или влево. Например, если пользователь двигается влево, тогда графика движется вправо и panAmount принимает значение 1. Если он продолжает двигаться в этом направлении, panAmount увеличивается до 2, -, и т.д. Если пользователь движется в противоположном направлении, panAmount принимает значения -1, -2 и так далее.
Поскольку мы не можем нарисовать бесконечно широкую сцену, нам приходится задавать границы панорамирования. Две переменные содержат максимально разрешенное передвижение влево и вправо. Я определил эти границы путем проб и ошибок. Начал я с 50 и увидел, что игрок может доходить до конца деревьев. Тогда я начал пробовать меньшие числа, пока игрок не перестал вылезать за границы сцены.

panLimitLeft = -30;

panLimitRight = 30;

panAmount = 0 ;

Чтобы перемешаться по сцене, сначала проверяется, не превышает ли следующее значение panAmount допустимые границы. Функция работает только в том случае, если следующее значение находится в пределах допустимого.
Потом три клипа - "trees", "bushes" и "hills" - перемещаются в нужном направлении. Деревья перемещаются с коэффициентом (фактически скоростью) 10, кусты - с коэффициентом 5 и холмы - 4. Я подобрал эти значения путем проб и ошибок. По-моему, они создают достаточное ощущение глубины.
Первые 7 лисиц, которые находятся прямо за деревьями, движутся с ними вместе с коэффициентом движения 10. Остальные три лисы перемещаются с коэффициентом 5, поскольку сидят за кустами.



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