7

As3 Tricks & Tips

 3 years ago
source link: https://wuzhiwei.net/as3-tricks-tips/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
从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
    此时若a.swf需要访问b.swf,需要b.swf所在的根域名提供
crossdomain.xml

,并在此xml中允许a.swf所在的域访问。

JS通信 参数和返回值

flash和外部JS的通信可以互相传递参数和返回值。 比如c.js回调a.swf中的callback函数时,可以向a.swf中的callback函数传入参数。 此外,a.swf的callback函数如果有返回,则可被c.js的回调函数捕获作为c.js里该函数的返回值返回。

允许JS回调SWF函数

以上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时,可以开启一些缓动的算法加速。
FastEase.activate( [ Linear, Quad, Strong ] );

上述语句只需要全局执行一次,便可带来TweenMax在使用Linear,Quad和Strong等ease函数时的算法加速。 注意TweenLite没有该加速功能,这也是TweenLite比TweenMax体积更小的原因之一。

使用TranformMatrixPlugin来加速旋转和缩放的缓动。
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同时只能有一个缓动进行,否则会出现诡异的现象。

使用字符串参数来表示相对位置。
//这两句代码是等效的
TweenLite.to( mc, 1, { y: mc.y - 100 } );
//使用字符串来表示相对位置
TweenLite.to( mc, 1, { y: "-100" } );
使用TweenMax.allTo来操作拥有相同缓动变量的对象
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);
TimelineLite来管理多重缓动。TimelineLite的示例视频
  1. 工欲善其事,必先利其器。使用快捷键会大大提升工作效率。 以下是我在用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

要在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而非”+=”来添加文本

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK