July 29, 2006

【黑羽】AS3.0教程(6):强大的事件机制(2)

ActionScript3天地会公测中...

(如蒙转载,请留下我的Blog链接:www.kingda.org, thx)
今天Google小查了一下,居然有1060个网站转载了俺的系列教程。还包括了Blueidea, flash8, 5dmedia等顶级Web设计大站。非常开心,动力十足,呵呵。
其实到目前为止,我的3.0开发学习笔记已经有3万字左右的东西了,但都是些纲要和代码,整理成文,尤其是用比较有条理和易懂的方式写出来会比较慢。况且开发中的代码是随手拈来,但写教程的代码往往要经过一些改写,使得重点更突出。所以如果更新有点慢,请耐心一些,呵呵。

如何接收事件?如何做到AS3.0的标准事件编程?
Event改变的部分很多,这两天有空时,黑羽就在想怎样用一个有条理的方式来讲解Event和它相关的诸多内容,让我们感到比较容易理解,记忆和接受。
我准备这样来讲解:
先给个接受事件的代码例子。在例子中,指出:
(1) Event对象发生了什么变化
(2) addEventListener语法的不同,原因,和const型必要性和用法
(3) Listener和As2.0有何不同,和this关键字的“改进了的记忆力”

黑羽一贯的风格,先来一个例子。我很想给个短一点的代码例子,但是要达到清楚,全面和标准的示范,我还是决定采用这个Document Class的示例。我会在每个代码段注一些注释,大家不明白的地方回贴说一下,我会尽量解答。
Document Class的含义和相关用法并不难,忘了的兄弟看我第3篇教程:
AS3.0教程(3):Document Class特色为我们带来了什么?

好,come on baby.
新建一个as文件,拷贝以下代码,命名为AddListener.as。
新建一个fla,命名为 "黑羽黑羽我爱你.fla"(本教程推荐使用,倘若不遵从可能导致喝凉水塞牙泡MM被踢炒股被套等严重后果,霍哈哈。Just kidding。)。设置它的文档类(Document Class)为AddListener.


//【黑羽】ActionScript 3.0系列教程(6)
//http://www.kingda.org
package {
import flash.display.Sprite;
import flash.events.MouseEvent;

//哈哈,看到了没,Document Class不仅可以扩展MovieClip,也可以扩展Sprite
//package里面的类名要和文件名相同
public class AddListener extends Sprite {
public function AddListener() {

//用package外面定义的类KingdaSprite创建一个实例,由于同文件中,所以不用import啦
var outsideChild:KingdaSprite = new KingdaSprite(0x00FF00, "outside_sprite");
addChild(outsideChild);//没有了这一句,你啥都看不到。

outsideChild.addEventListener(MouseEvent.CLICK, inclassHandler);//注册类里面的侦听器
outsideChild.addEventListener(MouseEvent.CLICK, outsideHandler);//注册类外面的侦听器
}

private function inclassHandler(event:MouseEvent):void {
trace("类里面的侦听器侦听到MouseEvent事件: " + event);
trace("this关键字指向:"+this);
}

}
}

function outsideHandler(event:MouseEvent):void {
trace("类外面的侦听器侦听到MouseEvent事件: " + event);
trace("this关键字指向:"+this);
}

import flash.display.Sprite;
import flash.events.MouseEvent;

//这个类就是画一个矩形,然后你点击这个矩形会发出标准鼠标click的事件
class KingdaSprite extends Sprite {
public var nickname:String;
public var ColorNum:uint;

//colorNumber就是#ffcc00这种类型的数,在AS3中推荐用新的uint型来标记它
public function KingdaSprite(colorNumber:uint, nameString:String) {
ColorNum = colorNumber;
nickname = nameString;
graphics.beginFill(ColorNum);
graphics.drawRect(0,0,100,100);
graphics.endFill();
}
}


鼠标一点击创建出来的绿色矩形,会看到输出

类里面的侦听器侦听到MouseEvent事件: [MouseEvent type="click" bubbles=true cancelable=false eventPhase=2 localX=64 localY=80 stageX=64 stageY=80 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
this关键字指向:[object AddListener]

类外面的侦听器侦听到MouseEvent事件: [MouseEvent type="click" bubbles=true cancelable=false eventPhase=2 localX=64 localY=80 stageX=64 stageY=80 relatedObject=null ctrlKey=false altKey=false shiftKey=false delta=0]
this关键字指向:[object global]

演示完毕,我们来讲第一个话题
(1) Event对象发生了什么变化
AS2.0中创建event 对象是很随意的,只要这个对象有一个String属性叫做type的就可以了,甚至连target都可以省掉。不要以为这不规范不应该做,看看Flash类源码,Macromedia的程序员可不只一次的这样使用过。所谓上梁不正下梁歪,就是这样。(其实严格说也没什么不对,有时候是不需要target。但没有标准就是不好)
然后你在Event Object中爱添加什么就添加什么。极其自由,也就等于极其混乱。
3.0不同了,所有的事件必须都要继承自Event这个类(全饰名称flash.events.Event)。不然,哼哼,事件发送是不能成功地。
说说Event这个类,那叫一个NB。AS3.0的基石类是Object,Event是直接继承自Object的,开国大佬级别的。它里面定义了一些基本的事件名称,比如ACTIVATE(FlashPlayer得到系统焦点时事件),ADDED(对象被添加到显示时发送的事件)。AS3.0中有个好功能是cancel事件,但Event中这些基本事件统统是不能被cancel的,听起来似乎很NB。这不细说了,Event太多内容了。以后写高级内容时在提到如何运用吧。那叫一个爽字了的!要想Flash玩的转,Event类必须很精通。正所谓江湖人称:"平生不识Event,就称闪客也枉然。"
这样有什么好处?
好处太多了,最大的好处是一,规范了事件的定义,二,大量由此衍生的类省去了我们大量的时间和重复开发的成本。
规范事件的定义放到下一部分讲。至于内置的Event子类好处,大家请看上面fla的运行输出:
MouseEvent就是内建的一个Event子类,它的好处一看它的内容就明白:
从AS3.0起,任何一次点击事件我们都可以得到:
1.事件发生时鼠标的MC相对坐标(localX=64 localY=80)和绝对坐标(stageX=64 stageY=80)。 爽不爽?smile.gif
2.ctrl键,shift键,alt键有没有按下。你试试按着ctrl键再点击一下方块,那么ctrlKey就为true了。爽不爽?smile.gif
(其余参数不解释,涉及到高级运用。部分会在Event最后一节提到该怎么运用)
光这一个MouseEvent类,黑羽怎么着都觉得值人民币20块。

(2) addEventListener语法的不同,和const型必要性
这一节很重要,不过现在12点半了。精力不太好了,但又不想草草了事。明儿接着写,质量第一。数数也有小两千字了,先发出来顶顶先。
tongue.giftongue.gif

广告:哈哈,现在刚好是阿里妈妈推广期哦,你是站长吗?推荐注册阿里妈妈赚广告费

TrackBack

TrackBack URL for this entry:
http://www.kingda.org/mt/mt-tb.cgi/86

Comments (19)

old9:

平生不识Event,就称闪客也枉然,哈哈哈
很喜欢你的教程,文字诙谐,通俗易懂,加油加油~

继续期待下篇

我正在学习AS3
不知能否有直接的交流
有一些问题请教
我的QQ 80221468
MSN eidiot(at)hotmail.com

你可以整理到某个具体的专题里面。甚至,可以开一个as3blog
恩:)

黑羽大哥的技术真不是盖的
能加我QQ么?我想拜师
我的目标是:
“没有蛀牙!”:)
QQ:56961156

rocks:

黑羽用專業和幽默的語言生動形象地描述 as3.
光这一个MouseEvent类,黑羽怎么着都觉得值人民币20块。
呵呵 。。。

minlab:

没有理由。。。一定要顶~

不会写教程,只会写源码,终于知道为什么我用enterFrame老不成功了,原来是那个"F"我给小写了,看了参考文档还是写成"f"了,不应该。

用flex,flash9都可,单击改变帧速。
DemoEnterFrame.as
package{
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
[SWF(backgroundColor='0x111111',frameRate='100',width='300',height='280')]
public class DemoEnterFrame extends Sprite{
private var txt:TextField;
private var frame:TextField;
public function DemoEnterFrame(){
//Test the "enterFrame" Event;
txt=new TextField();
txt.text="Test the enterFrame";
txt.textColor=0xff0000;
addChild(txt);
//Show The frameRate Change;
frame=new TextField();
frame.textColor=0xffffff;
frame.text="frameRate:"+stage.frameRate;
frame.y=50;
addChild(frame);
//Event Listener
this.addEventListener("enterFrame",changeColor);
stage.addEventListener("click",clickStage);
}
private function clickStage(event:MouseEvent):void{
stage.frameRate=(stage.frameRate==100)?5:100;
frame.text="frameRate:"+stage.frameRate;
}
private function changeColor(event:Event):void{
txt.textColor=Math.floor(Math.random()*0xffffff);
}
}
}

luxi:

好崇拜你啊。。。。

HUPEIKANG1:

请问为什么我的

我用您的教程 运行出现了错误了呢?

ReferenceError: Error #1065: 变量 addFrameScript 未定义。
at AddListener$iinit()

难道 没有命名为 "黑羽黑羽我爱你.fla"

就会出问题吗 -_-b

HUPEIKANG1:

另:

请问
nickname = nameString;
这个 变量有什么用呢?
我找了半天都没发现用处。。。

谢谢了~~

HUPEIKANG1:

如果改成
扩展
MovieClip 就没有问题

请问 是怎么回事呢?

slanb:

我觉得:好,很好,非常好!
支持中...

小章:

我把你的代码拷过来了 运行咋啥都没有呢 奇怪

swallow:

well done, you make a lot contribution to us. thx.

BlueOnly:

你好,我们最近有一个flash的项目,正好要用上as3,我以前是做java的,希望您有空的时候能和你交流 MSN:only6655@hotmail.com

BlueOnly:

你好,我们最近有一个flash的项目,正好要用上as3,我以前是做java的,希望您有空的时候能和你交流 MSN:only6655@hotmail.com

BlueOnly:

你好,我们最近有一个flash的项目,正好要用上as3,我以前是做java的,希望您有空的时候能和你交流 MSN:only6655@hotmail.com

大哥,能够讲一下as3的坐标系?

一只眼:

新建一个fla,命名为 "黑羽黑羽我爱你.fla"(本教程推荐使用,倘若不遵从可能导致喝凉水塞牙泡MM被踢炒股被套等严重后果,霍哈哈。Just kidding。)


你是天平座的吧?怎么跟我一样的自恋!##¥%……&*

留下高见,发表评论

个人信息不会外泄,请放心填写。

姓名和Email必填。

发表评论后,请耐心等待,不要频繁刷新。提交完成后,刷新一下本页即可看到您的评论。^_^

请输入验证字符"o" :
文字广告:你是站长吗?注册阿里妈妈赚广告费

最近发表

归档

全部
Creative Commons License
此 Blog 中的日记
遵循以下授权:
Creative Commons
(创作共用) 授权
.
Google PageRank
本站被Adobe官方MXNA新闻聚合器收录
本站被蓝色理想BXNA收录