隐藏功能/ Flash开发,闪光语言(AS2 / 3),和Flash IDE的招数[关闭](Hidd

2019-06-26 11:20发布

大家好,我是彻底惊讶的是没有闪光灯隐藏的功能在尚未发布隐藏的功能系列 ,我一直在跟踪现在有一阵子。

有一个最近的AS3 / Flex的一个 ,但它不是很活跃,我完全不意味着只是AS3,当我在这里说的Flash。

隐藏的功能系列是伟大的人谁是新的特定语言。 它显示了绳索和一些有价值的技巧,在同一个地方。 我认为这是一个绝妙的主意。 即使专家有时会发现,他们从来没有听说过的技巧。

当我开始使用Flash,我吃了一惊由Flash IDE和Flash的奇概念,相对于其他编程语言。

所以,这里有云:什么是闪存的一些隐藏的功能作为一门语言(AS2 / 3)Flash IDE?

让乐趣开始。

Answer 1:

[闪光灯IDE]

这不是一个功能,它更是一种疑难杂症。 当指定为FLA的文档类,编译器不继承这个类,它修改它。

这可能会导致问题,当你有几个主权财富基金具有相同的文档类,都被加载到另一个SWF(因为两个类具有相同名称无法加载并排侧到同一个应用程序域)。 它导致正在加载的第一和第二使用第一的修改后的类,产生奇怪的错误(你可以想像)。

该解决方案可以是:

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


Answer 2:

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


Answer 3:

MovieClip.addFrameScript()是一个未记录的ActionScript 3.0功能,允许用户指定一个时的movieclip时间轴的播放头进入特定帧号被调用的函数。

function someFunction():void {

}

movieclip_mc.addFrameScript(4,someFunction);

帧号是从零开始的(1帧= 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);
        }
    }
} 


Answer 4:

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

它不记录任何地方,而是一个论坛的帖子详细解释 。



Answer 5:

[AS3]

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

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

此外,您还可以使用&| (按位和/或)做一个非短circuted表达:

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


Answer 6:

[AS3]

当您使用AS3跟踪语句,您可以通过在多个参数等有各自之间的空间AS3将格式化输出。

trace("Hello","World");

将输出的 “Hello World”。

所以你不得不这样做AS2不支持跟踪多个参数

trace("Hello "+"World");


Answer 7:

[AS3]

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

成为由写作稍短

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

你甚至可以预先设置的值:

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


Answer 8:

ActionScript 2

every class is a function and every function a class ... AS2 is prototype based ...

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

accessing Function::prototype allows extending classes at runtime:

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

Object::__proto__ ... allows you to change the prototype of an object, which can be used for runtime reclassing:

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

in this example, the function trace is reclassed to Array ... pretty cool, huh? :)


Function::apply and Function::call allow applying any function as a method to any object:

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)

using the three above, instantiation of a class MyClass with parameters param_1, ..., param_n can be written as:

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

a corelation of Function::push and Function::apply is that this is simply a function argument, that is passed automatically ... as any other function argument, it can be written to ...

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

Object::__resolve ... settings this method allows you to react to lookups on undefined properties ... this is fun and useful for proxying, mocking, composition, delegation, and so on ...

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]

that's it for now ... there's an awfull lot more ... the thing is simply, that AS2 is an exiting language, but painfully slow ... AS3 in comparison is boring as hell, but the speed increase is really great ...

greetz

back2dos



Answer 9:

您可以创建基于ActionScript3弱引用使用Dictionary对象。



Answer 10:

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

}

这个其他用途的负载,这真的非常有用



Answer 11:

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

阅读更多关于它在这里



Answer 12:

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



Answer 13:

[AS3]

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

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

重构代码的时候(因为它编译)它实际上可以导致挫折。



Answer 14:

[闪光灯IDE]

当您导出一个影片剪辑为SWC您可以通过拖放到文件夹添加到的组件面板

C:\的Documents and Settings \用户名\本地设置\应用数据\的Adobe \ Flash CS3中\恩\配置\组件\ SOME_COMPONENT_FOLDER

重新启动Flash,它会在组件面板供您使用。



Answer 15:

嗯,这可能不是一个隐藏的功能,但也许人有失手,有外部补间引擎,你可以使用。 我最近最喜欢的是Greensocks。 在我看来,它缺少的唯一的事情似乎有所改善,工作流程。 有没有在我的下一个AS项目测试V.11不过也绝对会: http://blog.greensock.com/v11beta/



Answer 16:

不完全隐藏,但对于经常被忽略的“包括”宏(是的,它仍然在AS3存在)? - 对伪造多重继承(由侧接口采用侧卧时),即使它通常是一个不好的做法是非常有用的。



Answer 17:

当使用Flash变量写一个实用方法getFlashVars()。

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

}

然后当我编码,我总是添加一个额外|| 所以,我不会有Flash变数,而调试。

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


Answer 18:

我敢肯定,你会发现有用的这篇文章jpauclair: AS3宝藏在mm.cfg文件



Answer 19:

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


Answer 20:

这里的东西大多数人不知道:MouseEvents跟踪如果MOUSE_DOWN事件已被解雇的应用程序窗口之外,但不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!"/>



Answer 21:

这个包将让你在的DisplayObjectContainer所有的DisplayObject通过设置类的类型。

注:在影片剪辑不会计算帧数。

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


Answer 22:

在Flash Professional中,您可以通过重定向是从基类更改影片剪辑符号添加到雪碧flash.display.MovieClipflash.display.Sprite ,并在库中的符号图标的颜色会从蓝色变为绿色。



Answer 23:

自定义元数据是不是一件很好的记载和推广,但它是非常有帮助的 - 而无需修改变量或更改其名称空间,你可以给它定制标注类似的方式,你可以在Java。

它走了过来深度由Christophe Conraets在他的博客 。

它的简单性,你可以把你所有的自己的元数据,然后你只需要使用describeType()你会看到所有的自定义元数据在运行时:)



Answer 24:

这里还有一个疑难杂症:

默认情况下的Flash工具条,你有任何元数据标签。 许多框架取决于这些元数据标签。 你必须要小心的是,这并不只适用于编译器,还要优化。 一定要与-keep-AS3元数据标签选项同时运行你的编译器和优化,让您的元数据标签在那里。



文章来源: Hidden features/tricks of Flash development, Flash language (AS2/3), and Flash IDE [closed]