versiones - Componentes AS3 en Flash Designer
versiones de adobe animate (8)
No he usado esta funcionalidad específica, pero es probable que deba definir una clase personalizada para ese MovieClip (solo la subclase MovieClip) y agregar esa variable adicional. Actionscript 3 se ha alejado de la naturaleza dinámica de actionscript 2, esto puede ser un poco confuso para empezar, pero al final es mucho más robusto.
En un proyecto de ActionScript 2, puedo crear un nuevo MovieClip, hacer clic con el botón derecho en la biblioteca y seleccionar "Definición de componente" para agregar parámetros a los que se puede hacer referencia dentro de MovieClip. Estos parámetros se pueden cambiar fácilmente en las propiedades de MovieClips.
Ahora, estoy trabajando en un proyecto de ActionScript 3 pero no he podido encontrar la forma de obtener los valores pasados en esos parámetros.
Definí un parámetro llamado "textToDisplay" pero cuando escribo lo siguiente en las Acciones para el primer fotograma aparece un error:
trace(textToDisplay);
Este es el error:
1120: Access of undefined property textToDisplay.
¿Sabes cómo capturar el valor de ese parámetro?
Gracias
PD: estoy usando Adobe Flash CS3 Professional en Windows XP
En as3 tienes que crear un archivo de clase externo con una o más declaraciones de public var
que usarás (también puedes usar las funciones públicas get
/ set
). Google esto si no estás seguro de cómo.
En su archivo externo, use la etiqueta de metadatos [Inspectable]
justo antes de su var
, así:
package myPackage {
import flash.display.MovieClip;
public class MyComponent extends MovieClip {
[Inspectable]
public var myFancyComponentParameter:String;
[Inspectable]
public var myOtherFancyComponentParameter:int;
}
}
Luego puede abrir el cuadro de diálogo Definición de componente, establecer el campo Clase para el nombre de su clase externa (incluido el nombre del paquete) y Flash creará automáticamente parámetros para su componente en función de sus etiquetas [Inspectable]
. O puede crearlos manualmente.
Una vez que haya configurado esto, puede acceder a los componentes vars en el código de la línea de tiempo:
trace("Here''s my var: " + myFancyComponentParameter);
Los detalles sobre la etiqueta [Inspectable]
(incluidos los tipos de datos) están disponibles en los livedocs de metadatos .
También es una buena idea establecer el nombre de la clase en el diálogo Vinculación también, si desea que su clase externa haga otra cosa que no sea mantener los valores de los componentes.
También recomendaría poner código en su clase externa, en lugar de en la línea de tiempo. Es más extensible de esa manera. Si hace esto, recuerde que los parámetros de sus componentes no se establecen hasta después de que se active el evento INIT
. He aquí cómo escuchar eso:
// 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
}
}
No veo un evento INIT en la definición de la clase MovieClip y parece que no se llama.
Tuve el mismo problema: no hay evento INIT para un MovieClip, pero de lo contrario, esta solución funciona bien. La única forma en que pude ver para evitar esto es usar Event.ENTER_FRAME y eliminar el oyente nuevamente la primera vez que se llama al controlador. Mis parámetros de componentes fueron accesibles desde el siguiente cuadro en adelante, pero me parece sorprendente que no exista ningún evento oficial cuando se crea una instancia de un clip de película.
Hay un evento ADDED_TO_STAGE que funcionaría mejor que el evento ENTER_FRAME que sugirió steve-mann.
Teniendo en cuenta lo difícil que es encontrar información sobre la configuración de componentes personalizados, pensé que aclararía algunos aspectos del proceso en función de lo que he experimentado.
EVENTO INIT:
En su mayor parte, el ejemplo anterior de aaaidan es correcto con una excepción.
addEventListener(Event.INIT, onInit);
debiera ser:
loaderInfo.addEventListener(Event.INIT, onInit);
la propiedad loaderInfo de un objeto DisplayObject refrences un LoaderInfo del cual tu componente obtiene su configuración de parámetros. se llama al evento INIT cuando obtiene sus datos (alternativamente puede usar el evento COMPLETE, que debe disparar directamente después de INIT)
METADATOS INSPECCIONABLES:
cuando se accede a las propiedades de configuración mediante la etiqueta de metadatos [Inspectable], también puede definir valores predeterminados usando:
[Inspectable(defaultValue="whatevervalue")]
por lo que tengo experiencia, los parámetros parecen tener problemas para manejar cualquier cosa que no sea una cadena (y tal vez números), así que sugeriría usar funciones de conjunto que tomen valores de cadena y los utilicen para obtener los otros valores que desee. por ejemplo, si desea cargar una nueva instancia de una clase específica nombrada
[Inspectable(defaultValue="flash.display.Sprite")]
public function set className(value:String):void{
var ClassReference:Class = getDefinitionByName(value) as Class;
_class = new ClassReference();
}
en este ejemplo, si el parámetro está configurado en "flash.display.Sprite", al llamar "new _class () se creará una nueva instancia de Sprite.
FUNCIÓN SETSIZE:
Si desea que su componente personalizado cambie el tamaño de una forma distinta a la de simplemente estirar los valores de alto y ancho, necesita una función pública de ajuste de tamaño. se llamará a esta función cada vez que cambie el tamaño de su componente en flash.
public function setSize(w:Number, h:Number):void{
_menuWidth = w;
_menuHeight = h;
}
ahora esto funciona muy bien cuando cambias el tamaño del componente en flash, pero una vez que realmente publicas tu archivo swf notarás que cambia a ancho y alto de estiramiento en lugar de utilizar tu función setSize (no sé por qué, pero eso es lo que hace). para solucionar esto, en su función onInit necesita tomar el ancho y el alto, alimentarlos a su setSize y luego restablecer los valores scaleX y scaleY a 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
}
(si alguien encuentra una forma menos complicada de hacer esto, hágale saber)
Espero que esto ayude a alguien a obtener sus componentes personalizados y ejecutarlos.
En la versión CS4 10.0.2, puede hacer clic con el botón derecho y agregar parámetros de componentes manualmente nuevamente.
Dos cosas a tener en cuenta:
- Todavía tendrá que esperar loaderInfo Event.INIT antes de poder hacer referencia a los valores personalizados (es decir: loaderInfo.addEventListener (Event.INIT, initComponent)
- Tendrá que definir el parámetro en el 1er cuadro (var paramName) para poder hacer referencia a él sin un error del compilador.
Espero que esto te ayude ... ¡Sé que me ayudó!
~ Greg
Finalmente lo puso en funcionamiento (utilizando MovieClips básicos sin muchas extensiones hasta el momento). Tengo dos bits para agregar:
- El símbolo debe exportarse para ActionScript (es decir, tener una definición de enlace ). Establecer la Clase solo en la Definición del Componente no funcionará. Sin la configuración de exportación, la etiqueta
[Inspectable]
se interpreta, pero el resto del código se ignora por completo. Incluso cosas en el constructor de la clase. - El valor predeterminado en la etiqueta
[Inspectable]
no parece funcionar cuando se compila, o más bien dará como resultadonull
. Solo estaba usando una Cadena que ESTÁ en el cuadro de Parámetros de Componente, pero rastreanull
. Incluso después deEvent.INIT
(estoy rastreando al hacer clic). No parece ser un caso de "valor no transferido", ya que ingresar el valor predeterminado de forma manual dará como resultadonull
. Establecer un valor predeterminado en[Inspectable]
define efectivamente un valor que no se puede usar.
PS usando CS5.