Компоненты AS3 во Flash Designer - PullRequest
2 голосов
/ 27 ноября 2008

В проекте ActionScript 2 я могу создать новый MovieClip, щелкнуть его правой кнопкой мыши в библиотеке и выбрать «Определение компонента», чтобы добавить параметры, на которые можно ссылаться внутри MovieClip. Эти параметры могут быть легко изменены в свойствах MovieClips.

Сейчас я работаю над проектом ActionScript 3, но не смог найти способ получения значений, переданных в этих параметрах.

Я определил параметр с именем "textToDisplay", но когда я пишу следующее в Действия для первого кадра, я получаю ошибку:

trace(textToDisplay);

Это ошибка:

1120: Access of undefined property textToDisplay.

Знаете ли вы, как зафиксировать значение этого параметра?

Спасибо

PS: я использую Adobe Flash CS3 Professional в Windows XP

Ответы [ 8 ]

4 голосов
/ 02 апреля 2009

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

INIT EVENT:

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

addEventListener(Event.INIT, onInit);

должно быть:

loaderInfo.addEventListener(Event.INIT, onInit);

свойство loaderInfo объекта DisplayObject ссылается на LoaderInfo, из которого ваш компонент получает настройки параметров. событие INIT вызывается, когда оно получает свои данные (альтернативно вы можете использовать событие COMPLETE, которое должно запускаться сразу после INIT)

ПРОВЕРЕННЫЕ МЕТАДАТЫ:

когда вы устанавливаете свойства для доступа к ним с помощью тега метаданных [Inspectable], вы также можете определить значения по умолчанию, используя:

 [Inspectable(defaultValue="whatevervalue")]

Судя по моему опыту, параметры имеют проблемы с чем-то, кроме String (и, возможно, Numbers), поэтому я бы предложил использовать функции set, которые принимают строковые значения и используют их для получения других значений, которые вы можете захотеть. например, если вы хотите загрузить новый экземпляр определенного именованного класса

 [Inspectable(defaultValue="flash.display.Sprite")]
public function set className(value:String):void{
       var ClassReference:Class = getDefinitionByName(value) as Class;
       _class = new ClassReference();
}

в этом примере, если для параметра установлено значение «flash.display.Sprite», вызывающее «new», _class () создаст новый экземпляр Sprite.

ФУНКЦИЯ SETSIZE:

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

public function setSize(w:Number, h:Number):void{
   _menuWidth = w;
   _menuHeight = h;
}

теперь это прекрасно работает, когда вы изменяете размер компонента во флэш-памяти, но как только вы действительно опубликуете свой SWF-файл, вы заметите, что он переключается обратно на растяжение по ширине и высоте, а не с помощью функции setSize (я не знаю почему, но это то, что он делает ). чтобы исправить это, в вашей функции onInit вам нужно взять ширину и высоту, передать их в ваш setSize, а затем сбросить значения scaleX и scaleY обратно в 1:

public function onInit(e:Event):void{
   setSize(width,height);
   scaleX = 1;
   scaleY = 1;
   //add other functions that need to be run once the parameters are loaded
}

(если кто-нибудь найдет менее грязный способ сделать это, сообщите)

надеюсь, что это поможет кому-то настроить и запустить свои пользовательские компоненты.

2 голосов
/ 04 декабря 2010

Наконец-то все заработало (используя базовые мувиклипы без особых расширений). У меня есть два бита, чтобы добавить:

  1. Символ должен быть экспортирован для ActionScript (т. Е. Иметь определение связь ). Установка класса только в определении компонента не подойдет. Без настройки экспорта тег [Inspectable] интерпретируется, но остальная часть кода полностью игнорируется. Четные вещи в конструкторе класса.
  2. Значение по умолчанию в теге [Inspectable], по-видимому, не работает при компиляции, или скорее оно приведет к null. Я использовал только строку, которая есть в поле «Параметры компонента», но отслеживает null. Даже после Event.INIT (я отслеживаю по клику). Похоже, это не случай «значение не перенесено», так как ввод значения по умолчанию вручную все равно приведет к null. Установка значения по умолчанию в [Inspectable] эффективно определяет значение, которое нельзя использовать.

P.S. используя CS5.

1 голос
/ 01 декабря 2008

В as3 вы должны создать внешний файл класса с одним или несколькими объявлениями public var, которые вы будете использовать (вы также можете использовать публичные функции get / set). Google это, если вы не уверены, как.

Во внешнем файле используйте тег метаданных [Inspectable] непосредственно перед var, например:

package myPackage {
  import flash.display.MovieClip;

  public class MyComponent extends MovieClip {

    [Inspectable]
    public var myFancyComponentParameter:String;

    [Inspectable]
    public var myOtherFancyComponentParameter:int;

  }

}

Затем вы можете открыть диалоговое окно «Определение компонента», установить в поле «Класс» имя вашего внешнего класса (включая имя пакета), и Flash автоматически создаст параметры для вашего компонента на основе ваших тегов [Inspectable]. Или вы можете создать их вручную.

После настройки вы можете получить доступ к компонентам в коде временной шкалы:

trace("Here's my var: " + myFancyComponentParameter);

Подробная информация о теге [Inspectable] (включая типы данных) доступна в метаданных liveocs *1019*.

Также неплохо установить имя класса в диалоговом окне «Связывание», если вы хотите, чтобы ваш внешний класс делал что-то кроме удержания значений компонентов.

Я бы также рекомендовал помещать код в ваш внешний класс, а не во временную шкалу. Это более расширяемый способ. Если вы сделаете это, просто помните, что параметры вашего компонента не устанавливаются до тех пор, пока не сработает событие INIT. Вот как это послушать:

// package and import statements omitted for brevity
public class MyComponent extends MovieClip {

  [Inspectable]
  public var myFancyComponentParameter:String;

  public function MyComponent() {
    // myFancyComponentParameter not set here yet
    trace(myFancyComponentParameter); // prints null
    addEventListener(Event.INIT, onInit);
  }

  public function onInit(e:Event) {
    // now we can use component parameters!
    trace(myFancyComponentParameter); // prints the param value
  }

}
0 голосов
/ 21 мая 2009

В выпуске CS4 10.0.2 вы можете снова щелкнуть правой кнопкой мыши и добавить параметры компонента вручную.

Две вещи на заметку:

  1. Вам все еще нужно будет ждать loaderInfo Event.INIT, прежде чем вы сможете ссылаться на пользовательские значения (например, loaderInfo.addEventListener (Event.INIT, initComponent)
  2. Вам потребуется определить параметр в 1-м кадре (var paramName), чтобы иметь возможность ссылаться на него без ошибки компилятора.

Надеюсь, это поможет вам ... Я знаю, это помогло мне!

~ Greg

0 голосов
/ 16 марта 2009

Существует событие ADDED_TO_STAGE, которое будет работать лучше, чем событие ENTER_FRAME, которое предложил Стив-Манн.

0 голосов
/ 11 марта 2009

У меня была та же проблема - нет события INIT для MovieClip - но в остальном это решение работает нормально. Единственный способ обойти это - использовать Event.ENTER_FRAME и снова удалить слушателя при первом вызове обработчика. Параметры моего компонента были доступны начиная со следующего кадра, но я нахожу удивительным, что при создании экземпляра мувиклипа не существует официального события.

0 голосов
/ 21 февраля 2009

Я не вижу события INIT в определении класса MovieClip, и, похоже, оно не вызывается.

0 голосов
/ 27 ноября 2008

Я не использовал эту конкретную функциональность, но, вероятно, вам нужно будет определить собственный класс для этого MovieClip (просто подкласс MovieClip) и добавить эту дополнительную переменную. Actionscript 3 отошел от динамической природы ActionScript 2, с самого начала это может быть немного запутанным, но в конце концов он становится намного более надежным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...