Сегодня я покажу вам, как создать простой поиск слов с удобным интерфейсом «подсветки», который легко изменить с помощью ваших собственных слов и макета. Мы будем использовать Flash и AS3. Читай дальше!
Окончательный результат предварительного просмотра
Давайте посмотрим на конечный результат, к которому мы будем стремиться:
Шаг 1: Краткий обзор
В этом уроке мы будем использовать серию классов ActionScript, чтобы создать классическую игру для поиска по алфавиту. Цель игры состоит в том, чтобы выделить буквы, чтобы сформировать слово. Вы сможете создать свой собственный алфавитный суп и добавить свои слова.
Шаг 2: Настройки документа Flash
Откройте Flash и создайте документ размером 320×480 пикселей. Установите частоту кадров 24 к / с.
Шаг 3: Интерфейс
Будет использован простой оранжевый интерфейс с несколькими фигурами, кнопками и мувиклипами; перейдите к следующим шагам для создания этого графического интерфейса.
Шаг 4: Фон
Этот фон был создан во Flash с использованием простых прямоугольных форм. Шестнадцатеричный цвет для апельсина — # EE923F.
Шаг 5: Название

Чтобы создать заголовок, сначала выберите инструмент «Текст» (T), измените цвет на #EEEEEE и напишите текст заголовка. Затем дублируйте текстовое поле (Cmd + D), измените цвет на # C97B35 и отправьте новое текстовое поле назад, чтобы создать эффект высокой печати.
Шаг 6: Кнопки
Снова используйте Text Tool, чтобы создать две кнопки, как показано на рисунке выше. Преобразуйте их в кнопки и дайте им описательные имена экземпляров, чтобы потом их было легче использовать в коде. Преобразуйте поэтапную графику в один мувиклип и назовите его TitleView — не забудьте установить флажок « Экспорт для ActionScript» .
Шаг 7: Экран игры

Это экран игры — ну, его фон, так как все на этом экране будет создаваться динамически с использованием ActionScript 3.
Шаг 8: Об экране

Экран About появится перед титульным экраном; использовать графику и шрифты, использованные прежде, чтобы выложить его. Назовите его AboutView и не забудьте установить флажок « Экспорт для ActionScript» .
Шаг 9: оповещение

Когда будут найдены все слова, будет отображено предупреждение, в котором будет отображаться сообщение об игре и инструкции. Используйте Rectangle Tool, чтобы создать его и установить имя его экземпляра в AlertView . Снова отметьте поле « Экспорт для ActionScript» .
Шаг 10: Звуки
Мы будем использовать звуковые эффекты, чтобы улучшить ощущение игры. Вы можете найти звук, используемый в этом примере на Soungle.com, используя ключевое слово bell .
Шаг 11: TweenNano
Мы будем использовать другой движок анимации движения, отличающийся от встроенного во флэш-память по умолчанию, это повысит производительность, а также упростит его использование.
Вы можете скачать TweenNano с официального сайта .
Шаг 12: Установите класс документа

Мы сделаем наше приложение интерактивным, используя внешний класс. Добавьте его имя ( Main ) в поле Class в разделе Publish панели Properties, чтобы связать FLA с классом Main document .
Шаг 13: создайте новый класс

Создайте новый (Cmd + N) класс ActionScript 3.0 и сохраните его как Main.as в папке вашего класса. Это будет класс документа.
Шаг 14: Структура класса
Создайте базовую структуру классов, чтобы начать писать код.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
package
{
import flash.display.Sprite;
public class Main extends Sprite
{
public function Main():void
{
// constructor code
}
}
}
|
Шаг 15: Обязательные классы
Это классы, которые нам нужно импортировать, чтобы наш класс работал. Директива import делает внешние классы и пакеты доступными для вашего кода.
|
01
02
03
04
05
06
07
08
09
10
11
|
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import flash.display.Shape;
import flash.events.MouseEvent;
import flash.display.MovieClip;
import com.greensock.TweenNano;
import com.greensock.easing.Bounce;
import flash.net.navigateToURL;
import flash.net.URLRequest;
|
Шаг 16: переменные
Эти переменные мы будем использовать; Прочитайте комментарии в коде, чтобы узнать о них больше. Некоторые из их имен говорят сами за себя, поэтому там не будет никаких комментариев.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
private var titleView:TitleView = new TitleView();
private var about:AboutView;
//words to find
private const L1:Vector.<String> = new <String>[‘CLASS’, ‘PUBLISH’, ‘DEFAULT’, ‘SETTINGS’, ‘FLASH’];
//Used to position the words in the stage
private const L1Map:Array = [[0, 0, ‘C’, 0, 0, 0, 0, 0, 0, 0],
[0, 0, ‘L’, 0, 0, 0, 0, 0, 0, 0],
[0, 0, ‘A’, 0, 0, 0, 0, 0, 0, ‘S’],
[0, 0, ‘S’, 0, 0, 0, 0, 0, 0, ‘E’],
[0, 0, ‘S’, 0, 0, 0, 0, 0, 0, ‘T’],
[0, 0, 0, 0, 0, 0, 0, 0, ‘F’, ‘T’],
[‘D’, ‘E’, ‘F’, ‘A’, ‘U’, ‘L’, ‘T’, 0, ‘L’, ‘I’],
[0, 0, 0, 0, 0, 0, 0, 0, ‘A’, ‘N’],
[0, 0, 0, 0, 0, 0, 0, 0, ‘S’, ‘G’],
[0, 0, ‘P’, ‘U’, ‘B’, ‘L’, ‘I’, ‘S’, ‘H’, ‘S’],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
private var alphabet:Vector.<String> = new <String>[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’];
private var soupFmt:TextFormat = new TextFormat(‘Arial’, 19, 0x666666);
private var wordsFmt:TextFormat = new TextFormat(‘Arial’, 12, 0xEEEEEE);
private var wordsList:TextField = new TextField();
private var line:Shape = new Shape();
private var tfs:MovieClip = new MovieClip();
private var bell:Bell = new Bell();
private var correct:int = 0;
|
Шаг 17: Конструктор
Конструктор — это функция, которая запускается при создании объекта из класса, этот код выполняется первым при создании экземпляра объекта или запускается при загрузке FLA, если он является частью класса документа .
Вызывает необходимые функции для запуска игры. Проверьте эти функции в следующих шагах.
|
1
2
3
4
|
public final function Main():void
{
//Code
}
|
Шаг 18: Добавьте заголовок
Мы начнем с добавления TitleView из библиотеки на сцену.
|
1
|
addChild(titleView);
|
Шаг 19: добавь слушателей кнопки
Это добавит слушателей мыши к кнопкам в представлении заголовка, что приведет нас к экрану игры или кредитов.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
private final function startButtonListeners(action:String = ‘add’):void
{
if(action == ‘add’)
{
titleView.aboutBtn.addEventListener(MouseEvent.MOUSE_UP, showCredits);
titleView.startBtn.addEventListener(MouseEvent.MOUSE_UP, showGameView);
}
else
{
titleView.aboutBtn.removeEventListener(MouseEvent.MOUSE_UP, showCredits);
titleView.startBtn.removeEventListener(MouseEvent.MOUSE_UP, showGameView);
}
}
|
Шаг 20: Показать кредиты
Экран « Кредиты» отображается, когда пользователь нажимает кнопку «Кредиты»; слушатель мыши добавляется в полный MovieClip, чтобы удалить его.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
private final function showCredits(e:MouseEvent):void
{
titleView.aboutBtn.visible = false;
titleView.startBtn.visible = false;
about = new AboutView();
about.y = stage.stageHeight + about.height;
addChild(about);
TweenNano.to(
about,
0.3,
{
y:stage.stageHeight-about.height,
onComplete:function():void{
about.addEventListener(MouseEvent.MOUSE_UP, hideCredits);
}
}
);
}
|
Шаг 21: Скрыть кредиты
Если щелкнуть экран « Кредиты», он вернется и будет удален со сцены.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
private final function hideCredits(e:MouseEvent):void
{
TweenNano.to(
about,
0.3,
{
y:stage.stageHeight+about.height,
onComplete:function():void{
titleView.aboutBtn.visible = true;
titleView.startBtn.visible = true;
about.removeEventListener(MouseEvent.MOUSE_UP, hideCredits);
removeChild(about);
about = null;
}
}
);
}
|
Шаг 22: Показать игровой вид
Следующие строки убирают титульный экран и оставляют экран игры видимым. Он также вызывает необходимые функции для запуска игры — мы добавим эти функции на следующих шагах.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
private final function showGameView(e:MouseEvent):void
{
TweenNano.to(
titleView,
0.3,
{
y:-titleView.height,
onComplete:function():void{
startButtonListeners(‘rmv’);
removeChild(titleView);
titleView = null;
}
}
);
buildSoup();
gameListeners(‘add’);
}
|
Давайте остановимся здесь, чтобы сделать быстрый тест и убедиться, что наш игровой код работает:
Имейте в виду, что некоторые строки были закомментированы, так как некоторые функции еще не созданы.
Помните, что файлы Milestone включены в исходную загрузку , поэтому, если по какой-то причине ваш файл не имитирует этот, посмотрите на источник, чтобы понять, что может быть причиной этого.
Шаг 23: Слушатели игр
Эта функция добавляет слушателей мыши, необходимых для рисования линии, которая будет выделять буквы.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
private final function gameListeners(action:String):void
{
if(action == ‘add’)
{
stage.addEventListener(MouseEvent.MOUSE_DOWN, startDraw);
stage.addEventListener(MouseEvent.MOUSE_UP, detectLetters);
}
else
{
stage.removeEventListener(MouseEvent.MOUSE_DOWN, startDraw);
stage.removeEventListener(MouseEvent.MOUSE_UP, detectLetters);
}
}
|
Шаг 24: построй суп
Одна из самых важных функций в игре. Он будет создавать и позиционировать персонажей для построения алфавитного супа. Мы закодируем его поведение в течение следующих нескольких шагов.
|
1
2
3
4
|
private final function buildSoup():void
{
//Code…
}
|
Шаг 25. Создайте текстовые поля символов
Вложенные циклы for используются для чтения многомерного массива; TextField создается для каждого найденного элемента, и этому текстовому полю присваивается позиция.
|
01
02
03
04
05
06
07
08
09
10
11
|
for(var i:int = 0; i < 10; i++)
{
for(var j:int = 0; j < 12; j++)
{
var tf:TextField = new TextField();
tf.width = 22;
tf.height = 22;
tf.defaultTextFormat = soupFmt;
tf.selectable = false;
tf.x = 10 + (31.3 * i);
tf.y = 10 + (35 * j)
|
Шаг 26: Показать случайный символ
Слова уже установлены в исходном массиве букв, поэтому следующий код изменит 0 на случайные символы, полученные из массива Alphabet. Поскольку это только изменяет 0, исходные символы не будут изменены.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
/* Change 0’s to Random Letters */
if(L1Map[j][i] == 0)
{
L1Map[j][i] = alphabet[Math.floor(Math.random() * alphabet.length)];
}
tf.text = L1Map[j][i];
addChild(tfs);
tfs.addChild(tf);
}
|
Шаг 27: добавь список слов TextField
Это TextField показывает слова для поиска, он находится в нижней части сцены.
|
1
2
3
4
5
6
7
|
/* Add Words List */
wordsList.selectable = false;
wordsList.x = 5;
wordsList.y = 430;
wordsList.autoSize = TextFieldAutoSize.LEFT;
wordsList.defaultTextFormat = wordsFmt;
|
Шаг 28: список слов
Чтобы правильно отобразить слова из массива, мы можем привести его к строке, но нам нужно удалить запятые, которые добавляются автоматически.
|
01
02
03
04
05
06
07
08
09
10
|
/* Remove ‘,’ */
var string:String = »;
for(var k:int = 0; k < L1.length; k++)
{
string += String(String(L1[k]).replace(‘,’, »)) + ‘ ‘;
}
wordsList.text = string;
addChild(wordsList);
|
На этом завершается buildSoup() .
Шаг 29: Начните строку выбора
Линия выбора начнет рисоваться, когда пользователь нажимает на сцену; эта функция создает форму и добавляет слушателя, который следит за движением мыши.
|
1
2
3
4
5
6
7
8
9
|
private final function startDraw(e:MouseEvent):void
{
line = new Shape();
addChild(line);
line.graphics.moveTo(mouseX, mouseY);
line.graphics.lineStyle(16, 0xFF8E2A, 0.4);
stage.addEventListener(MouseEvent.MOUSE_MOVE, drawLine);
}
|
Шаг 30: Нарисуйте линию выбора
Следующий код рисует линию в направлении мыши.
|
1
2
3
4
|
private final function drawLine(e:MouseEvent):void
{
line.graphics.lineTo(mouseX, mouseY);
}
|
Давайте остановимся здесь, чтобы сделать быстрый тест и убедиться, что наш игровой код работает:
Он рисует линию, но не останавливается. Мы разберемся с этим на следующем шаге.
Имейте в виду, что некоторые строки были закомментированы, так как некоторые функции еще не созданы.
Помните, что Вехи включены в исходные файлы, поэтому, если по какой-то причине ваш файл не имитирует этот, взгляните на источник, чтобы понять, что может быть причиной этого.
Шаг 31: Обнаружение функции писем
Когда кнопка мыши нажата, метод рисования останавливается и запускается код для определения выделенных слов. Я объясню этот код в следующих шагах.
|
1
2
|
private final function detectLetters(e:MouseEvent):void
{
|
Шаг 32: получи выбранные письма
Чтобы обнаружить выделенные символы, мы создаем строковую переменную, в которой будут храниться текстовые поля, попавшие в строку выбора.
|
01
02
03
04
05
06
07
08
09
10
11
|
/* Get selected letters */
var selectedWord:String = »;
for(var i:int = 0; i < tfs.numChildren; i++)
{
if(line.hitTestObject(tfs.getChildAt(i)))
{
selectedWord += (tfs.getChildAt(i) as TextField).text;
}
}
|
Шаг 33: Проверьте, есть ли слово в списке
Затем мы сравниваем результат с каждым словом в предопределенном массиве; если слово найдено, звук воспроизводится, correct переменная увеличивается, и слово меняет свой цвет в нижней строке.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
/* Check if word is on list */
for(var j:int = 0; j < L1.length; j++)
{
if(selectedWord == L1[j])
{
wordsList.htmlText = wordsList.htmlText.replace(
selectedWord,
«<font color=’#FF8E2A’>» + selectedWord + «</font>»
);
bell.play();
correct++;
}
}
|
Шаг 34: Проверка на окончание игры
Этот код вызывает и оповещает, когда все слова найдены.
|
1
2
3
4
|
if(correct == L1.length)
{
alert();
}
|
Шаг 36: Оповещение
Эта функция останавливает игру и показывает сообщение об окончании игры, а также добавляет слушателя мыши для сброса игры при нажатии.
|
1
2
3
4
5
6
7
8
9
|
private final function alert():void
{
gameListeners(‘rm’);
var alert:AlertView = new AlertView();
addChild(alert);
alert.addEventListener(MouseEvent.MOUSE_UP, restart);//or next level!
TweenNano.from(alert.messageBox, 0.5, {y: -alert.messageBox.height, ease:Bounce.easeOut});
}
|
На этом завершается detectLetters() .
Шаг 37: перезапустите функцию
Следующая функция перезагрузит SWF, сбросив все переменные и методы и вернувшись к первому экрану.
|
1
2
3
4
|
private final function restart(e:MouseEvent):void
{
navigateToURL(new URLRequest(stage.loaderInfo.url), ‘_level0’);
}
|
Шаг 38: Тестовая игра
Теперь мы готовы протестировать нашу игру и посмотреть, все ли работает так, как ожидалось.
Шаг 39: измени список слов
Вы можете изменить список слов, просто изменив эту строку в коде:
|
1
|
private const L1:Vector.<String> = new <String>[‘CLASS’, ‘PUBLISH’, ‘DEFAULT’, ‘SETTINGS’, ‘FLASH’];
|
Это только изменит список слов, которые должен обнаружить код; чтобы слова действительно появлялись в алфавитном супе, прочитайте следующий шаг.
Шаг 40: измени массив карт
Алфавитный суп создан на основе этого массива карты 10х12. Просто измените буквы на нужные, чтобы добавить и расположить слова и использовать 0 для всего остального. Кавычки могут затруднить процесс, поэтому я рекомендую сначала писать символы, а затем добавлять кавычки, когда карта готова.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
private const L1Map:Array = [[0, 0, ‘C’, 0, 0, 0, 0, 0, 0, 0],
[0, 0, ‘L’, 0, 0, 0, 0, 0, 0, 0],
[0, 0, ‘A’, 0, 0, 0, 0, 0, 0, ‘S’],
[0, 0, ‘S’, 0, 0, 0, 0, 0, 0, ‘E’],
[0, 0, ‘S’, 0, 0, 0, 0, 0, 0, ‘T’],
[0, 0, 0, 0, 0, 0, 0, 0, ‘F’, ‘T’],
[‘D’, ‘E’, ‘F’, ‘A’, ‘U’, ‘L’, ‘T’, 0, ‘L’, ‘I’],
[0, 0, 0, 0, 0, 0, 0, 0, ‘A’, ‘N’],
[0, 0, 0, 0, 0, 0, 0, 0, ‘S’, ‘G’],
[0, 0, ‘P’, ‘U’, ‘B’, ‘L’, ‘I’, ‘S’, ‘H’, ‘S’],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
|
Вывод
Создайте свой собственный алфавитный суп, используя массив карт выше.
Надеюсь, вам понравился этот урок, спасибо за чтение!





