Flash Magician.docx
- 文档编号:24168814
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:14
- 大小:22.46KB
Flash Magician.docx
《Flash Magician.docx》由会员分享,可在线阅读,更多相关《Flash Magician.docx(14页珍藏版)》请在冰豆网上搜索。
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日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Flash Magician