龙图教育:AS3方法和技巧(8)

2020-05-07 09:10

38.is 运算符(对比instanceof)

AS3新增的关键字is,用来判断一个实例是否属于某一对象类型,它可以帮助我们确定对象类型,还可以判断类的继承关系,包括对于接口的继承执行。

var mySprite:Sprite = new Sprite(); trace(mySprite is Sprite);

trace(mySprite is DisplayObject); // true trace(mySprite is IEventDispatcher); // true

在as1/as2时,此类操作用的是instanceof运算符,AS3中用is运算符替代了instanceof,用来检查AS3中类的继承情况,但是它不能检查AS1形式的使用构造函数创建的动态类(dynamic classes).在这种情况下,你可以使用instanceof来实现,因为instanceof可以检查实例的原型链(prototype chain),原型链(prototype chain)相当于类的继承,实际上,AS3中的继承关系就是类的原型链(prototype chain)的镜像.这意味着instanceof对AS3仍然适用,当然推荐使用is运算符.

var mySprite:Sprite = new Sprite();

trace(mySprite instanceof Sprite); // true trace(mySprite instanceof DisplayObject); // true

trace(mySprite instanceof IEventDispatcher); // false - not in prototype chain var AS1StyleClass:Function = function(){} AS1StyleClass.prototype = new MovieClip();

var as1Instance:* = new AS1StyleClass();

trace(as1Instance instanceof AS1StyleClass); // true trace(as1Instance instanceof MovieClip); // true trace(as1Instance is AS1StyleClass); // true

trace(as1Instance is MovieClip); // false - cant see prototype chain

39.时间线和类关联

在Flash 9 中,你可以将包括主时间线在内的所有时间线与类关联,在AS2时通过设置linkage将类与MC关联,AS3中仍然是这样.而主时间线是通过设置属性面板中相应项,或者在发布设置—ActionScript设置,如下图: 属性面板:

发布设置:

实际上即使你没有将时间线与类关联,Flash也会自动为时间线创建一个类.当你将时间线与类关联时,时间线上的变量就变成了类变量,所有在时间线上定义的函数(使用function functionName(){}声明的)也就成了类的方法了.并且,当时间轴到达某一帧时,会自动调用此帧上的方法.因此,对于变量名和函数名,你只能声明一次,当然变量可以重复定义,但不能重复声明的,而函数是不能重复定义的,函数名也不能重复声明.

注意:不能把时间线上的脚本和与时间线关联的类中的脚本混淆了.

31

下面写在Flash 9中时间线第一帧代码:

var num:Number = 1;

function showNum():void { trace(num); }

showNum();

实际上相当于将下面这样一个类与时间线关联:

package {

class TimelineClass extends MovieClip { public var num:Number = 1;

public function showNum():void { trace(this.num); }

public function frame1():void { showNum(); } } }

40.Render事件

ActionScript一直以来都是依靠enterFrame事件来执行基于时间的行为的.尤其是卡通动画(animation)和关系到帧回放(playback)的动作.相比之下,Director的Lingo语言中,不仅仅有enterFrame事件,还有两个帧事件,prepareFrame和exitFrame.AS3.0尽管没有Lingo的这两个事件,但是它比以前增加了一个新的帧事件: render,或者叫Event.RENDER.

AS3的render事件发生在enterFrame事件之后,你可以在显示器屏幕刷新之前做你需要做的一些事情.和enterFrame事件不同的是,当使用render事件的显示对象(display object)进入舞台(stage)时,或者显示对象(display object)存在于舞台上的显示列表(display list)时才会触发事件,render事件不像enterFrame那样逐帧自动触发.要确保render事件在当前帧触发,必须调用stage.invalidate().

var sprite:Sprite = new Sprite(); stage.addChild(sprite);

sprite.addEventListener(Event.ENTER_FRAME, enterFrame); sprite.addEventListener(Event.RENDER, render); stage.addEventListener(MouseEvent.CLICK, click); function enterFrame(event:Event):void { trace(\}

function render(event:Event):void { trace(\

32

}

function click(event:MouseEvent):void { trace(\stage.invalidate(); } /*

Output: enter frame enter frame enter frame click

enter frame render

enter frame enter frame enter frame enter frame ... */

41.XML中表示属性的操作的运算符@

E4X(用于AS3的XML)增加了几个新的操作符来访问XML中的值,其中一个是用来访问属性的操作符 @,可以用它来代替attribute()(XML类的顶级方法)方法来获得属性值.

var myXML:XML =

也可以使用星标(*)和@操作符来得到XML结点所有属性的XMLList对象列表,这和attributes()方法类同.

var myXML:XML =

atts = myXML.attributes(); trace(atts.toXMLString()); /* Output: senocular 2867 */

atts = myXML.@*;

trace(atts.toXMLString());

33

/* Output: senocular 2867 */

42.支持事件传递

AS3支持事件的传递,事件传递指的就是在对于嵌套对象中的每一个对象都能触发事件,而不只是一个事件引用

如果两个角色重叠,你点击了上面的角色,则只能获得从上面角色发送来的消息,即使你的点击碰巧发生在两个角色交叠的范围之内。

在AS1/AS2中,影片剪辑的类似”按钮”事件(如onPress,onRelease等等)不能被传递给它们的子剪辑的.这意味着虽然表面上你单击了影片剪辑的子剪辑,希望这个子剪辑来处理onPress事件,但是实际上onPress事件是由父剪辑来处理的,因为它阻隔了onPress事件传递给子剪辑.

// AS1 and AS2

parent_mc.onPress = function(){ trace(\}

parent_mc.child_mc.onPress = function(){ trace(\}

/* click child output: parent pressed */

// AS3

parent_mc.addEventListener(MouseEvent.CLICK, parentClick);

parent_mc.child_mc.addEventListener(MouseEvent.CLICK, childClick);

function parentClick(event:MouseEvent):void { trace(\}

function childClick(event:MouseEvent):void { trace(\}

/* click child output: child pressed parent pressed */

34

43.得到音频的波谱信息

AS3中使用SoundMixer类(flash.media.SoundMixer)可以得到在Flash中播放的音频文件的波谱信息,你可以制作和许多常用的多媒体播放程序一样的可视化效果.使用SoundMixer类中的静态方法ComputeSpectrum可以以一个BiteArray实例的形式呈现出声音的波谱信息,从而来创建视觉效果.

ps:网上已经有类似的教程,自己找下吧

// play sound...

var spectrumInfo:ByteArray = new ByteArray(); SoundMixer.computeSpectrum(spectrumInfo);

// spectrumInfo is now a byte array with sound spectrum info

44.Number()的变化

在AS1/AS2时,使用Number()来将字符串转换为其对应的数值,如果字符串以”0″开头,则会被当作八进制数,同样,如果以”0x”开头会被当作十六进制数.

// ActionScript 1 and 2 trace(Number(\trace(Number(\

我们日常生活中的习惯用的是十进制数,上面的用法有时候不小心会造成错误.在AS3中就不用担心了,以”0″开头的字符串转换为数值,不再会被当作八进制数了.而以”0x”开头的仍然被当作十六进制.

// ActionScript 3

trace(Number(\trace(Number(\

如果要将字符串作为八进制转换,可以使用parseInt函数.

trace(parseInt(\

45.无用单元回收:引用计数算法和标记-清除算法 46.弱引用(Weak Reference)

47.Flash 9:BitmapData类和库中位图的使用 48.typeof运算符的变化

49.getBounds()和getRect()对比 50.for?in和for each?in 51.函数参数的默认值

45.无用单元回收:引用计数算法和标记-清除算法

Flash中的无用单元回收机制(Garbage Collection)用来自动清除内存中不再需要的变量,有两种算法执行:

35


龙图教育:AS3方法和技巧(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:深圳黑弧广告-员工手册

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: