请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 13284|回复: 15

[AS1&2] AS3日积月累(2) - 从AS1和AS2到AS3的观念转变(不断补充) [复制链接]

awflasher 楼主
帖子
1219
体力
5975
威望
234
发表于 2007-5-11 13:58:30 |显示全部楼层
as3blog.com日积月累系列全部为原创,转载请保留:http://as3blog.com/as3/as3tip-new-philosophy/

AS1/2-AS3观念的转变(Meet with new philosophy)
对于AS1、AS2的开发模式来说,灵活是最大的优势。然而,灵活却造成了不稳定、紊乱。这是开发复杂的、长久的项目所忌讳的。关于(AS1/2/1+ 2)灵活轻便与稳定持久(AS3)的权衡,我个人觉得可以理解为”鱼和熊掌不可兼得”,但我希望已经习惯了AS1、AS2的朋友们不要把这个结论想得太悲观。

AS3是纯粹面向对象的,相比过去的AS2,我认为是更加敏捷的。纵然有着更多的约束,但在package内直接建立多个辅助类(Helper Class),不失为一个非常好的消息。就凭这一点,我觉得至少与笨拙的AS2相比,AS3的开发效率就不会打多大折扣。我们需要的其实只是语法、习惯,尤其是观念的转变而已。当然,这需要时间。我作为一个AS1/2的长期发开人员,在转变到AS3的过程之中,也遇到了很多问题和疑惑。但我很乐于与大家分享、交流我所获得的收获以及观念转变的心路历程。

ActionScript编程自它问世的那一天就是多姿多彩的。技术,尤其是Adobe产品线的技术体系,也绝然不是呆板的”学究式体系”。我希望我的”罗嗦”能让您获得一个更轻松的心态。

言归正传,先说说我在AS1/2(1+2)转变到AS3时所遭遇的最大困惑吧:
开局(How, and especially where, to get start) - 玩过星际争霸的朋友们一定知道,针对不同的地图,如Lost Temple和WCG-groky park(原来WCG有一个岛关,我忘记了),都有各自的经典、流行的开局方式。从AS1/2转变到AS3,无非是从Lost Temple转变到WCG-groky park的过程,你也许要先采气矿,造空军,才能顺利发展。

其实Flash从AS1到AS3,也有各自固定的、流行的开局方式。
对于习惯了用AS1编程的人来说,制作一个Flash的开局是非常灵活的:你一进入Flash就有一个长长时间轴以供使用。你往往需要一个 loading,你可以用1-5帧先做一个loading(还记得N年前流行的FlashMTV制作教程么?);你也可以取一帧,放一个loading的 MovieClip然后在这个MovieClip上写一个onEnterFrame来监听swf文件加载的进度(我热衷的做法)。接下来,你可以在第二帧或者第N帧部署程序界面。MovieClip强大的帧API能让你灵活地完成许多有趣的逻辑(gotoAndPlay、gotoAndStop、 prevFrame等)。编程的时候也可以很随意地寻找自己要控制的资源,我现在还记得刚接触AS的时候,一个_root一个_global,曾经让我屡试不爽。每次遇到问题了就用这两个东西解决。
AS2的开局其实没有本质的变化,至少我是这么认为的。唯一的进步就是比AS1的OOP,模块封装的更加彻底。甚至还有些许退步,比如清一色基于 MovieClip+attachMovie的模式,仍然容易造成运行时(Run-Time)效率低下,而且开发起来概念也模糊了。因为Library中设置了linkage,new的明明是自己的Class,attach的还是MovieClip。
于是很多人采用AS1+2的方式,这也是我所喜欢的。现在想起来,还是比较灵活快速的。
然而在AS3中,你却仿佛陷入一片黑暗。FlexBuilder没有时间轴。即便用”似曾相识”的FlashCS3的IDE开发,AS3也不支持 MovieClip和Button上的代码。写在帧上也无法简单地使用”onRelease=functioin”了。上网搜一搜教程,往往得到如下的写法:
aw.addEventListener(”click”,fun);
function fun(e:Event){trace(1);}
实在让习惯了AS1、2的朋友们郁闷。

一方面看到人家用AS3设计出来的精彩demo羡慕不已,一方面又对程序入口摸不着边际。这种尴尬我想不是看一两篇教程就能解决的。

我们需要”洗心革面”,我们需要”忘记过去”(try to forget the past)。大胆地告诉自己,onRelease=function不仅已经被”杀死”,而且根本就不是好的写法,哪怕你仍然觉得它看起来那么顺眼。大胆地告诉自己,AS3中,所有的变量、函数都属于类(对象的属性和方法),而不再属于时间轴、帧,哪怕上面列举的两行代码也可以写在时间轴上生效。

我个人建议,传统AS1/2的程序员从Flash CS3 IDE入手AS3,比较合适。因为Flash CS3的入口(开局)非常明确:Document Class(文档类)。

运行FlashCS3,打开fla文件,在IDE下面属性面板中,找到”Document Class”,填入一个名字(由于是类名,最好是首字母大写,比如MyMainClass)。然后在fla文件所在的文件夹下面建立同名的as文件。当然,也可以把fla和类文件全部分离,这就需要设定类路径(File-Publish Settings-ActionScript version:Settings)。下面可以输入类路径。我个人建议输入相对路径。相对,意即相对当前的fla文件;路径,即我们电脑文件系统中的文件夹。不写死”x:\xxx”是为了让项目可以在不同的环境上运行,也可以更好的支持多人开发。相对路径的写法就是用”.”表示当前路径,用”..”表示上一级路径。比如可以写:
“./classes/”或者”../classes/”。
这里再补充说明一下,我的建议是把原文件放在一起,输出的swf放在别的目录(通常叫做”bin”)。输出目录在刚才面板中的”format”标签下,可以把原文件放到目录”src”中,然后把swf格式的file名设置为”../bin/somefile.swf”,建议只输出swf。HTML还是自己写的好。
别看我罗嗦了这么多篇幅讲这些设置,但它们真的对于规范你的开发习惯和开发观念有好处。让你潜移默化的接受AS3的Philosophy中的”分离”思想。

切入正题,我们逐步开局:
一、建立文档类(Document Class)
现在我们可以开始建立Document Class了。Flash CS3方便地提供了一个”编辑图标”,你可以方便地打开类文件。回忆一下,上一篇文章提到关于类的书写:每一个类都应该在一个package中。我个人的理解,觉得Document Class应该在一个单独的、无具体名称的”generic”package中,即:
package
{
import flash.display.Sprite;
public class MyMainClass extends Sprite
{
public function MyMainClass()
{
init();
}
private function init()
{
// do sth
}
}
}
// We can even use some help classes
class MyMainClassHelper{}
这里,我们就成功”开局”了。
注意,这个文档类必须为public的。而辅助类则不能定义为public、private的,必须是internal的。文档类必须继承自Sprite 或者MovieClip。因为这个文档类代表了这个swf,显然swf是一个需要在屏幕上渲染显示(flash.display.DisplayObject)并提供资源承载能力(flash.display.InteractiveObject)的基础容器。

二、逻辑开局(Initialize the logic)
我们所有的逻辑入口都是从这个类的构造函数开始的。AS3的loading有一些麻烦,我们暂时跳过(稍后会介绍)。
构造函数一般要保持简洁,不妨用流行的init方式开局,即在构造函数内调用一个init函数。记住一点,AS3中,”_root”已死,这里就是传统意义上的”_root”了。你看到的这个类(文档类),第一反应应该是这个swf文件(就如同你原来看到”_root”就应该反应到swf文件一样)!在这里可以找到原来我们需要的许多资源,例如我们可以找到通过loaderInfo:LoaderInfo属性(继承自DisplayObject),获取外部参数:xxx.swf?somevar=1传进来的”somevar”,也可以通过stage:Stage属性(继承自DisplayObject),来进行原来的Stage类的各种操作。我也可以用contextMenu:ContextMenu属性(继承自InteractiveObject),来控制flash右键菜单的内容。
这一切都在文档类的init以及其他所属方法中进行。所有的其它功能,可以封装成别的类、包进行”模块式”调用。

三、事件机制(The new Event System)
习惯新的事件机制所花的勇气,我认为和开局相当。我曾经热衷于xxx_mc.onRelease = function(){}的写法,而且做过N多这样的项目。然而当我真正开始用addEventListener的时候,才发现这是多么优雅的写法。优雅在哪:

   1. 统一:只有addEventListener,没有addListener、没有on(…),代码可以统一地放置。
   2. 清晰:事件处理函数作为类的方法(Methods)列举分明,试想一个跟在onXXX后面的赋值函数放在代码当众多难找。
   3. 信息翔实、准确:新的事件机制通过传递Event对象让事件的信息完整无漏地传达给接受方;函数(方法)与类绑死,Delegate终于可以光荣退休了。

四、总结

   1. 接受新的OOP开发体系:类/对象(class/object)+构造函数(constructor)+成员属性(properties)+成员方法(methods),除了这些东西以外,ActionScript没有别的存在形式!把时间轴和实例上的代码都忘记吧!
      我们要”拥抱”类的概念!AS3中所有的一切围绕着类的概念进行。swf就是一个类,用Flex开发,叫做Application,用CS3,叫做 Document Class(往往继承自Sprite)。任何变量(属性)都属于一个类,MovieClip有成员属性currentScene,它是Scene类的一个实例;Sprite有成员属性contextMenu和stage,它们继承自DispatchObject类,分别是ContextMenu类和 Stage类的实例。
   2. 没有_root,所有的_root有关的操作,封装到文档类中的成员函数(方法)进行。_root不再是swf的代表,取而代之的是Document Class(或者Flex中的Application Class)
   3. 功能模块化、分离:
      不要把所有的事情都塞到文档类中去做,哪怕你可以定义很多辅助类,毕竟独立出来的文件更加便于管理、集成、再使用。而且界面(图形、动画)和代码要分离(事实上AS3的Document Class和addChild的内容管理体系帮我们完成了这个操作)。无论你是一个人搞定代码+设计还是有一个团队协作分工编程与动画。分离的好处是让你的功能更加强大和易维护。
已有 1 人评分威望 收起 理由
蓝色月光 + 4 精品文章

总评分: 威望 + 4   查看全部评分

西部数码顶级域名注册商39元抢注!
unmen 
帖子
117
体力
242
威望
0
发表于 2007-5-11 14:04:38 |显示全部楼层
不错,不错.用as3来loading别的到容易搞明白,loading自身我越来越糊涂了.
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

帖子
521
体力
2366
威望
131
发表于 2007-5-11 14:33:05 |显示全部楼层
AW的文章要顶。

使用道具 举报

呜呜龙

中级会员

帖子
239
体力
487
威望
0
发表于 2007-5-11 16:25:43 |显示全部楼层
谢谢楼主!

使用道具 举报

awflasher 楼主
帖子
1219
体力
5975
威望
234
发表于 2007-5-11 17:01:31 |显示全部楼层
关于loading自身。其实确实有点confused。我打算稍后介绍。如果急切想知道。可以查找bit101的blog。可以搜索一下
as3+preloading+bit101 :)

使用道具 举报

帖子
521
体力
2366
威望
131
发表于 2007-5-11 17:18:11 |显示全部楼层
loading自身可以看我这篇:
http://bbs.blueidea.com/thread-2744638-1-1.html

使用道具 举报

unmen 
帖子
117
体力
242
威望
0
发表于 2007-5-11 17:18:50 |显示全部楼层
呵呵.
  
eidiot :
101已经搞出了preLoader了:
http://www.bit-101.com/blog/?p=946  

你说的是这里吗?
我E文不好,按上面的方法实践了下,老报错.如果用flash cs3来写的话loading自身也不算太麻烦(没有深入,简单的实践),cs3下载的第一天就试着做了loading自身,还在这里告诉别人怎么做,可5.1用flex写时就遇到麻烦啦,似乎是不起作用,我就不明白了,难道flex的as3和flash cs3的as3不同?

使用道具 举报

awflasher 楼主
帖子
1219
体力
5975
威望
234
发表于 2007-5-11 17:22:00 |显示全部楼层
惭愧,我还没有如此实践。
其原因是我希望做一个loadingproxy之类的swf。用这个swf来加载别的swf。由于新的as3中的资源分布更加的合理(按照Tree结构,addChild)因此swf之间的load会非常方便。
你可以给bit101留言试试看^_^,我今晚如果有时间,争取实践一下:)

使用道具 举报

eidiot 
帖子
258
体力
671
威望
101
发表于 2007-5-11 17:35:13 |显示全部楼层
原帖由 awflasher 于 2007-5-11 13:58 发表
1. 统一:只有addEventListener,没有addListener、没有on(…),代码可以统一地放置。 ...


AS3还是有类似 addListener 这样的诡异调用的,如 LocalConnection 类的 client。

使用道具 举报

awflasher 楼主
帖子
1219
体力
5975
威望
234
发表于 2007-5-11 20:16:03 |显示全部楼层
eidiot详细解释一下?

使用道具 举报

unmen 
帖子
117
体力
242
威望
0
发表于 2007-5-11 20:29:46 |显示全部楼层
原帖由 awflasher 于 2007-5-11 17:22 发表
惭愧,我还没有如此实践。
其原因是我希望做一个loadingproxy之类的swf。用这个swf来加载别的swf。由于新的as3中的资源分布更加的合理(按照Tree结构,addChild)因此swf之间的load会非常方便。
你可以给bit1 ...


我的英语实在拿不出手,怕是自己理解的有错误。

使用道具 举报

eidiot 
帖子
258
体力
671
威望
101
发表于 2007-5-11 21:13:07 |显示全部楼层
只是说AS3里还是有些不爽的地方,没有全部统一为 addEventListener,而是保留了回调函数的方式。极少的情况,白壁微瑕的感觉。

使用道具 举报

eidiot 
帖子
258
体力
671
威望
101
发表于 2007-5-11 21:43:06 |显示全部楼层
比如 NetStream 类的事件 netStatus 是 addEventListener 的,而 onCuePoint ,onMetaData ,onPlayStatus 三个事件却要指定 client (默认是this),然后通过 clinet 相应的回调函数执行,诡异的不行。

使用道具 举报

awflasher 楼主
帖子
1219
体力
5975
威望
234
发表于 2007-5-12 15:22:12 |显示全部楼层
恩,感谢,我有空研究一下!

使用道具 举报

帖子
5
体力
10
威望
0
发表于 2007-6-7 12:57:50 |显示全部楼层
顶,受益匪浅。
在用Flex  Builder开发FLV播放相关的系统时,经常抛出异常,原来发现是FLEX的库没有  onMetaData这个方法。
如果FLASH  CS3里面有的话,把里面的  playerglobal.swc COPY到FLEX里,替换相同的文件应该可以解决吧。

使用道具 举报

帖子
64
体力
89
威望
0
发表于 2009-4-25 00:56:26 |显示全部楼层

帖子在讲as3 还是preloading 还是其他

有深度,可是对于as1 or as2 还是有点迷糊.

有时候感性和理性是没有交集的.

再从心理上,和大家的舆论导向上都把as3变得有高度了,成了程序员的范畴了,这可苦了非设计的flasher了.

多一些示例教学可能会贴近大众,可以更容易布道~~
小虎牙 冲出 精彩世界

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 10:54 , Processed in 0.136161 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部