actionscript-3 flash actionscript ide

actionscript 3 - Funciones/trucos ocultos de desarrollo de Flash, lenguaje Flash(AS2/3) y Flash IDE



actionscript-3 (24)

ActionScript 2

Cada clase es una función y cada función es una clase ... AS2 se basa en prototipos ...

trace.prototype = { }; var f = trace; trace(new f());//will yield [object Object]

Accediendo a Function::prototype permite extender clases en tiempo de ejecución:

MovieClip.prototype.moo = function () { trace(this+" says ''moooooooo'' ..."); } _root.moo();//_level0 says ''moooooooo'' ...

Object::__proto__ ... le permite cambiar el prototipo de un objeto, que puede usarse para reclasificación en tiempo de ejecución:

var o = trace; o.__proto__ = []; trace(o.push("foo", "bar", "foobar"));//3 here trace(o.length);//also 3 trace(o[1]);//bar

en este ejemplo, la función de trace se reclasifica a Array ... bastante bien, ¿eh? :)

Function::apply y Function::call permiten aplicar cualquier función como método a cualquier objeto:

Array.prototype.push.apply(trace,[1,2,3]); trace(trace.length);//3 trace(Array.prototype.splice.call(trace, 1,1));//2 ... actually, this is [2] (the array containing 2)

utilizando los tres anteriores, la creación de instancias de una clase MyClass con parámetros param_1, ..., param_n se puede escribir como:

var instance = {}; instance.__proto__ = MyClass.prototype; MyClass.call(instance, param_1, ..., param_n);

una base de Function::push y Function::apply es que this es simplemente un argumento de función, que se pasa automáticamente ... como cualquier otro argumento de función, se puede escribir en ...

var f:Function = function () { this = []; this.push(1,2,3); trace(this);//1,2,3 this = _root; trace(this);//_level0 } f();

Object::__resolve ... configuración este método le permite reaccionar a las búsquedas en propiedades no definidas ... esto es divertido y útil para proxy, burla, composición, delegación, etc.

import mx.utils.Delegate; var jack:Carpenter = ... var jim:BlackSmith = ... ... var guys:Array = [jack, jim, ...] var o = { __resolve : function (name:String) { for (var i:Number = 0; i < guys.length; i++) { var guy = guys[i]; if (guy.hasOwnProperty(name)) { var ret = guy[name]; if (ret instanceof Function) { ret = Delegate.create(guy, return); } return return; } } return "sorry man, but nobody knows, what ''" + name + "'' means"; }); //some really imaginary stuff (i hope it makes the point): trace(o.saw);//[object Hammer] trace(o.anvil);//[object Anvil] trace(o.ventilator);//"sorry man, but nobody knows, what ''ventilator'' means" trace(o.makeSword());//[object Sword]

eso es todo por ahora ... hay muchísimo más ... la cuestión es que AS2 es un lenguaje emocionante, pero dolorosamente lento ... En comparación, el AS3 es aburrido, pero el aumento de velocidad es realmente genial ... .

saludos

back2dos

Chicos, estoy completamente sorprendido de que no haya una publicación de Flash Hidden Features todavía en la serie de Hidden Features que he estado rastreando desde hace un tiempo.

Hay un reciente AS3 / Flex one pero no es muy activo y no me refiero exactamente a AS3 cuando digo Flash aquí.

La serie Hidden Features es ideal para personas que son nuevas en un determinado idioma. Muestra las cuerdas y ciertos trucos valiosos, todo en un solo lugar. Creo que es una idea brillante. Incluso los expertos a veces encuentran trucos de los que nunca habían oído hablar.

Cuando comencé con Flash, me sorprendió el Flash IDE y los conceptos extraños de Flash, en comparación con otros lenguajes de programación.

Entonces, aquí van: ¿cuáles son algunas de las características ocultas de Flash como idioma (AS2 / 3) y el IDE de Flash ?

Que comience la fiesta.


Aquí hay otro gotcha:

Por defecto, las herramientas de Flash eliminan todas las etiquetas de metadatos que tengas. Muchos marcos dependen de estas etiquetas de metadatos. Lo que debe tener cuidado es que esto no solo se aplica al compilador, sino también al optimizador. Asegúrese de ejecutar tanto el compilador como el optimizador con la opción de etiqueta -keep-as3-metadata para mantener su etiqueta de metadatos allí.


Bueno, puede que esta no sea una función oculta, pero tal vez la gente haya olvidado que existen motores de interpolación externos que puede usar. Mi último favorito es Greensocks. Lo único en mi opinión que me ha faltado parece estar mejorando, el flujo de trabajo. No he probado v.11 todavía, pero definitivamente lo haré en mi próximo proyecto AS: http://blog.greensock.com/v11beta/


En Flash Professional, puede cambiar un símbolo de MovieClip a un Sprite redirigiendo su clase base de flash.display.MovieClip a flash.display.Sprite , y el color del icono de símbolo en la biblioteca cambiará de azul a verde.


Este paquete le proporcionará todos los DisplayObjects en DisplayObjectContainer estableciendo tipos de clase.

Nota: No contará los cuadros en MovieClips.

package { import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.utils.getQualifiedClassName; /** * * @author Cansın Şenalioğly @ [email protected] * */ //-------------------------------------- // Class description //-------------------------------------- /** * <p>Gets all DisplayObject types in DisplayObjectContainer.</p> * * @langversion 3.0 * @playerversion Flash 9.0.28.0 * @includeExample examples/ButtonExample.as * * @playerversion AIR 1.0 */ public class DisplayObjectFinder { /** * * * * <p>Gets all DisplayObject type in DisplayObjectContainer</p> * <b>Example:</b><br> * <p>var items:Array = DisplayObjectFinder.getAllDOTypeInDOC(stage,MovieClip,callBack);<br> * trace(items.length);<br> * function callBack(object:MovieClip):void{ trace(object.name) };</p> * * @param container Objects parent (DisplayObjectCotainer); * @param typeClass Objects Class type; * @param forEach For every object call back function; * * @langversion 3.0 * @playerversion Flash 9.0.28.0 * * @playerversion AIR 1.0 */ public static function getAllDOTypeInDOC(container:DisplayObjectContainer,typeClass:Class,forEach:Function=null):Array { var a:Array = []; var len:int = container.numChildren; while(len--){ var o:DisplayObject = container.getChildAt(len); if(flash.utils.getQualifiedClassName(o) == flash.utils.getQualifiedClassName(typeClass)){ a[a.length] = o; if(forEach != null) forEach(o); } if(o is DisplayObjectContainer){ var aa:Array = getAllDOTypeInDOC(o as DisplayObjectContainer,typeClass,forEach); var lena:int = aa.length; while(lena--){ a[a.length] = aa[lena]; } } } return a; } } }


Esto es algo que la mayoría de la gente no sabe: los eventos del ratón se rastrean fuera de la ventana de la aplicación si el evento MOUSE_DOWN se ha activado, pero no MOUSE_UP. Puede tomar posiciones del mouse fuera de la ventana de la aplicación (e incluso fuera de la ventana del navegador) siempre que lo que esté haciendo haga que el usuario mantenga presionado el mouse. Para probar esto, intente ejecutar el siguiente código:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="init()"> <fx:Script> <![CDATA[ protected function init():void { addEventListener(Event.ADDED_TO_STAGE, magic) } protected function magic(e:Event):void { stage.addEventListener(MouseEvent.MOUSE_MOVE, moreMagic); } protected function moreMagic(e:MouseEvent):void { magicalButton.label = "Hold me down! " + String(e.stageX) + "x" + String(e.stageY); } ]]> </fx:Script> <s:Button id="magicalButton" label="Hold me down!"/>



Los metadatos personalizados no son algo que esté bien documentado o promovido, pero es muy útil; sin modificar una variable o cambiar su espacio de nombres, puede darle anotaciones personalizadas de la misma forma que en Java.

Es revisado en profundidad por Christophe Conraets en su blog .

La simplicidad de esto es que puedes poner todos tus propios metadatos, y luego solo usas describeType() y verás todos tus metadatos personalizados en el tiempo de ejecución :)


No está realmente oculto (muy oculto en la documentación), pero updateAfterEvent es un método bastante desconocido y útil en ciertas circunstancias ...


No exactamente oculto, pero ¿qué pasa con la macro "include" que se pasa por alto a menudo (sí, todavía existe en as3)? - muy útil para falsificar la herencia múltiple (cuando se usa lado a lado con una interfaz), incluso si por lo general es una mala práctica.


Para aquellos de ustedes que usan FlashDevelop, hay alguna funcionalidad de compilación condicional ingeniosa:

// Use it to generate different code paths CONFIG::debug { txt.text = "Debug Version running..."; } CONFIG::release { txt.text = "Welcome to Stark Industries"; } // Or use it as a const in code if ( CONFIG::debug && yourCondition ) { // Do stuff }

lea más sobre esto here



[AS3]

Al buscar el valor de una variable, el jugador ejecutará la cadena de alcance hasta que encuentre lo que está buscando. Entonces, al usar funciones anidadas (anónimas), hace cosas como hacer llamadas asíncronas y manejarlas usando variables que se definieron en el alcance del método de llamada. p.ej

function loadData(myAwesomeObject : AwesomeObject) : void { var urlLoader : URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, function(event : Event) : void { myAwesomeObject.someReallyAwesomeMethod(event.target); }); urlLoader.load(new URLRequest("http://someService")); }

Un montón de otros usos para esto y es realmente muy útil.


[AS3]

Cuando usa la declaración de rastreo en AS3, puede pasar múltiples parámetros y AS3 formateará la salida para que haya un espacio entre cada uno.

trace("Hello","World");

saldría "Hello World".

AS2 no admite varios parámetros para el seguimiento, por lo que se ve obligado a hacer algo como

trace("Hello "+"World");


[AS3]

El || El operador (lógico o) se puede utilizar para cualquier valor de verdad / falso.

var obj : Object = nullObject || instance; // instance var val : int = 5 || 10; // 5 var val : int = 0 || 10; // 10

Además, puede utilizar & y | (a nivel de bit y / o) para hacer una expresión que no sea de corta circulación:

function functionA() { return false; } function functionB() { return true; } if (functionA() && functionB()) { trace("something"); } // methodB won''t be executed if (functionA() & functionB()) { trace("something"); } // methodB WILL be executed


[AS3]

No necesariamente llamaría a esto una ''característica'', pero puedes acceder a las variables antes de que se definan (incluso con una compilación estricta) debido a la forma en que funciona el compilador:

trace(hb); // null var hb : HBox = new HBox; trace(hb); // [object]

En realidad, puede provocar frustración al refactorizar el código (ya que se compila).


[AS3]

var list : Vector.<Object> = new Vector.<Object>();

se vuelve un poco más corto por escrito

var list : Vector.<Object> = new <Object>[];

Incluso puedes predefinir los valores:

var list : Vector.<Object> = new <Object>["one", "two", "three"];


[AS3] Consejos para trabajar con matrices o vectores

El camino más rápido a través de una matriz, siempre desde la parte posterior.

var i:int = array.length; var item:Object; while(i--) { item = array[i]; }

Borrar una matriz,

//faster than array = [] array.length = 0; //garbage friendly while(array.length) { array.pop(); }

Empujando y empalmando

//faster than array.push(); array[array.length] = "pushed value"; //faster than splice(index, 1) var index:int = array.indexOf(splicee); array[index] = null; array.splice(array.length, 1);

Clonación

//fastest way to clone var newArray:Array = array.concat(); //fastest manipulation var mapFunction:Function = function(item:Object, index:int, source:Array):Object { return //your cloning or morphing here } var newArray:Array = array.map(mapFunction);


[Flash IDE]

Cuando exporta un clip de película como un swc, puede agregarlo al panel de componentes al colocarlo en la carpeta

C: / Documents and Settings / USER_NAME / Configuración local / Application Data / Adobe / Flash CS3 / en / Configuration / Components / SOME_COMPONENT_FOLDER

Reinicia el flash y estará en el panel de componentes para que lo uses.


[Flash IDE]

Esto no es una característica tanto como es un gotcha. Al especificar una clase de documento para un FLA, el compilador no subclase esa clase, la modifica .

Esto puede causar problemas cuando tiene varios SWF con la misma clase de documento, todos se cargan en otro SWF (ya que dos clases con el mismo nombre no se pueden cargar de lado a lado en el mismo dominio de aplicación). El resultado es que la primera se carga y la segunda usa la clase modificada de la primera, lo que produce errores extraños (como puedes imaginar).

La solución es:

  • Cree una clase de proxy para cada FLA que subclasifique la clase de documento
  • Cargue cada SWF en un nuevo dominio de aplicación secundario

[as3]

herencia basada prototipo

import flash.display.MovieClip; var myRectangle = function(target,x,y){ var internalTarget = target; var myMovieClip = new MovieClip(); var myGraphic = myMovieClip.graphics; myGraphic.beginFill(0xAAAAAA); myGraphic.drawRect(0,0,100,100); myGraphic.endFill(); trace(typeof internalTarget); Sprite(internalTarget).addChild(myMovieClip); myMovieClip.x = x ; myMovieClip.y = y ; } var aRectangle = new myRectangle(this,10,10);


al usar flashvars escriba un método de utilidad getFlashVars ().

function getFlashVars():Object { return Object(LoaderInfo(this.loaderInfo).parameters);

}

entonces cuando estoy codificando siempre agrego un extra || para que no tenga que flashvars durante la depuración.

localVar = getFlashVars().sampleVar || "default.xml";


MovieClip.addFrameScript () es una función de ActionScript 3.0 no documentada que le permite especificar una función a la que se llama cuando la cabeza de reproducción de la línea de tiempo de Movieclip ingresa un número de fotograma en particular.

function someFunction():void { } movieclip_mc.addFrameScript(4,someFunction);

El número de fotograma está basado en cero (1er fotograma = 0) y solo deben ser números enteros; sin embargo, si desea usar etiquetas de fotograma , puede usar algo como esto:

function addFrameLabelScript(frame:String, func:Function):void{ var labels:Array = currentLabels; for(var i:int=0;i<labels.length;i++){ if(labels[i].name == frame){ addFrameScript(labels[i].frame-1,func); } } }


Graphics::drawRoundRectComplex (x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number) : void;

No está documentado en ninguna parte, pero una publicación en el foro explica más .