Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
материал. часть2 / Розенцвейг_Adobe_Flash_Создание аркад, головоломок и других игр с помощью ActionScript.rtf
Скачиваний:
52
Добавлен:
11.02.2016
Размер:
9.87 Mб
Скачать

Подготовка ролика

В этом ролике четыре кадра. Первый загружает вопросы и ответы и помещает их в массив. Второй кадр содержит информацию о правилах игры.

В третьем кадре начинается само действие, отображается вопрос, четыре ответа, кнопка рядом с каждым ответом, количество возможных очков и счет, оба последних текстовых поля – динамические, первое связано с переменной potentialPoints, а второе – с переменной score.

Помните, что на самом деле четыре ответа – это клипы, в которых находятся текстовые поля, отображающие содержимое переменной text. Однако имена четырех клипов отличаются цифрой: от answer0 до answer3.

И последний кадр игры – "game over". В нем показывается окончательный счет, и пользователь может щелкнуть по кнопке, чтобы сыграть заново.

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

Первый фрагмент кода находится в первом кадре главной временной шкалы. По существу это тот же самый код, который применялся в предыдущей игре для загрузки вопросов из текстового файла. Когда вопросы загружены, вызывается функция initQuestions, расположенная в основной временной шкале:

stop();

// Загружаем список вопросов.

loadQuestions = new LoadVars();

loadQuestions.load("flashtrivia.txt");

loadQuestions.onLoad = initQuestions;

Функция initQuestions разбивает строчку на две части, первая часть – вопрос, вторая – ответы. Затем она отделяет ответы друг от друга. Вся эта информация хранится в массиве qArray.

function initQuestions(quesions) {

// Выделяем вопросы.

qarray = questions.split(String.fromCharCode(13));

// Отделяем вопрос от ответов.

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

qArray[i] = qArray[i].split(":");

// Отделяем ответы друг от друга.

qArray[i][1] = qArray[i][1].split(";");

}

}

Наибольшая часть кода находится в кадре «play», то есть в том кадре, где задаются вопросы, и пользователь должен на них ответить. Сначала функция initGame обнуляет счет и выводит первый вопрос.

function initGame() {

// Определяем переменные.

questionNum = 0;

score = 0;

// Выводим первый вопрос.

displayQuestion();

}

Функция displayQuestion берет следующий вопрос и помещает вопрос и ответы в соответствующие текстовые поля. Она также устанавливает количество возможных очков за правильный ответ на данный вопрос равным 1000.

function displayQuestion() {

// Проверяем, все ли вопросы заданы.

if (questionNum >= qArray.length) {

// Отображаем окончательный счет, завершаем игру.

gotoAndPlay("game over");

} else {

// Перемешиваем ответы.

answers = shuffleArray(qArray[questionNum][1].slice(0));

// Выводим вопрос и ответы на экран.

question.text = qArray[questionNum][0];

answer0.text = answers[0];

answer1.text = answers[1];

answer2.text = answers[2];

answer3.text = answers[3];

// Отображаем номер вопроса.

questionNumDisplay = questionNum+1;

// Запоминаем, какой ответ правильный.

correctAnswer = qArray[questionNum][1][0];

// Воспроизводим анимацию текста.

animateIn();

// Присваиваем начальное количество возможных очков – 1000.

potentialPoints = 1000;

}

}

При каждом обращении к кадру «play» клипом «actions» вызывается функция scoreCount. Она вычитает единицу из максимального возможного числа очков, проверяя, чтобы это значение не оказалось менее 0.

// В каждом кадре из максимального возможного числа очков

// вычитаем единицу.

function scoreCount() {

// Проверяем, на месте ли последний ответ.

if (answers3._x == 400) {

// Вычитаем единицу.

potenrialPoints ‑= 1;

if (potentialPoints < 0) potentialPoints = 0;

}

}

Функция shuffleArray используется методом displayQuestion, чтобы случайным образом перемешать ответы. Сначала создается новый массив, а затем поэлементно из старого массива добавляются значения в новый массив.

// Берем массив array1 и перемешиваем его элементы

// для массива array2.

function shuffleArray(array1) {

// Создаем новый, пустой массив.

array2 = new Array();

// Просматриваем массив с помощью цикла.

do {

// Выбираем случайную величину.

r = int(Math.random()*array1.length);

// Добавляем элемент в новый массив.

array2.push(array1[r]);

// Удаляем элемент из старого массива.

array1.splice(r, 1);

} while (array1.length > 0);

// Возвращаем новый массив.

return(array2);

}

Функция animateIn определяет положение четырех ответов с правой стороны рабочего поля. Она указывает, что каждый из этих четырех клипов должен остановиться при перемещении влево, когда достигнет нужного горизонтального положения (400 пикселов от правой границы игрового поля). Сценарий, прикрепленный к каждому клипу, перемещает клип влево до тех пор, пока не будет выполнено вышеуказанное условие.

function animateIn() {

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

// и указываем место, где каждый клип должен остановиться.

answer0.xstop = 400;

answer0._x = 800;

answer1.xstop = 400;

answer1._x = 1000;

answer2.xstop = 400;

answer2._x = 1200;

answer3.xstop = 400;

answer3._x = 1400;

}

Когда пользователь щелкает по кнопке, выбранный ответ сравнивается со значением переменной correctAnswer, которая была определена в функции displayQuestion. Если ответ правильный, он набирает возможное количество очков, и выводится следующий вопрос. В противном случае, из количества возможных очков вычитается 200, и ответ удаляется с экрана.

function selectAnswer(n) {

// Правильный ответ.

if (answer[n] == correctAnswer) {

triggerSound("right");

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

score += potentialPoints;

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

questionNum++;

displayQuestion();

} else {

// Неправильный ответ.

triggerSound("wrong");

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

potentialPoints ‑= 200;

if (potentialPoints < 0) potentialPoints = 0;

// Удаляем ответ.

_root["answer"+n].text = "";

}

}

Функция triggerSound работает точно так же, как и в предыдущей игре. Она просто воспроизводит короткий звуковой сигнал.

function triggerSound(soundName) {

// Воспроизводим звук.

// Aini.iecaiaei caoe.

soundfx.stop();

soundfx = new Sound();

soundfx.attachSound(soundName);

soundfx.start();

}

Другие фрагменты кода кадра «play» включают небольшую часть для клипа «actions», который вызывает метод scoreCount.

onClipEvent(enterFrame) {

_root.scoreCount();

}

Код для каждого из четырех клипов ответа также используется в программе (здесь представлен код только для одного клипа). Обратите внимание, что клип движется в два раза быстрее, чем в предыдущей игре.

onClipEvent(enterFrame) {

if (_x != xstop) _x ‑= 40;

}

В каждой из четырех кнопок содержится сценарий, инициирующий при ее нажатии функцию selectAnswer. Кнопки реагируют не только на щелчок мыши, для каждой кнопки определена клавиша на клавиатуре. Например, первая кнопка, которую вы видите, помечена "A" (рис. 12.4), она реагирует на нажатие клавиши "A".

on (release, keyPress "A") {

selectAnswer(0);

}

Соседние файлы в папке материал. часть2