Статьи

Создайте флеш-игру Wordparch «Суп из алфавита»

Сегодня я покажу вам, как создать простой поиск слов с удобным интерфейсом «подсветки», который легко изменить с помощью ваших собственных слов и макета. Мы будем использовать Flash и AS3. Читай дальше!


Давайте посмотрим на конечный результат, к которому мы будем стремиться:


В этом уроке мы будем использовать серию классов ActionScript, чтобы создать классическую игру для поиска по алфавиту. Цель игры состоит в том, чтобы выделить буквы, чтобы сформировать слово. Вы сможете создать свой собственный алфавитный суп и добавить свои слова.


Откройте Flash и создайте документ размером 320×480 пикселей. Установите частоту кадров 24 к / с.


Будет использован простой оранжевый интерфейс с несколькими фигурами, кнопками и мувиклипами; перейдите к следующим шагам для создания этого графического интерфейса.


Этот фон был создан во Flash с использованием простых прямоугольных форм. Шестнадцатеричный цвет для апельсина — # EE923F.



Чтобы создать заголовок, сначала выберите инструмент «Текст» (T), измените цвет на #EEEEEE и напишите текст заголовка. Затем дублируйте текстовое поле (Cmd + D), измените цвет на # C97B35 и отправьте новое текстовое поле назад, чтобы создать эффект высокой печати.


Снова используйте Text Tool, чтобы создать две кнопки, как показано на рисунке выше. Преобразуйте их в кнопки и дайте им описательные имена экземпляров, чтобы потом их было легче использовать в коде. Преобразуйте поэтапную графику в один мувиклип и назовите его TitleView — не забудьте установить флажок « Экспорт для ActionScript» .



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



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



Когда будут найдены все слова, будет отображено предупреждение, в котором будет отображаться сообщение об игре и инструкции. Используйте Rectangle Tool, чтобы создать его и установить имя его экземпляра в AlertView . Снова отметьте поле « Экспорт для ActionScript» .


Мы будем использовать звуковые эффекты, чтобы улучшить ощущение игры. Вы можете найти звук, используемый в этом примере на Soungle.com, используя ключевое слово bell .


Мы будем использовать другой движок анимации движения, отличающийся от встроенного во флэш-память по умолчанию, это повысит производительность, а также упростит его использование.

Вы можете скачать TweenNano с официального сайта .



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



Создайте новый (Cmd + N) класс ActionScript 3.0 и сохраните его как Main.as в папке вашего класса. Это будет класс документа.


Создайте базовую структуру классов, чтобы начать писать код.

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
        }
    }
}

Это классы, которые нам нужно импортировать, чтобы наш класс работал. Директива 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;

Эти переменные мы будем использовать; Прочитайте комментарии в коде, чтобы узнать о них больше. Некоторые из их имен говорят сами за себя, поэтому там не будет никаких комментариев.

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;

Конструктор — это функция, которая запускается при создании объекта из класса, этот код выполняется первым при создании экземпляра объекта или запускается при загрузке FLA, если он является частью класса документа .

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

1
2
3
4
public final function Main():void
{
    //Code
}

Мы начнем с добавления TitleView из библиотеки на сцену.

1
addChild(titleView);

Это добавит слушателей мыши к кнопкам в представлении заголовка, что приведет нас к экрану игры или кредитов.

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);
    }
}

Экран « Кредиты» отображается, когда пользователь нажимает кнопку «Кредиты»; слушатель мыши добавляется в полный 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);
          }
         }
        );
}

Если щелкнуть экран « Кредиты», он вернется и будет удален со сцены.

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;
          }
         }
        );
}

Следующие строки убирают титульный экран и оставляют экран игры видимым. Он также вызывает необходимые функции для запуска игры — мы добавим эти функции на следующих шагах.

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 включены в исходную загрузку , поэтому, если по какой-то причине ваш файл не имитирует этот, посмотрите на источник, чтобы понять, что может быть причиной этого.


Эта функция добавляет слушателей мыши, необходимых для рисования линии, которая будет выделять буквы.

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);
    }
}

Одна из самых важных функций в игре. Он будет создавать и позиционировать персонажей для построения алфавитного супа. Мы закодируем его поведение в течение следующих нескольких шагов.

1
2
3
4
private final function buildSoup():void
{
    //Code…
}

Вложенные циклы 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)

Слова уже установлены в исходном массиве букв, поэтому следующий код изменит 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);
}

Это 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;

Чтобы правильно отобразить слова из массива, мы можем привести его к строке, но нам нужно удалить запятые, которые добавляются автоматически.

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() .


Линия выбора начнет рисоваться, когда пользователь нажимает на сцену; эта функция создает форму и добавляет слушателя, который следит за движением мыши.

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);
}

Следующий код рисует линию в направлении мыши.

1
2
3
4
private final function drawLine(e:MouseEvent):void
{
    line.graphics.lineTo(mouseX, mouseY);
}

Давайте остановимся здесь, чтобы сделать быстрый тест и убедиться, что наш игровой код работает:

Он рисует линию, но не останавливается. Мы разберемся с этим на следующем шаге.

Имейте в виду, что некоторые строки были закомментированы, так как некоторые функции еще не созданы.

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


Когда кнопка мыши нажата, метод рисования останавливается и запускается код для определения выделенных слов. Я объясню этот код в следующих шагах.

1
2
private final function detectLetters(e:MouseEvent):void
{

Чтобы обнаружить выделенные символы, мы создаем строковую переменную, в которой будут храниться текстовые поля, попавшие в строку выбора.

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;
    }
}

Затем мы сравниваем результат с каждым словом в предопределенном массиве; если слово найдено, звук воспроизводится, 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++;
    }
}

Этот код вызывает и оповещает, когда все слова найдены.

1
2
3
4
if(correct == L1.length)
{
    alert();
}

Эта функция останавливает игру и показывает сообщение об окончании игры, а также добавляет слушателя мыши для сброса игры при нажатии.

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() .


Следующая функция перезагрузит SWF, сбросив все переменные и методы и вернувшись к первому экрану.

1
2
3
4
private final function restart(e:MouseEvent):void
{
    navigateToURL(new URLRequest(stage.loaderInfo.url), ‘_level0’);
}

Теперь мы готовы протестировать нашу игру и посмотреть, все ли работает так, как ожидалось.


Вы можете изменить список слов, просто изменив эту строку в коде:

1
private const L1:Vector.<String> = new <String>[‘CLASS’, ‘PUBLISH’, ‘DEFAULT’, ‘SETTINGS’, ‘FLASH’];

Это только изменит список слов, которые должен обнаружить код; чтобы слова действительно появлялись в алфавитном супе, прочитайте следующий шаг.


Алфавитный суп создан на основе этого массива карты 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]];

Создайте свой собственный алфавитный суп, используя массив карт выше.

Надеюсь, вам понравился этот урок, спасибо за чтение!