Беларусь, рогачёв |
Клипы и ролики. Специальные возможности языка
В этой лекции мы познакомимся со способами создания клипов. Клип - это, в простейшем случае, специальный объект, содержащий анимацию, которую можно проиграть. Создаются такие клипы с помощью среды Flash MX. В более сложном случае клипы могут содержать в себе другие клипы, а также могут быть созданы программно. Следует отличать клипы от флэш-роликов, под которыми мы будем понимать готовый анимационный "фильм", возможно, состоящий из многих клипов, и откомпилированный в файл *.swf. Оказывается, существует возможность такой ролик загрузить прямо внутрь вашего ролика и проиграть его там. В этой лекции мы научимся создавать простейшие клипы и подгружать ролики, а также начнем изучать специальные средства языка ActionScript, предназначенные для работы с клипами. Также мы изучим некоторые особенности ActionScript, связанные с тем, что он является интерпретируемым языком.
Доступ к переменной или клипу по имени. Операторы eval и set
Хотя программы, транслируемые интерпретатором, как правило, проигрывают откомпилированным программам в скорости, они имеют и ряд преимуществ. В частности, иногда очень удобно в момент трансляции иметь информацию времени выполнения. Часто это помогает при взаимодействии с внешними по отношению к ActionScript объектами Флэш (такими, как экземпляры клипов ). И более того, в следующих лекциях мы увидим нечто похожее на указатели на функции и множественное наследование - то, чего многим не хватает в языке Java.
В первую очередь, информация времени выполнения позволяет нам обратиться по имени (которое неизвестно на момент компиляции) к какому-либо объекту (это может быть экземпляр клипа, созданный "руками", а может быть и переменная ).
Обращение к переменной
Документированный способ
Чтобы обратиться к переменной, имя которой является значением выражения типа String, можно воспользоваться оператором eval . Синтаксис обращения к этому оператору совпадает с синтаксисом вызова функции с одним аргументом (более того, в References вы найдете eval в разделе встроенных функций, хотя по смыслу производимых действий это, конечно же, оператор). Итак, запись
a1 = 10; i = 0; trace(eval("a1")); trace(eval("a" + ++i));
дважды выводит в консоль десятку. Отсюда видно, что в качестве аргумента eval можно использовать любое выражение: оно будет интерпретировано как строка, и eval выдаст значение переменной с соответствующим именем. Если такой переменной нет, то будет возвращено, разумеется, undefined.
Недокументированный, но удобный способ
Тех же самых результатов мы могли добиться и с помощью следующего кода:
a1 = 10; i = 0; trace(this["a1"]); trace(this["a" + ++i]);
То есть доступиться к полю b объекта а можно при помощи конструкции a["b"]. Это очень напоминает работу с массивом; об этой аналогии мы подробнее поговорим в главе, посвященной контейнерам. А пока укажем на то, что данная возможность, вообще-то, является недокументированной. Обычно недокументированными возможностями следует пользоваться с осторожностью - в следующих версиях продукта они могут бесследно исчезнуть. Впрочем, описанное только что использование квадратных скобок настолько удобно и широко распространено, что вряд ли им в будущем что-либо грозит. (Например, во Flash MX 2004 они тоже работают.)