Иллюстрированный самоучитель по созданию Flash-игр

Криптограмма

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

На экране только два активных элемента, и то это два почти идентичных динамических текстовых поля. Первое, называющееся decryptedText, связано с переменной decrypted, оно чуть повыше чем второе, названное encryptedText и связанное с переменной encrypted. Шрифт второго поля также чуть светлее.

Оба текстовых поля используют шрифт Courier New, поэтому все буквы занимают одинаковое место, как в игре "Виселица".

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

Необычность этого ролика в том, что весь код помешается в сценарии одного кадра. Весь целиком. Нет ни единой кнопки или клипа. Библиотека этого ролика совершенно пуста.

Сценарий кадра начинается с вызова функции initGame. Она задает фразу и создает карту букв. Карта букв игрока вся состоит из звездочек, обозначающих каждую букву. Результатом должны стать звездочки вместо каждой буквы в расшифрованном текстовом поле. Карта расшифровки, названная letterMap, задается вызовом функции createLetterMap. Вы также можете видеть еще не написанные функции showPhase и showCursor. Первая обновляет текстовое поле на экране, используя последнюю версию карт букв. Вторая выделяет только что выбранную букву полужирным шрифтом. Переменная charpos представляет, какая буква выбрана.

Листенеры – это новое добавление версии Flash MX. Листенер сообщает Flash, что событие произошло, и пора включать набор команд или функцию. Код может создать листенер, определив сначала стандартный объект. Событие, за которым должен следить листенер, в данном случае onKeyUp, задано так, что связано с функцией. Потом команда addListener присоединяет этот объект к объекту Flash, в данном случае объекту Key. Только определенные Flash объекты могут иметь листенеры, и эти листенеры могут быть использованы только для определенных событий, связанных с этими объектами. Например, листенер Key может следить только за событиями onKeyUp и onKeyDown.

В конце функции initGame создается листенер (прослушиватель) клавиатуры, который удостоверяется, что функция getLetter вызывается всякий раз, как игрок нажал клавишу.

initGame();
stop();
function initGame() {
    // Используемая фраза.
    phrase = "Imagination is more important than knowledge. Albert Einstein";
    // Определяем переменные.
    createLetterMap();
    userMap = " ° ° °";
    charpos = 0;
    // Показываем курсор и фразу.
    showPhrase();
    showCursor();
    // Отслеживаем нажатие клавиши.
    keyListener = new Object();
    keyListener.onKeyUp = getLetter;
    Key.addListener(keyListener);
}

Чтобы создать случайную карту букв, нужно просто перебрать все буквы и приписать новую, случайную букву к каждой букве алфавита. Однако это не так просто. Вам нужно быть уверенным не только в том, что вы взяли какую-нибудь букву, но также и в том, что раньше вы ее не брали. Например, вы не хотите приписать Р как к А, так и к Б.

Следующая сложность появляется, когда вы осознаете, что не хотели бы обозначить букву как саму себя. Таким образом, например, если Г обозначает Г, вы должны выкинуть эту карту и сделать новую.

Функция createLetterMap отрабатывает цикл, пока не найдет пригодную карту букв. Обычно это происходит с первой или со второй попытки.

// Создаем случайную строку,
function createLetterMap() {
    do {
        // Повторяем, пока не будет найдена корректная карта.
        letterMap = "";
        for (var i = 0; i < 26; i++) {
            do {
                // Повторяем пока не выбрана буква
                r = Math.floor(Math.random() * 26);
                //Случайное число,
                c = String.fromCharCode(r + 65);
                //Конвертируем в букву.
            } while(letterMap.indexOf(c) > -1);
            letterMap += c;
            // Проверяем верность карты,
            bad = false;
            for (var i = 0; i < 26; i++) {
                if (letterMap.charCodeAt(i) == i + 65) {
                    bad = true;
                    // Буква в разрешенной позиции.
                    break;
                }
            }
        }
    } while(bad);
}

Функция showPhrase просматривает фразу. Она прогоняет каждую букву через letterMap, чтобы получить зашифрованное значение. Затем она прогоняет каждую зашифрованную букву через userMap, чтобы придать текущее, определенное пользователем, значение. Если знак является не буквой, а пробелом или знаком препинания, он показывается без зашифровки.

function showPhrase() {
    encrypted = "";
    decrypted = "";
    for (var i = 0; i < phrase.length; 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 для кода клавиатуры. Значения ascii используются для идентификации букв, а значения code – для идентификации клавишей со стрелками.

Если клавиши со стрелками нажаты, происходит обновление переменной charpos. В конце этой функции вызывается функция showCursor, и правильная буква выделяется полужирным шрифтом.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.