Викторина во Flash
Текст разбивается на несколько элементов с помощью функции split, которая сначала отделяет вопросы друг от друга, затем разделяет части вопросов и, наконец, отделяет ответы. В результате получается двумерный массив, содержащий всю необходимую вам информацию.
function
initQuestions(questions) {
// Задаем значение переменной topic,
topic
=
loadQuestions.topic;
// Разбиваем на отдельные вопросы.
// Внимание: в некоторых случаях лучше использовать
// значение 13, а не 10.
qArray
=
loadQuestions.questions.split(String.fromCharCode(
10
));
// Разбиваем строчку вопроса на элементы,
for
(i
=
0
; i
<
qArray.length; i
+
+
) {
qArray[i]
=
qArray[i].split(
":"
);
// Отделяем ответы друг от друга.
qArray[i][
1
]
=
qArray[i][
1
].split(
";"
);
}
// Начинаем игру.
_root.gotoAndPlay(
"start game"
);
}
Я использовал выражение String.fromCharCode (13), чтобы получить символ возврата каретки, что нужно для отделения строк в текстовом файле. Почему я не применил константу newline? Дело в том, что newline в программе Flash отличается для систем Macintosh и Windows. В Macintosh возвращается значение 13, а в Windows – 10. Более того, некоторые текстовые редакторы предпочитают значение 10, а некоторые оба! Так что, если игра не движется далее первого вопроса, попробуйте поменять 10 на 13, чтобы проверить, не в этом ли проблема.
Когда игра переходит к кадру "play", код ActionScript в основной временной шкале сразу же вызывает функцию initGame, которая обнуляет переменные questionNum и numRight и вызывает функцию displayQuestion, отображающую первый вопрос.
Функция split берет строчку и разбивает ее на фрагменты, которые помешаются в массив. Единственный параметр, который используется в этой функции, – это символ, необходимый для разделения фрагментов. В предыдущем примере как двоеточие, так и точка с запятой применялись для разбиения строчки и помещения элементов в массив.
function
initGameO {
// Устанавливаем значения переменных.
questionName
=
0
;
numRight
=
0
;
// Выводим первый вопрос.
displayQuestion();
}
Функция displayQuestion определяет, закончена ли игра или нет, и в случае положительного ответа отображает окончательное количество набранных очков и переходит к кадру "game over". В противном случае она берет вопрос и каждый ответ и помешает их в текстовые поля внутри соответствующих клипов. Номер правильного ответа присваивается переменной correctAnswer.
function
displayQuestion() {
// Проверяем, все ли вопросы уже заданы,
if
(questionNum
>
=
qArray.length) {
// Отображаем окончательное число очков и завершаем игру
finalScore
=
numRight
+
"out of"
+
qArray.length;
gotoAndPlay(
"game over"
);
}
else
{
// Отображаем вопрос и ответы на экране.
question.text
=
qArray[questionNum][
0
];
answer0.text
=
qArray[questionNum][
1
][
0
];
answer1.text
=
qArray[questionNum][
1
][
1
];
answer2.text
=
qArray[questionNum][
1
][
2
];
answer3.text
=
qArray[questionNum][
1
][
3
];
// Выводим номер ответа.
questionNumDisplay
=
questionNum
+
1
;
// Запоминаем, какой ответ верный.
correctAnswer
=
int(qArray[questionNum][
2
]);
// Делаем так, чтобы текст "въезжал" на экран
animatein();
}
}
Когда у вас массив содержится в другом массиве (двумерный массив), к элементу вложенного массива можно обратиться с помощью нескольких скобок. Например, выражение myArray[3] [8] обращается в восьмому значению третьего элемента массива myArray. Массив myArray состоит из четырех или более элементов, в третьем элементе содержится, в свою очередь, массив по меньшей мере из девяти элементов.
Функция animatein позволяет создать эффект появляющегося из-за экрана текста. Она устанавливает положение каждого текстового клипа за рабочим полем справа. Затем для каждого из этих клипов с помощью переменной xstop присваивается нужное горизонтальное положение. Код, прикрепленный к каждому из этих клипов, перемешает его влево до тех пор, пока он не дойдет до положения xstop.
function
animatein() {
// Определяем положение каждого элемента текста,
//а также указываем место, где клип должен остановиться.
question.xstop
=
300
;
question._x
=
800
;
answerO.xstop
=
400
;
answer0._x
=
1000
;
answerl.xstop
=
400
;
answerl._x
=
1200
;
answer2.xstop
=
400
;
answer2._x
=
1400
;
answer3.xstop
=
400
;
answer3._x
=
1600
;
}