91824841

Я использовал выражение String. fromCharCode


function initQuestions(questions) {

// Задаем значение переменной topic,

topic = loadQuestions.topic;

// Разбиваем на отдельные вопросы.

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

// значение 13, а не 10.

qArray = loadQuestions.questions.split(String.fromCharCode(10));

// Разбиваем строчку вопроса на элементы,

for(i=0;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.



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) {

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

soundfx.stop();

soundfx = new Sound();

soundfx.attachSoundtsoundName();

soundfx.start();

}

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

onClipEvent(enterFrame) {

root.scoreCount() ;
}

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

onClipEvent(enterFrame) {

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

}

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

on (release, keyPress "A") {

selectAnswer(0);

}



function getLetter() {
// Считываем ascii код и код клавиатуры.
var ascii = Key.getAscii();
var code = Key.getCode() ;
// Передвигаем курсор,
if (code == Key.LEFT) {
charpos--;
if (charpos < 0) charpos = 0;
} else if (code == Key.RIGHT) {
charpos++;
if (charpos > phrase.length-1) charpos = phrase.length-1;
} else {
// Считываем клавиши.
var keyChar = String.fromCharCode(ascii);
keyChar = keyChar.toUpperCase();
// Убеждаемся, что была нажата буква.
if ((keyChar >= "A") and (keyChar

// Считываем символ из фразы.
phraseChar = phrase.toUpperCase().charCodeAt(charpos)- 65;
// Если это буква.
if ((phraseChar >= 0) and (phraseChar < 26)) {
// Получаем ее значение в карте
letterNum = letterMap.charCodeAt(phraseChar)-65;
// Заменяем букву во второй карте.
userMap = replaceChar (userMap, letterNum,keyChar) ,
// Обновляем фразу showPhrase();
//Проверяем, не окончена ли игра,
if (phrase.toUpperCase() == decrypted) {
gotoAndStop("game over");
}}
}}
// Обновляем курсор.
showCursor();
}

К сожалению, нет такой команды ActionScript, позволяющей легко заменять одну букву в строке на другую. Поэтому придется сделать для этого собственную функцию. Функция берет буквы до замены и присоединяет их к буквам после замены, с новой буквой в середине.

// Заменяем букву в строке.
function replaceChar(mainString, num, newchar) {
newString = mainString.substring(0,num)+ newchar +mainString.substring(num+1,mainString.length) ;
return(newString);
}

Чтобы показать пользователю, к какой букве относится переменная charpos, эта буква выделяется полужирным и в зашифрованном, и в расшифрованном поле. Сделать это можно с помощью объекта типа TextFormat:, появившегося в версии Flash MX. Объекты TextFormat имеют множество свойств. Когда вы применяете формат текста к текстовому полю, в поле меняются только те свойства, которые были специаль заданы в объекте.
Объект plainFormat типа TextFormat обозначает только то, что полужирное выделение ошибочно. Таким образом, если он применен к текстовым полям decryptedText и encryptedText все полужирные буквы заменяются на обычные. Объект cursorFormat имеет противоположное действие. Все буквы, к которым он применен, становятся полужирными. Код устанавливает формат текста только одной буквы в поле, которая соответствует charpos.

function showCursorf) {

// Оба поля устанавливаем невыделенным шрифтом.

plainFormat = new TextFormat();

plainFormat.bold = false;

decryptedText.setTextFormat(plainFormat);

encryptedText.setTextFormat(plainFormat);

// Одну букву выделяем полужирным.

cursorFormat = new TextFormat();

cursorFormat.bold = true;

decryptedText.setTextFormat(charpos,cursorFormat);

encryptedText.setTextFormat(charpos,cursorFormat);


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