Компоненты AS3 в Flash Designer

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

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

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

trace(textToDisplay);

Это ошибка:

1120: Access of undefined property textToDisplay.

Вы знаете, как определить значение этого параметра?

Спасибо

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

[UX] Категории и настройки внешнего вида Flash-сообщений
[UX] Категории и настройки внешнего вида Flash-сообщений
Flash-сообщение - это обычный веб-элемент, используемый для отправки короткого сообщения пользователю. Например, на странице входа в систему может...
2
0
10 145
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Ответ принят как подходящий

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

Во внешнем файле используйте тег метаданных [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.

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

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

}

Event.INIT, отправленный объектом loaderInfo

Pup 05.04.2011 22:45

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

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

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

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

НАЧАЛЬНОЕ СОБЫТИЕ:

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

addEventListener(Event.INIT, onInit);

должно быть:

loaderInfo.addEventListener(Event.INIT, onInit);

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

ИНСПЕКЦИОННЫЕ МЕТАДАННЫЕ:

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

 [Inspectable(defaultValue = "whatevervalue")]

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

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

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
}

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

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

боже, спасибо за совет по добавлению INIT в loaderInfo ... я почти все волосы вырвал

dizy 13.05.2009 21:04

Даже.ADDED_TO_STAGE впервые появился у меня с моими экземплярами на сцене, поэтому я вместо этого прислушался к этому.

Pup 22.11.2011 00:15

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

Два момента на заметку:

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

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

~ Грег

Наконец-то он заработал (пока используются базовые MovieClips без особых расширений). Мне нужно добавить два бита:

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

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

Другие вопросы по теме