function showPhrase {
encrypted = "";
decrypted = "";
for (var i = 0; i // Значение буквы в этой позиции. c = phrase.toUpperCase.charAt(i); if ((" .-,’").indexOf(c)>-1) { // Задаем пустое место. encrypted += c; decrypted += c; } else { // Используем карту для поиска зашифрованной буквы. encryptedChar = letterMap.charAt(c.charCodeAt(0)-65); encrypted += encryptedChar; // Используем вторую карту для поиска расшифрованной // буквы. decryptedCharacter = userMap.charAt(encryptedChar.charCodeAt(0)-65); decrypted += decryptedCharacter; } }
Когда пользователь нажимает клавишу, листенер объекта Key вызывает функцию getLetter. Нажатая клавиша помещается в две переменные: ascii для ASCII-кода и code для кода клавиатуры. 3начения ascii используются для идентификации букв, а значения code – для идентификации клавишей со стрелками.
Если клавиши со стрелками нажаты, происходит обновление переменной charpos. В конце этой функции вызывается функция showCursor, и правильная буква выделяется полужирным шрифтом.
Если нажата буква, происходит обновление userMap, чтобы показать, что пользователь хочет поставить нажатую клавишу в соответствие с текущей закодированной буквой. Текстовое поле обновляется с помощью showPhrase. После этого расшифрованная фраза сравнивается с исходной, чтобы выяснить, насколько она ей соответствует.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 <= "Z")) {
// Считываем символ из фразы.
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 МХ. Объекты TextFormat имеют множество свойств. Когда вы применяете формат текста к текстовому полю, в поле меняются только те свойства, которые были специально заданы в объекте. Объект plainFormat типа TextFormat обозначает только то, что полужирное выделение ошибочно. Таким образом, если он применен к текстовым полям decryptedText и encryptedText все полужирные буквы заменяются на обычные. Объект cursorFormat имеет противоположное действие. Все буквы, к которым он применен, становятся полужирными. Код устанавливает формат текста только одной буквы в поле, которая соответствует charpos.
function showCursor {
// Оба поля устанавливаем невыделенным шрифтом.
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);
}