三行代码  ›  专栏  ›  技术社区  ›  Community wiki

Flash开发、Flash语言(AS2/3)和Flash IDE的隐藏功能/窍门[关闭]

  •  17
  • Community wiki  · 技术社区  · 3 月前

    伙计们,我很惊讶没有Flash 隐藏的功能 张贴在 Hidden Features series 我已经追踪了一段时间。

    最近 AS3/Flex one 但它不是很活跃,我在这里说Flash并不是指AS3。

    隐藏功能系列非常适合刚接触某种语言的人。它在一个地方展示了绳索和一些有价值的技巧。我认为这是个绝妙的主意。即使是专家有时也会发现他们从未听说过的把戏。

    当我开始使用Flash时,与其他编程语言相比,Flash IDE和Flash的奇怪概念让我大吃一惊。

    那么,下面是: 隐藏功能 属于 闪光 作为 语言(AS2/3) 以及 Flash IDE ?

    让乐趣开始吧。

    23 回复  |  直到 6 年前
        1
  •  7
  •   Richard Szalay    14 年前

    [AS3]使用数组或矢量的提示

    阵列中最快的方式,总是从后面

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

    清除阵列,

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

    推动和拼接

    //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);
    

    克隆

    //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);
    
        2
  •  11
  •   enzuguri    14 年前

    MovieClip.addFrameScript() 是一个未记录的ActionScript 3.0功能,它允许您指定一个函数,该函数在电影剪辑时间线的播放头输入特定帧号时调用。

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

    帧数是从零开始的(第一帧=0),并且只需要是整数,但是如果您想使用 框架标签 你可以用这样的东西:

    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);
            }
        }
    } 
    
        3
  •  8
  •   Shrill    14 年前

    [Flash IDE]

    这不是一个功能,而是一个陷阱。当为FLA指定文档类时,编译器不会对该类进行子类化,而是 修改

    当您有多个具有相同文档类的SWF,并且所有SWF都加载到另一个SWF中时,这可能会导致问题(因为具有相同名称的两个类不能并排加载到同一应用程序域中)。它导致第一个被加载,第二个使用第一个修改后的类,产生奇怪的错误(正如你所能想象的)。

    解决方案是:

    • 为每个FLA创建一个代理类,该类子类化文档类
    • 将每个SWF加载到一个新的子应用程序域中
        4
  •  5
  •   p.campbell    14 年前
    Graphics::drawRoundRectComplex (x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number) : void;
    

    任何地方都没有记录,但 forum post explains more

        5
  •  4
  •   Richard Szalay    14 年前

    [AS3]

    这个 || (逻辑或)运算符可用于任何真/假值。

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

    此外,您可以使用 & | (按位和/或)执行非短路表达式:

    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
    
        6
  •  3
  •   Allan    14 年前

    [AS3]

    当您在AS3中使用trace语句时,您可以传入多个参数,AS3将格式化输出,以便每个参数之间有一个空格。

    trace("Hello","World");
    

    将输出“Hello World”。

    AS2不支持跟踪的多个参数,因此您必须执行以下操作

    trace("Hello "+"World");
    
        7
  •  3
  •   Metallix    11 年前

    [AS3]

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

    通过书写变得略短

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

    您甚至可以预定义值:

    var list : Vector.<Object> = new <Object>["one", "two", "three"];
    
        8
  •  2
  •   back2dos    14 年前

    ActionScript 2

    每个类都是函数,每个函数都是类。。。AS2是基于原型的。。。

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

    访问 Function::prototype 允许在运行时扩展类:

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

    Object::__proto__ …允许您更改对象的原型,该原型可用于运行时重新分类:

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

    在本例中,函数 trace 被重新分类为数组。。。很酷,嗯?:)


    Function::apply Function::call 允许应用 任何 用作 任何 对象:

    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)
    

    使用上面三个,实例化一个类 MyClass 带参数 param_1, ..., param_n 可以写成:

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

    Function::push 功能::应用 是吗 this 只是一个函数参数,它是自动传递的。。。与任何其他函数自变量一样,它可以被写入。。。

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

    Object::__resolve …设置此方法允许您对未定义属性的查找做出反应。。。这对代理、嘲讽、构图、委派等都很有趣,也很有用。。。

    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]
    

    现在就这样。。。还有很多。。。问题很简单,AS2是一种正在退出的语言,但速度非常慢。。。相比之下,AS3非常无聊,但速度提升真的很棒。。。

    尔兹

    back2dos

        9
  •  2
  •   gmj    14 年前

    您可以创建 weak references in ActionScript3 通过使用Dictionary对象。

        10
  •  2
  •   Simon Forrest    13 年前

    [AS3]

    当寻找一个变量的值时,玩家会沿着作用域链向上运行,直到找到它要寻找的东西。因此,使用嵌套(匿名)函数可以进行异步调用等操作,并使用调用方法范围中定义的变量进行处理。例如。

    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"));
    
    }
    

    它有很多其他用途,真的很有用

        11
  •  2
  •   Max Dohme    12 年前

    对于那些使用FlashDevelop的人来说,有一些漂亮的条件编译功能:

    // 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
    }
    

    阅读更多信息 here

        12
  •  1
  •   Cay    14 年前

    它并没有真正隐藏起来(在文档中非常模糊),但是 updateAfterEvent 在某些情况下是一种未知且有用的方法。。。

        13
  •  1
  •   Richard Szalay    14 年前

    [AS3]

    我不一定称之为“功能”,但由于编译器的工作方式,您实际上可以在定义变量之前访问变量(即使是严格编译):

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

    当重构代码(因为它是编译的)时,它实际上会导致挫败感。

        14
  •  1
  •   James Hay    14 年前

    [Flash IDE]

    将MovieClip导出为swc时,可以将其放入文件夹中,将其添加到的组件面板中

    C: \Documents and Settings\USER_NAME\ Local Settings\Application Data\Adobe\Flash CS3\en\Configuration\COMPONENT\SOME_COMPONENT_FOLDER

    重新启动闪光灯,它将在组件面板中供您使用。

        15
  •  1
  •   amoeba    14 年前

    这可能不是一个隐藏的功能,但也许人们错过了你可以使用的外部推特引擎。我最近最喜欢的是Greensocks。 在我看来,它唯一缺少的似乎是改进,工作流程。 我还没有测试v.11,但肯定会在我的下一个AS项目中测试: http://blog.greensock.com/v11beta/

        16
  •  1
  •   bgw    14 年前

    不完全隐藏,但经常被忽视的“include”宏(是的,它仍然存在于as3中)呢?-对于伪造多重继承(与接口并行使用时)非常有用,即使这通常是一种糟糕的做法。

        17
  •  1
  •   zero juan    13 年前

    当使用flashvars时,编写一个实用程序方法getFlashVars()。

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

    }

    然后,当我进行编码时,我总是添加一个额外的||,这样在调试时就不必使用flashvars了。

    localVar = getFlashVars().sampleVar || "default.xml";
    
        18
  •  1
  •   Ismaelj    13 年前

    [as3]

    基于原型的继承:

    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);
    
        19
  •  1
  •   marvin    13 年前

    有一件事大多数人都不知道:如果触发了MOUSE_DOWN事件,但没有触发MOUSE_UP,则在应用程序窗口之外跟踪MouseEvents。您可以在应用程序窗口之外(甚至在浏览器窗口之外)获取鼠标位置 只要你所做的一切让用户按住鼠标。 若要对此进行测试,请尝试运行以下代码:

    <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!"/>
    

        20
  •  1
  •   Edward H    12 年前

    这个包将通过设置类类型来获得DisplayObjectContainer中的所有DisplayObjects。

    注意:它不会计算MovieClips中的帧数。

    package {
    
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.utils.getQualifiedClassName;
    
    /**
     * 
     * @author Cansın Şenalioğly @ cansin.senalioglu@gmail.com
     *   
     */ 
    
    //--------------------------------------
    //  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;
        }
    }
    }
    
        21
  •  1
  •   Sasha Chedygov    12 年前

    在Flash Professional中,您可以通过重定向MovieClip的基类将其更改为精灵 flash.display.MovieClip flash.display.Sprite ,并且库中的符号图标颜色将从蓝色变为绿色。

    enter image description here

    enter image description here

        22
  •  1
  •   TheDarkIn1978    11 年前

    自定义元数据并没有得到很好的文档记录或推广,但它非常有用——在不修改变量或更改其名称空间的情况下,您可以像在Java中那样为其提供自定义注释。

    Christophe Conraets在 his blog

    它的简单之处在于,您可以放置所有自己的元数据,然后只需使用 describeType() 并且您将在运行时看到所有自定义元数据:)

        23
  •  0
  •   wb2nd    12 年前

    还有一个窍门:

    默认情况下,Flash工具会剥离您所拥有的任何元数据标记。许多框架都依赖于这些元数据标记。需要注意的是,这不仅适用于编译器,也适用于优化器。请确保使用-keep-as3-metadata-tag选项运行编译器和优化器,以将元数据标记保留在其中。

        24
  •  0
  •   ming_codes    12 年前