Криптограмма
Если нажата буква, происходит обновление 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 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);
}
К сведению
Исходный ролик содержит кадр "game over". Это к нему возвращается ролик, когда головоломка решена. Вы также можете использовать removeListener, если хотите заставить ролик перестать отвечать на нажатие клавиш.
Другие возможности
По мере того, как игрок движется вдоль фразы с помощью клавиш со стрелками, курсор иногда оказывается над пробелом или другим неактивным знаком. Вы можете расширить код, чтобы следить за движением курсора и, когда он находится на пустым пространством, заставить его продолжать движение вперед или назад, пока он не коснется буквы.
Хотя исходный ролик содержит фразу, встроенную в код, вы можете считывать ее с помощью команд LoadVariables или LoadVars. Это дает вам возможность изменять фразу без перекомпилирования swf-файла.