As3 Tricks & Tips

从2011年毕业到现在,我从事了18个月的AS3工作和3个月的php工作。 现将AS3的一些技巧和心得整理出来,以供备忘和参考。
  • 翻转

  • 水平翻转对象:
    obj.scaleX = -obj.scaleX;
    垂直翻转对象:
    obj.scaleY = -obj.scaleY;
  • doubleClick事件

  • 要使MouseEvent.DOUBLE_CLICK事件能够正常工作,必须设置目标的doubleClickEnabled为true且mouseChildren为false
    mc.doubleClickEnabled = true;
    mc.mouseChildren = false;
    mc.addEventListener( MouseEvent.DOUBLE_CLICK, doubleClickHandler );
  • hitArea属性

  • Sprite的hitArea属性的官方定义是:
    指定一个 sprite 用作另一个 sprite 的点击区域。如果 hitArea 属性不存在或者其值为 null 或 undefined,则 Sprite 本身将用作点击区域。hitArea 属性的值可以是对 Sprite 对象的引用。
    例如:
    a.hitArea = b;
    意思是将b作为a的点击区域。 两点注意事项:
    1. 必须将b的mouseEnabled设为false,否则a可能不会触发点击事件
    2. 最好将a的mouseChildren设为false,否则a的子项可能触发click事件,从而引起困惑
    所以,使用hitArea的最佳方式为:
    a.hitArea = b;
    b.mouseEnabled = false;
    a.mouseChildren = false;
  • getDefinitionByName获取SWC中的类

  • 若要使用getDefinitionByName方法从swc中获取类,则需要链接SWC中的所有类。否则会得不到该类定义。 具体方式为,添加编译器参数:-include-libraries url,url表示swc所在的目录路径。
  • 编译时加载XML

  • 区别于用loader在运行时加载XML,以下方式可以在编译时加载XML文件。
    //source表示要嵌入的XML的路径 不需要分号!
    [Embed(source="config.xml", mimeType="application/octet-stream")]
    //这句声明必须紧接着上一个语句
    private var config:Class;
    
    //使用方式
    //confXML即为config.xml的XML类
    var confXML:XML = XML(new config);
  • 跨域和外部访问JS

    1. 背景:a.swf和b.swf不在同一个根域名下,a.swf和c.js不在同一根域名下。
    2. 跨域XML crossdomain.xml
    3. 此时若a.swf需要访问b.swf,需要b.swf所在的根域名提供crossdomain.xml,并在此xml中允许a.swf所在的域访问。
    4. JS通信 参数和返回值
    5. flash和外部JS的通信可以互相传递参数和返回值。 比如c.js回调a.swf中的callback函数时,可以向a.swf中的callback函数传入参数。 此外,a.swf的callback函数如果有返回,则可被c.js的回调函数捕获作为c.js里该函数的返回值返回。
    6. 允许JS回调SWF函数
    7. 以上a.swf和c.js的通信还存在跨域问题。 解决办法是: 在嵌入a.swf的地方加入HTML标签:
      <param name="allowScriptAccess" value="always" />
      如果是用swfobject.js嵌入,则设置params参数为:
      params.allowscriptaccess = "always";
      a.swf代码需要调用
      Security.allowDomain( "*" );
      来允许c.js回调a.swf中的回调函数。
  • GreenSock

  • GreenSock是一个轻量稳定易用的AS3缓动类库。 GreenSock的作者Jack提供了一些使用的技巧和建议。 下面是节选的翻译。
    1. 使用TweenMax时,可以开启一些缓动的算法加速。
    2. FastEase.activate( [ Linear, Quad, Strong ] );
      上述语句只需要全局执行一次,便可带来TweenMax在使用Linear,Quad和Strong等ease函数时的算法加速。 注意TweenLite没有该加速功能,这也是TweenLite比TweenMax体积更小的原因之一。
    3. 使用TranformMatrixPlugin来加速旋转和缩放的缓动。
    4. TweenLite.to( mc, 1, { scaleX:2, scaleY:2, rotation:30 } );
      //下面的语句会更快一些
      TweenLite.to( mc, 1, { transformMatrix:{ scaleX:2, scaleY:2, rotation:30 } } );
      使用TranformMatrixPlugin时必须先激活此插件。
      TweenPlugin.activate( [ TransformMatrixPlugin ] );
      使用TranformMatrixPlugin时,需要保证mc同时只能有一个缓动进行,否则会出现诡异的现象。
    5. 使用字符串参数来表示相对位置。
    6. //这两句代码是等效的
      TweenLite.to( mc, 1, { y: mc.y - 100 } );
      //使用字符串来表示相对位置
      TweenLite.to( mc, 1, { y: "-100" } );
    7. 使用TweenMax.allTo()来操作拥有相同缓动变量的对象
    8. TweenMax.to( btn1, 1, { alpha:0, y:"100", delay:0 } );
      TweenMax.to( btn2, 1, { alpha:0, y:"100", delay:0.1 } );
      TweenMax.to( btn3, 1, { alpha:0, y:"100", delay:0.2 } );
      //上面三句代码和下面的一句代码是等效的
      TweenMax.allTo([btn1, btn2, btn3], 1, {alpha:0, y:"100"}, 0.1);
    9. TimelineLite来管理多重缓动。TimelineLite的示例视频
  • IDE

    1. 快捷键
    2. 工欲善其事,必先利其器。使用快捷键会大大提升工作效率。 以下是我在用Flash Builder(同Eclipse)的常用快捷键:
      • 调试:F11
      • 快速向上复制选中块:Ctrl+Alt+↑
      • 快速向下复制选中块:Ctrl+Alt+↓
      • 快速跳转行:Ctrl+L
      • 自动缩进:Ctrl+I
      • 去除不必要的import语句:Ctrl+Shift+O
      • 全局搜索:Ctrl+H
      • 文件内搜索:Ctrl+F
      • 快速打开文件:Ctrl+Shift+R
      • 快速大纲:Ctrl+O
      • 代码提示:ALt+/
      • 快速跳转至上一次编辑位置:Ctrl+Q
      • 行注释和解注释:Ctrl+/
      • 块注释和解注释:Ctrl+Shift+C
    3. 过滤器
    4. 要在FlashBuilder中显示.actionScriptProperties等属性文件。 点击过滤器,解选所有文件。 过滤器
  • 性能优化手段

    1. 多数情况下,尽可能使用回调函数而非事件,事件侦听会消耗额外的帧处理时间和一部分内存。
    2. 将不需要鼠标事件响应的显示对象的mouseEnabled和mouseChildren设为false。
    3. 尽可能减少需要重绘物件的大小以减少不必要的渲染区域。
    4. 矢量运算需要消耗大量CPU计算,如果矢量太多,帧率会急剧下降,可用位图替代。
    5. 使用对象池来缓存对象,达到对象重用,而不是每次都new一个对象出来。
    6. 若渲染压力大,但是对显示质量要求不高,可以将舞台的显示效果降低。
      stage.quality = StageQuality.LOW;
    7. 减少Timer的对象个数,在一个Timer事件上尽可能只用一个侦听函数进行侦听,然后在此侦听函数内做不同的处理。
    8. 尽可能使用Vector而非Array
    9. 对于文本框,尽可能使用appendText()而非”+=”来添加文本
关注微信公众号:timind

发表回复

您的电子邮箱地址不会被公开。