Статьи

Как использовать класс документа во Flash

Мы вносим некоторые изменения в Activetuts +. Отныне наши учебники будут по возможности использовать код на основе классов вместо кода временной шкалы. Этот краткий совет объясняет, что вам нужно знать.


Я признаю это — иногда, кодирование полностью на временной шкале полезно. Это быстрый способ проверить эффект и самый простой способ синхронизировать действия с конкретными кадрами анимации.

Но для любого проекта, который больше полагается на код, чем на анимацию, существуют серьезные недостатки. Весь ваш ActionScript находится внутри файла FLA; Вы не можете разделить программирование между разными разработчиками, вам нужно скопировать и вставить код, если вы хотите использовать его повторно, и вы вынуждены использовать панель действий Flash.

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

(Одна из причин, по которой мы переключаемся на классы, состоит в том, чтобы облегчить разработчикам AS3, которые не используют Flash, следовать нашим учебным пособиям. Если вы один из них, я думаю, вы уже привыкли иметь дело с классами , но вы всегда можете прочитать этот краткий совет для повышения квалификации — просто проигнорируйте немного о Flash!)


Я уверен, что вы уже знаете, как это сделать. Откройте Flash и выберите « Файл»> «Создать … Flash-файл» (ActionScript 3.0) . Сохраните это где хотите. Я назвал свой Example.fla , но неважно, какое имя вы выберете.


Нажмите Файл> Создать … Файл ActionScript . Сохраните это как Main.as в той же папке, что и ваш FLA.

В этот файл мы собираемся поместить код, который приводит в действие сам FLA, но как Flash узнает, как его найти?


Вы можете иметь десятки AS-файлов в той же папке, что и FLA, поэтому Flash не захочет угадать, какой из них использовать. Мы должны будем сказать это.

Переключитесь на инструмент «Выделение» (ярлык: V), затем убедитесь, что ничего не выделено (нажмите Ctrl-Shift-A). Откройте панель «Свойства» (« Окно»> «Свойства»).

Если вы используете Flash CS3, это будет выглядеть так:

Flash CS3 Properties Panel

Введите Main в поле с надписью «Класс документа» — это соответствует имени вашего файла ActionScript за вычетом расширения «.as».

Если вы используете Flash CS4, это будет выглядеть так:

Flash CS4 Properties Panel

В этом случае вам необходимо ввести Main в поле с надписью «Class». По какой-то причине Adobe отбросила бит «Документ».


Вам не нужно хранить все ваши файлы в одном каталоге. Посмотрите эту скринкаст «Быстрый совет», если вы хотите знать, как двигаться дальше.


Откройте файл Main.as и вставьте следующий код:

01
02
03
04
05
06
07
08
09
10
11
package
{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public function Main()
        {
             
        }
    }
}

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

The package keyword tells Flash that all of the code between its curly braces is part of a single group.

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

The class keyword groups functions and variables together.

Написание класса Main также группирует код, но по-другому. Классы содержат функции и переменные; пакеты содержат классы и операторы импорта.

Примечание: вы должны дать вашему классу то же имя, что и файл AS: Main .

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

We want our class to extend the functionality of a regular MovieClip - hence, 'class Main extends MovieClip'.

Этот класс Main будет питать наш FLA. По умолчанию наш FLA — это мувиклип (он имеет временную шкалу).

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

(Иногда нам может не потребоваться выполнять анимацию на основной временной шкале сцены; в этом случае нам не нужно расширять MovieClip, а вместо этого мы можем просто расширить Sprite. Сам MovieClip расширяет Sprite, но добавляет дополнительные функции для анимации, как функция nextFrame () . Так что, если вы не уверены, стоит ли расширять MovieClip или Sprite, используйте MovieClip — это безопаснее!)

The 'import' line tells Flash where to find the actual MovieClip so that we can extend it.

MovieClip сам по себе класс.

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

Операторы импорта всегда идут внутри пакета и вне класса, вверху.

Every class contains a function with the same name as the class. The code inside it is run when an object of this type of class is created - in our case, when the SWF is loaded.

Каждый класс содержит функцию с тем же именем, что и класс. Это называется функцией конструктора .

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

Не волнуйтесь, если вы чувствуете, что еще не совсем поняли все это. Как только вы начнете использовать классы и писать свои собственные, все встанет на свои места.


Как я уже говорил на шаге 5, функция конструктора содержит самый первый код, который запускается при загрузке SWF. Итак, давайте добавим что-то, чтобы убедиться, что все работает:

01
02
03
04
05
06
07
08
09
10
11
package
{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public function Main()
        {
            trace( «Yep, it’s working» );
        }
    }
}

Линия 8 — единственная новая там. Проверьте свой SWF обычным способом (« Управление»> «Тестировать ролик» ). Если все хорошо, вы должны увидеть всплывающее окно «Да, это работает» на панели «Вывод». Если не…

  • Вы сохранили внесенные изменения в Main.as?
  • Установлен ли класс документов вашего FLA на Main ?
  • Вы определенно тестируете фильм Example.fla?

Если ни один из этих вопросов не помог, пожалуйста, оставьте комментарий.


Попробуйте заменить код Main.as следующим:

01
02
03
04
05
06
07
08
09
10
11
12
package
{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public function Main()
        {
            var greeting:String = «Hello»;
            trace( greeting );
        }
    }
}

Просто, правда? Мы только что создали новую переменную String внутри функции конструктора. Теперь давайте добавим новую функцию:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
package
{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public function Main()
        {
            var greeting:String = «Hello»;
            changeGreetingToFrench();
            trace( greeting );
        }
         
        public function changeGreetingToFrench():void
        {
            greeting = «Bonjour»;
        }
    }
}

Здесь есть несколько вещей, на которые стоит обратить внимание.

Во-первых, новая функция идет внутри класса, а после конструктора — по договоренности, конструктор является первой функцией в классе.

Во-вторых, новая функция является публичной ; при кодировании внутри класса (а не на временной шкале) рекомендуется помещать «public» (или «private» или «protected», но я оставлю их для другого поста) в начале строки, определяющей функцию , Это просто способ сообщить другим классам, могут ли они получить к нему доступ.

В-третьих, определение новой функции заканчивается : void . Это просто означает, что не возвращает значение. Функции конструктора не нуждаются в : void, потому что они не могут возвращать значение.

Если вы протестируете этот фильм, вы получите сообщение об ошибке:

Main.as, строка 15: 1120: доступ к неопределенному приветствию свойства.

Когда вы создаете переменную внутри функции, другие функции не могут получить к ней доступ. Если вы хотите, чтобы каждая функция в классе могла иметь доступ к переменной, вам нужно объявить ее внутри класса, но вне всех функций:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
package
{
    import flash.display.MovieClip;
    public class Main extends MovieClip
    {
        public var greeting:String = «Hello»;
         
        public function Main()
        {
            changeGreetingToFrench();
            trace( greeting );
        }
         
        public function changeGreetingToFrench():void
        {
            greeting = «Bonjour»;
        }
    }
}

Как и в случае с функциями, если вы объявляете переменную вне функции, вам нужно начинать ее с «public» (или «private» или «protected»). В отличие от функций, переменные должны быть определены над конструктором.

Протестируйте свой фильм сейчас, и вы, наконец, должны получить хорошее приветствие на французском языке. Как полезно!


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

Я действительно хочу убедиться, что все понимают, как использовать класс документа, поэтому, если что-то из этого было непонятно, пожалуйста, оставьте примечание в комментариях. Как только мы разберемся с путаницей, я отредактирую Быстрый совет, чтобы облегчить понимание следующему человеку. Благодарность 🙂