Flash开发,Flash语言(AS2 / 3)和Flash IDE的隐藏功能/技巧

时间:2009-07-21 17:49:17

标签: actionscript-3 flash actionscript ide

伙计们,我很惊讶,Hidden Features series中的{<3>}暂时没有Flash 隐藏功能帖子,我现在已经跟踪了一段时间。

最近有一个AS3/Flex one,但它不是很活跃,当我在这里说Flash时,我并不完全是指AS3。

“隐藏的功能”系列非常适合对某种语言不熟悉的人。它在一个地方展示了绳索和某些有价值的技巧。我认为这是个好主意。即使是专家也有时会发现他们从未听说过的伎俩。

当我开始使用Flash时,与其他编程语言相比,我对Flash IDE以及Flash的奇怪概念感到吃惊。

所以,这里有: Flash 隐藏功能 语言(AS2 / 3) Flash IDE

让乐趣开始。

24 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:8)

MovieClip.addFrameScript()是一种未记录的ActionScript 3.0功能,允许您指定当Movieclip时间轴的播放头输入特定帧编号时调用的函数。

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

答案 2 :(得分:7)

[Flash IDE]

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

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

解决方案是:

  • 为每个FLA创建一个代理类,该类是文档类的子类
  • 将每个SWF加载到新的子应用程序域

答案 3 :(得分:5)

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

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

答案 4 :(得分:4)

[AS3]

||(逻辑或)运算符可用于任何truthy / falsey值。

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

答案 5 :(得分:3)

[AS3]

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

通过写

稍微缩短
var list : Vector.<Object> = new <Object>[];

您甚至可以预定义值:

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

答案 6 :(得分:3)

[AS3]

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

trace("Hello","World");

将输出“Hello World”。

AS2不支持多个跟踪参数,因此您不得不执行类似

的操作
trace("Hello "+"World");

答案 7 :(得分:2)

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

答案 8 :(得分:2)

对于那些使用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

答案 9 :(得分:2)

[AS3]

当查找变量的值时,播放器将运行范围链,直到找到它正在寻找的内容。因此,使用嵌套(匿名)函数,您可以执行诸如进行异步调用之类的操作,并使用在调用方法范围内定义的变量来处理它。 e.g。

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

}

为此加载其他用途,这非常有用

答案 10 :(得分:2)

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::applyFunction::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::pushFunction::apply的核心是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

答案 11 :(得分:1)

[Flash IDE]

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

C:\ Documents and Settings \ USER_NAME \ Local Settings \ Application Data \ Adob​​e \ Flash CS3 \ en \ Configuration \ Components \ SOME_COMPONENT_FOLDER

重新启动闪存,它将出现在组件面板中供您使用。

答案 12 :(得分:1)

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

答案 13 :(得分:1)

[AS3]

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

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

实际上,在重构代码时可能会导致沮丧(因为它编译)。

答案 14 :(得分:1)

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

答案 15 :(得分:1)

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

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

}

然后当我编码时,我总是添加额外的||所以我在调试时不需要flashvars。

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

答案 16 :(得分:1)

我相信你会发现jp auclair的这篇文章很有用:{{3p>

答案 17 :(得分:1)

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

答案 18 :(得分:1)

以下是大多数人不知道的事情:如果触发了MOUSE_DOWN事件,则会在应用程序窗口之外跟踪MouseEvents,而不是MOUSE_UP。您可以在应用程序窗口之外(甚至在浏览器窗口之外)抓取鼠标位置,只要您正在执行的任何操作都会让用户按住鼠标。要测试此操作,请尝试运行以下命令:代码:

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

答案 19 :(得分:1)

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

注意:它不会计算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;
    }
}
}

答案 20 :(得分:1)

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

enter image description here

enter image description here

答案 21 :(得分:1)

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

答案 22 :(得分:0)

自定义元数据不是很好地记录或提升的,但它非常有用 - 无需修改变量或更改其命名空间,您可以为其提供类似于Java中的自定义注释。

Christophe Conraets在his blog上深入探讨了这一点。

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

答案 23 :(得分:0)

这是另一个问题:

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