Flash Magician.docx

上传人:b****2 文档编号:24168814 上传时间:2023-05-25 格式:DOCX 页数:14 大小:22.46KB
下载 相关 举报
Flash Magician.docx_第1页
第1页 / 共14页
Flash Magician.docx_第2页
第2页 / 共14页
Flash Magician.docx_第3页
第3页 / 共14页
Flash Magician.docx_第4页
第4页 / 共14页
Flash Magician.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Flash Magician.docx

《Flash Magician.docx》由会员分享,可在线阅读,更多相关《Flash Magician.docx(14页珍藏版)》请在冰豆网上搜索。

Flash Magician.docx

FlashMagician

FlashMagician

作者:

d2r   类型:

闪吧BBS   来源:

闪吧

  

FlashMagician(序)

 

很高兴你有意或者无意的看到这篇文章,如果你恰好对AdobeFlash有所了解,那么我保证你在这里能得到一些对你的Flash水平有所提高的东西,而你需要做的,就只是耐心的看完和FlashMagician相关的文章,然后自己去实践。

相关的文章都将记录在这个blog里面。

当然你也可以转载,不过请注明原作者。

我是d2r,也是Extremania。

   写这些文章的目的很简单,不过请听我讲完我的小故事。

我是2003年开始接触Flash,虽然没有小小,老蒋那些元老久,但是至少也算个中饼吧,我对自己的Flash水平很有信心,至少我不会像有些程序员把美工搞得一塌糊涂。

当初接触Flash的理由很简单,有一个漂亮的MM说她喜欢Flash,我就去学,虽然我和那MM一直都没有见过,当然更谈不上发展了,而且我很爱我的老婆,扯远了。

一开始我也是用Flash做做MTV,短剧之类的。

因为专业是计算机,所以我很快就开始了解ActionScript,发现了AS有着非常独特的魅力(我完全没有赞扬AS的意思,没有一个超只能的编辑器就让我BS它了)。

在接触AS不到一个月,我就开始开发了第一个游戏(TheLegendofITown),也陆陆续续开发一些简单的游戏。

在去年,开发了一个功能强大的摄像头工具PhotoShot;我也申请了一个域名(现在已经过期,被抢注了),开发“Eiei乐园”社区,不过由于找工作的原因,中途中止了。

我在想,开发Flash应用到底为了什么呢?

我得不到答案。

当深入的思考下去的时候,却发现了国内的Flash界是多么的苍白,这点我也不在这里讨论。

之前我也有去一家公司实习,专职做flash,公司给我开价是转正后2K5,在广州,要我开发像“易度”一个的社区。

一个星期后,我便辞职了。

从此对Flash没有任何激情,就算FlashCS3出了,我也没有安装(当然,我不懂AS3的)。

说那么多,结论就是,我要放弃Flash了,而且我以前没有在Flash中捞到任何好处!

在我放弃之前,我希望把我这几年来的经验,分享给大家,如果你对FlashAS编程还存在热情,我相信你会受益非浅的。

这样我也弃得瞑目了。

   什么是FlashMagician呢?

这是我对这系列文章的统称。

我不是要出书,所以我很随意,我会没有结构性,没有深浅之分的罗列一些我的经验。

我的经验不一定是符合AS的编程习惯的,但是我可以保证它能提高你的编程效率(不是运行效率),有时候你可以看到一些非常奇妙的动作,就像变魔术一样,你会感叹道,啊,原来Flash可以这样用的。

其实这全靠AS这种不三不四的语言,在其他严密的语言你是用不了的。

很多人说AS像什么语言像什么语言,我不想在这里引用,我觉得任何语言都有属于它自己特有的东西,在这里我会非常的尊重AS,会把它丑恶的一面尽量给美化掉。

   每一篇文章,我都会说一个主题,并且附上源代码。

不过你就别指望我会附上fla文件了,自己体会出来不是更有成就感吗?

如果确实需要,可以留下E-mail或者QQ跟我联系。

我采用的是ActionScript2.0和1.0的语法,请大家不要介意,我对Flash编程再也没有发展的欲望,所以也没有去学习AS3,其实只要你了解了内涵,很容易把代码转换成AS3的。

我会写多少文章呢?

可能有100篇吧,我对AS的体会实在太深刻了!

大家也可以怀疑批评我的观点,不过别劝我纠正了,再强调一次,我已经放弃Flash了。

   这些文章适合任何学习Flash的人阅读,不过请了解一些基本的概念,比如怎么把类注册到MC上去之类的啊?

我想我还是会解答大家提出的问题的,不过千万不要问我类似:

“请问,loading怎么做呢?

”之类的问题,我会超级bs你的。

(哎呀,其实我一直很谦虚的,就让我自大一次吧。

   最后,祝大家学习Flash愉快。

 

我的QQ:

34199000

E-mail:

extremania@

blog地址:

 

FlashMagician

(1)快速创建按钮

 

把这个话题放在第一位,其实没有什么特殊的含义,只是我实在太恨button这东西了,恨不得多骂它两句。

 

   从远古时代,这个所谓的button的东西就开始存在了。

当时创建一个button要画上4帧,三个状态,还有一个点击的有效空间。

后来知道了button其实只是一个MovieClip(MC),我就把button干脆换成一个两帧的MC,因为我不需要我的按钮那么生动活泼。

不过每次都要在第一帧加个stop(),又要为每次按钮定义onRollOver和onRollOut事件,如果按钮有几十个,那都被烦死了。

咳咳,先让我们来见识一下这个两帧的按钮。

 

(1)Ctrl+F8,新创建一个MC,名字就叫button_mc吧。

(2)MC简简单单,2个帧就行了。

第一帧是按钮的初始状态,第二帧是鼠标划过的状态(如图)。

(3)好了,回到主影评,把button_mc拉到场景中,起名button_mc,在第一帧中插入代码:

==========================================================

button_mc.stop();

button_mc.onRollOver=function(){

 gotoAndStop

(2);

}

button_mc.onRollOut=button_mc.onReleaseOutside=function(){

 gotoAndStop

(1);

}

button_mc.onRelease=function(){

 //your code

}

==========================================================

代码的含义我就不解释了,不清楚的请先了解ActionScript的基础。

要注意的是

button_mc.onRollOut=button_mc.onReleaseOutside这一句,如果你不这样些,那么你在按钮上按住鼠标左键,然后在按钮外面释放,就不能回到初始状态了。

 

(4)测试影片,一个简单的按钮功能已经完成了:

 

 

说了那么多废话,终于要进入今天的主题了!

怎样快速构建一个按钮然后只写onRelease就可以完成按钮的基本功能呢?

为了让我们不用重复些onRollOver和onRollOut事件,我们可以把这些事件集合到一起,成为一个抽象的按钮。

看看我们怎么构建一个抽象的按钮吧:

 

新建一个as文件,命名为AbstractButton.as(随你喜欢),保存在命名空间iod.example下。

代码如下:

=========================================================

class iod.example.AbstractButton extends MovieClip {

 private var _enable:

Boolean=true;

 private function AbstractButton() {

  this.onRollOver = this._rollover;

  this.onRollOut = this.onReleaseOutside=this._rollout;

 }

 private function onLoad() {

  this.stop();

 }

 public function toString():

String {

  return "[Object, SimpleButton]"+" name:

"+this._name;

 }

 private function _rollover():

Void {

  if(!

isEnable()) return;

  this.gotoAndStop

(2);

  _extrollover();

 }

 private function _rollout():

Void {

  if(!

isEnable()) return;

  this.gotoAndStop

(1);

  _extrollout();

 }

 //here are the interface for the subclass to extand the events

 public function _extrollover():

Void{

 }

 public function _extrollout():

Void{

 }

 //switch

 public function enable():

Void{

  this._enable=true;

  this.useHandCursor=true;

 }

 public function disable():

Void{

  this._enable=false;

  this.useHandCursor=false;

 }

 private function isEnable():

Boolean{

  return this._enable;

 }

}

=========================================================

除了蓝色和红色的代码,其他基本上可以不去理会。

可以看到,蓝色的代码正式实现了之前那个按钮的功能。

而这段代码的精髓在于红色部分。

_extrollover和_extrollout这两个函数,为按钮实现提供接口,使得onRollOver和onRollOut事件即使被复写(OverWrite,其实AS不提供规范的函数重载)也不会丢失变换状态功能。

可能我的表达能力有限,这段描述有点难于理解。

让我们看看一个真正的按钮是怎么实现的吧:

 

(1)按照第一个例子的1,2步创建button_mc。

(2)新建一个类型iod.example.ImpButton(不再声明建类的过程)

代码如下:

=========================================================

class iod.example.ImpButton extends iod.example.AbstractButton {

 private function ImpButton(){

  _extrollover=moreOnRollOver;

  _extrollout=moreOnRollOut;

 }

 private function moreOnRollOver():

Void{

  trace("onRollOver");

 }

 private function moreOnRollOut():

Void{

  trace("onRollOut");

 }

 private function moreOnRelease():

Void{

  //your code here

 }

}

=========================================================

*类的声明比较长,因为我没有设置classpath。

看红色代码,在这里实现了_extrollover和_extrollout函数并不会覆盖onRollOver和onRollOut事件。

 

(3)将iod.example.ImpButton类注册到button_mc上去。

(4)把button_mc拉到场景上,测试影片。

 

   怎样,将鼠标移到button_mc上去,button_mc能够转到第二帧同时又在输出面板能看到

"onRollOver"。

没错,AbstractButton没有占用你的事件,但是可以让你快速创建一个按钮。

其实ImpButton的代码可以更少,甚至是一个空壳。

当然,其实实践如果有共性,你也可以加

到AbstractButton上去,然后在提供修改接口。

Enable和Disable也是非必要的,看你自己

的习惯。

 

   由于是第一篇,所以语言组织得不是很好,希望你能看懂里面的奥妙,将它运用到其他地方去。

 

源文件:

 

01.rar

 

很多传统的程序员刚接触ActionScript的时候都应该是非常得心应手的。

函数重载,这个概念对

他们来说应该已经根深蒂固了吧,不多当把函数重载的概念运用在ActionScript上面的时候,就

会得到有趣的效果,先让我们看看一段程序吧:

function output(n:

Number):

Void{

        trace("Output a number:

"+n);

}

function output(str:

String):

Void{

        trace("Output a string:

"+str);

}

output(10);

//output("abc");

猜猜这段程序的输出结果是什么呢?

很多人可能会回答“Outputanumber:

10”,不过很可惜,输出的

结果是“Outputastring:

10”。

这样还好,可能大家会猜测,ActionScript并不支持函数重载,所以函

数output被重写了,运行的是第二个output函数。

如果把程序改成这样呢:

function output(n:

Number):

Void{

        trace("Output a number:

"+n);

}

function output(str:

String):

Void{

        trace("Output a string:

"+str);

}

//output(10);

output("abc");

这回连编译都不给你通过了,这种感觉就像吃到一个苍蝇,到底是怎么回事呢?

其实,AS是支持函数

重装的,而且还非常好用呢!

不过不知道在ActionScript3里面支不支持上述的函数重装。

这里就稍微

谈论一下ActionScript2.0的函数重载吧。

首先有一件东西要搞明白的,就是关于flash的arguments类,不过建议不要用类的定义来看待,把

它看成是每个函数都具有的一个变量。

arguments[0]表示被访问的第一个参数,arguments[1]为第二

个,以此类推;arguments.length表示输入参数的个数;另外arguments还具有caller和callee变

量,比较少用,所以可以忽略。

其次,需要弄懂typeof和instanceof,这两个关键词对大家应该不陌生

吧。

对于原始类型,我们用typeof,对象便用instanceof。

Flash中的typeof比较奇怪,它返回原始

类型的名字,对应关系如下:

String

string

影片剪辑

movieclip

Button

object

文本字段

object

Number

number

Boolean

boolean

Object

object

Function

function

掌握了以上知识之后,我们就可以写出非常完美的函数重载了!

先看看我们怎样重载文章开头的例子:

function output():

Void{

        if(typeof(arguments[0])=="string"){

                trace("Output a String:

"+arguments[0]);

        }else if(typeof(arguments[0])=="number"){

                trace("Output a Number:

"+arguments[0]);

        }

}

output(10);

output("abc");

看看输出的结果,是不是令你非常满意呢?

当然,重载也支持不同个数的输入变量,采用这种方式,

便可以随心所欲的写出自己的重装函数了。

特别在编写类型的构造函数时,这种方式更是显示出它的价值。

还没完呢。

我有一次笔试的时候,有一道题叫我们用C语言写出printf函数的,那时我真的傻了,

我记得printf函数可以输入任意个数的参数,而我们完全没有学过怎样实现,难道像main函数中的

args[]数组,可是函数调用的时候输出的又不是数组...最后我还是放弃了。

回去查看了printf函数

的源码,有点欲哭无泪...在这里我不想讲C语言是怎么实现的,我们看看我们伟大的AS是怎么实现的

吧。

我们要写一个函数,它可以输入任意个数的Number,然后求出Number的最大值,如果参数中有

一个或者多于一个非Number的变量,则返回NaN。

哦,再加上一个条件吧,代码不能超过5行!

好吧,看看一个比较傻的实现方式:

function max():

Number{

    for(var i:

Number=0,m:

Number=Number.NEGATIVE_INFINITY;i

    return m;

}

trace(max(1,2,5,93,5615454,999,-451));

 

看看结果,还满意吧?

其实它连5行都没有。

有人会说,那个m不是临时变量吗?

在for外面不就没有

了吗?

在其他地方是,在ActionScript中就偏偏不是!

好啦,我也不说太多了,希望能够抛砖引玉,

arguments实在太强大了!

   责任编辑:

sw   时间:

2008年1月22日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1