主题:  FlashMX于flash5的事件模式比较

无双

职务:普通成员
等级:1
金币:0.0
发贴:10
注册:2002/3/8 9:16:19
#12002/3/25 11:30:15

Flash Mx和Flash5事件模式比较


相信不少闪客们注意到macromeidia公司在介绍FlashMX增强的动作脚本(ActionScript)功能时有过这样的说法“new event model”——新的事件模式。这是什么意思?从Flash4到Flash5,在flash的教材和培训中我们第一次用上了动作脚本(actionscript和面对对象(oriented-object)的字眼,相信这也是flash由一个纯粹的动作制作软件演变成一个集成的多媒体开发环境的一个最重要因素,从flash5开始,我们可以随心所欲的用程序代码去控制电影剪辑的运动,做出很多客户端的其他程序语言不敢做的可怕的交互效果。笔者认为这是一件很惬意的事情,但是如果你是一个java或 web页面开发人员,你知道流行的面对对象的编程思想,你在用flash的动作脚本编写程序时可能感到有点的遗憾,你感觉到一个动画制作软件结合面对对象的思想给你变编程带来便利的时候,也感到flash5的actionscript不象java 和javascript那样完全的面对对象,为什么按纽不能是对象呢,还有在javascript中的表单(form)为什么不是对象呢。
Macromedia公司给我们的总是要比我们期望的要多。你现在可以在FashMX中找到答案。我们来看看对象的事件模式到底有什么样的改进。


Flash5的电影剪辑事件
·    enterFrame
·    load
·    unload
·    mouseDown
·    mouseUp
·    mouseMove
·    keyDown
·    keyUp
·    data
电影剪辑作为对象拥有上面这些事件,我们只能把事件方法捆绑在一个电影剪辑对象实体在外部(无双注:不是电影剪辑时间线上的桢上),常用的表达方式:
onClipEvent (event) {
// code
}

flash 5的按纽事件
·    press
·    release
·    releaseOutside
·    rollOver
·    rollOut
·    dragOver
·    dragOut
·    keyPress
常用的表达方式
on (event) {
// code
}
在flash5和以前版本中,动作脚本代码只可以捆绑在帧(frame),按钮和电影剪辑上,其中按纽和电影剪辑实践代码只能捆绑在其外部。这就给我们带来一些问题:
·    不能把onClipEvent事件捆绑在电影剪辑自身内部
·    当电影剪辑运行时不能直接改变或删除事件句柄
·    不能从库(lirary)中绑定电影剪辑后,再给这个电影剪辑赋动作脚本
作为一个flash开发人员,这些问题相信不处不在,我们为了通过动作脚本用一个电影剪辑去控制另一个电影剪辑,有时候需要做空白的电影剪辑,这个电影剪辑仅仅是用于包含其他的电影剪辑,于是电影剪辑相互嵌套,父电影剪辑,子电影剪辑,层层关系,让我们感到象一个巨大的迷宫。FlashMX新的时事件模式让我们不再这样呆板的工作。看看FlashMX的事件模式。

FlashMX的事件模式
在FlashMX中,事件句柄仅仅是对象的的一个属性,flash5中的电影剪辑事件变成了电影剪辑对象的一个属性,电影剪辑事件处理可以用流行的点语法表达,比如做电影剪辑实体mc的。onEnterFrame事件的方法。可以是mc.onEnterFrame 。
有一个电影剪辑实体ball,用通过动作脚本让其自由转动,在flash5中可以在这个电影剪辑实体上捆绑下面代码:
// code on "ball" instance
onClipEvent (enterFrame) {
this._rotation += 5;
}
这样当电影剪辑每运行一桢时,有旋转5度。做到了让电影剪辑旋转的目的,但是这样的旋转是无终止的,我们不能通过代码让其在适当的时候停止。
在FlashMX新事件模式中我们可以把代码放在电影剪辑实体内部的桢上,可以捆绑下面代码

// code inside "ball" symbol
this.onEnterFrame = function () {
this._rotation += 5;
};
我们可以在电影剪辑的一桢上捆绑上面代码,而在另一桢上捆绑下面的代码
this.onEnterFrame = function () {
this._rotation -= 5;
};
在第三桢上捆绑下面代码使电影剪辑停止:
this.onEnterFrame = undefined;
再通过外部的脚本使电影剪辑停止在某一桢,这样就可以控制电影奸计是顺时针运动,逆时针运动还是停止运动。
Button and Movie Clip Events in Flash MX
Flash MX中的按纽和电影剪辑事件
让我们感到欣慰的是,在FlashMx中按纽终于作为一个对象来来处理了,和电影剪辑一样,可以从苦库中拖出按纽来创建按纽对象实体,按纽事件也作为对象的属性来处理。下面是点语法表达的按纽事件处理表达方式:
·    Button.onDragOut
·    Button.onDragOver
·    Button.onKeyDown
·    Button.onKeyUp
·    Button.onKillFocus
·    Button.onPress
·    Button.onRelease
·    Button.onReleaseOutside
·    Button.onRollOut
·    Button.onRollOver
·    Button.onSetFocus

如果你足够细心的话,可以看到按纽增加了新的事件(属性?笔者的观念现在还没有改变过来,注意以后千万叫属性,不叫事件:))))——focus--onSetFocus 和onKillFocus.

下面是全部的电影剪辑事件(属性?)
·    MovieClip.onData
·    MovieClip.onDragOut
·    MovieClip.onDragOver
·    MovieClip.onEnterFrame
·    MovieClip.onKeyDown
·    MovieClip.onKeyUp
·    MovieClip.onKillFocus
·    MovieClip.onLoad
·    MovieClip.onMouseDown
·    MovieClip.onMouseMove
·    MovieClip.onMouseUp
·    MovieClip.onPress
·    MovieClip.onRelease
·    MovieClip.onReleaseOutside
·    MovieClip.onRollOut
·    MovieClip.onRollOver
·    MovieClip.onSetFocus
·    MovieClip.onUnload
同样增加了新的事件句柄onPress 和onRollOver.这有什么用呢?还记得我们在射击等游戏时候怎样去检测目标(电影剪辑)被击中吗?用的是hitTest()方法,现在可以用电影剪辑的onPress,onRelease,onRollOut实现同样的功能。
[b]实例说明[b]



在电影剪辑实体ball的内部桢上(注意不是在外部整体上)捆绑下面代码
function glideToMouse () {
_x += (_parent._xmouse - _x) * .2;
_y += (_parent._ymouse - _y) * .2;
}
this.onMouseDown = function () {
this.onEnterFrame = this.glideToMouse;
}
this.onMouseUp = function () {
this.onEnterFrame = null;
}
this.onRollOver = function () {
this._rotation += 30;
};
this.onPress = function () {
this._xscale = this._yscale = 120;
};
this.onRelease = function () {
this._xscale = this._yscale = 100;
};
this.onReleaseOutside = this.onRelease;



自己实践一下有什么效果,我想如果你有flash变成的基础一定知道上面的语句实现怎样的功能,相对flash5,代码是不是干净而而简洁!

编辑历史:[这消息被无双编辑过(编辑时间2002-03-25 11:34:47)]


5DFlash Designer

职务:版主
等级:3
金币:10.0
发贴:1306
注册:2001/6/5 15:31:17
#22002/3/27 10:51:23
不错,



andymee

职务:普通成员
等级:1
金币:0.0
发贴:31
注册:2002/3/7 19:33:08
#32002/3/27 12:02:46
谢谢无双哈。很有用哦



Demon.S

职务:版主
等级:5
金币:10.0
发贴:2468
注册:2000/9/15 13:56:49
#42002/3/27 15:37:01
补下:
event model应该叫做事件模型



无双

职务:普通成员
等级:1
金币:0.0
发贴:10
注册:2002/3/8 9:16:19
#52002/3/29 10:16:03
画魔说的没错,叫事件模型(event model)比较好
希望大家来讨论components创建的问题,
#initclip
function TriangleClass () {
this.cobj = new Color(this);
this.update();
}
// Allow TriangleClass to inherit MovieClip properties
TriangleClass.prototype = new MovieClip();
// Update draws the triangle at the current base and height values.
TriangleClass.prototype.update = function () {
if (this.applyTint) {
this.cobj.setRGB(this.tcolor);
}
this._xscale = 10 * this.tbase;
this._yscale = 10 * this.theight;
}
// Connect the class with the linkage ID for this movie clip
Object.registerClass("FTriangle", TriangleClass);
#endinitclip

#initclip 和#endinitclip用于定义组件类
Object.registerClass("FTriangle", TriangleClass)注册组件