Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Шрифт:
Когда пользователь нажимает клавишу, листенер объекта 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);
}К сведению
Исходный ролик содержит кадр «game over». Это к нему возвращается ролик, когда головоломка решена. Вы также можете использовать removeListener, если хотите заставить ролик перестать отвечать на нажатие клавиш.
Другие возможности
По мере того, как игрок движется вдоль фразы с помощью клавиш со стрелками, курсор иногда оказывается над пробелом или другим неактивным знаком. Вы можете расширить код, чтобы следить за движением курсора и, когда он находится на пустым пространством, заставить его продолжать движение вперед или назад, пока он не коснется буквы.
Хотя исходный ролик содержит фразу, встроенную в код, вы можете считывать ее с помощью команд LoadVariables или LoadVars. Это дает вам возможность изменять фразу без перекомпилирования swf-файла.
Глава 13 Мозаика
• Пазл
• Пятнашки
• Игра совпадений
• Найди картинку
Игры, использующие изображения в качестве основных элементов, очень разнообразны. Изображения могут быть любыми, поэтому вы можете использовать их на любом Web-сайте. В этой главе будет рассмотрено четыре типа мозаики. Первый – простая составная картинка-загадка, в которой игрок собирает элементы картинки. Во второй игре пользователя просят перемещать квадратные элементы мозаики вдоль сетки, пока не будет составлена картинка. В третьей игре пользователь должен находить совпадающие изображения. В последней игре необходимо обнаружить место отдельного фрагмента в целой картинке.
Пазл
Исходный файл: Jigsawpuzzle.fla
Игра "Пазл" состоит из элементов одного размера, которые, соединяясь, образуют целостное изображение. Обычно они сделаны из картона и для составления картинки требуется большая площадь, например, обеденный стол. Так как экран монитора слишком мал по сравнению со столом, создать компьютерный аналог такой игры очень сложно.
Однако в упрощенном варианте подобная игра вполне применима для Web-сайта в качестве развлекательного материала.
Рисунок 13.1. Пазл почти собран
Задача проекта
Цель проекта – создать простую, но от этого не менее интересную игру «Пазл». Игрок сможет перетаскивать элементы мозаики с границы рабочего поля на сетку. Когда элемент окажется около того места, где должен располагаться, он будет зафиксирован.
Подход
Для создания этой игры можно просто прикрепить небольшой сценарий к клипу «actions», расположенному вне рабочего поля. Когда пользователь щелкнет по рабочему полю, сценарий определит, какой элемент находится под курсором, затем этот элемент будет перетаскиваться с использованием стандартных возможностей Flash.
Когда кнопка мыши отпускается, код определяет, находится ли элемент мозаики рядом со определенным для него местом, и, если да, элемент фиксируется.
Сначала устанавливаем для всех клипов, содержащих элементы мозаики, свойство _alpha=75, чтобы они стали немного светлее. Затем, когда игрок поместит элемент на свое место, соответствующий клип станет полностью непрозрачным. Таким образом, будет обеспечена некая обратная связь с игроком, ему будет сообщаться, что элемент находится на своем месте. Также будет проверяться, является ли элемент мозаики полностью непрозрачным в тот момент, когда пользователь щелкает по нему мышкой и начинает перетаскивать. Это необходимо, чтобы те элементы, которые уже находятся на своем месте, больше не перемещались.
Узнать, находится элемент на своем месте или нет, несложно, потому что они сделаны таким образом, чтобы их центр находился в центре основной картинки. Например, у элемента из верхнего левого угла центр будет правее и ниже (рис. 13.2).
Рисунок 13.2. Центр этого элемента определяется по отношению к центру всей картинки
Теперь представьте, что каждый элемент создан именно так. Центр элемента останется в центре картины не зависимо от того, где он будет располагаться. Если вы не совсем поняли, что я имею в виду, просмотрите исходный ролик Jigsawpuzzle.fla. Изучите несколько клипов, содержащих элементы мозаики, и увидите, что центр остается постоянным.
Это намного упрощает код. Каждый элемент должен быть помещен точно на свое место, чтобы вписаться в контур картинки. Так что способ определения надлежащего положения элемента будет одинаковым для всех клипов.
Подготовка ролика
Так как же я создал 24 элемента в игре? На самом деле, это была самая сложная часть работы. Однако здесь нет ничего сверхъестественного, просто данный процесс отнимает много сил. Для тех, кто хочет знать, я постараюсь объяснить. Нет одного универсального способа создания элементов с помощью Flash-графики, каждый выбирает то, что ему больше нравится.
Я начал с изображения, которое представляло собой набор линий и областей на одном слое, после чего преобразовал все линии в области, так чтобы в изображении остались только сплошные области [16] .
Затем я создал кадр для мозаики (см. рис. 13.1). Я нарисовал только небольшую часть сетки вдоль направляющих Flash, затем скопировал и вставил этот кусочек несколько раз, так что получилось очертание картинки (как в пазле).
Затем каждую область сетки залил красным цветом и выделил все залитые области, кроме той, которая предназначена для элемента мозаики в верхнем правом углу. Скопировал выделение и вставил его в верхнюю часть моей картинки. Потом выделил и удалил всю красную область, таким образом, на рабочем поле остался только один элемент.
Так как мои действия уничтожили созданное ранее, я сохранил копии очертания и картинки в других слоях. Теперь я могу повторить эти действия для создания следующей картинки. Для 24 элементов пришлось проделать это 24 раза.
Когда все было сделано и получилось 24 клипа, понадобилась сетка для повторного выравнивания элементов, так чтобы их центр располагался в нужном месте. Для завершения мне понадобилось 20 минут. Однако, возможно, вы сделаете то же самое гораздо быстрее.
После того как у меня получились все элементы, я поместил экземпляр каждого клипа на рабочее поле и присвоил экземпляру клипа имя, соответствующее имени самого клипа. 24 элемента называются от "0–0" до "5–3" в зависимости от вертикального и горизонтального положения элемента. Однако я разместил элементы вокруг границы рабочего поля в произвольном порядке. Также каждому клипу присвоил значение _apha=75. Затем я поместил клип контура картинки в центр и назвал его "outline".
Создание кода
Весь сценарий прикреплен к клипу «actions», расположенному за пределами рабочего поля. Он начинается с обработчика событий onClipEvent (mouseDown), который реагирует на щелчок мыши по рабочему полю.
Этот код просто просматривает элементы картинки и определяет, находится ли один из них под курсором, а также является ли элемент полностью непрозрачным, то есть размещен ли на своем месте.
Если элемент найден, программе Flash сообщается, что теперь он подвижный и может перемещаться с помощью команды startDrag. Затем программа завершается.