日期:2013-12-03  浏览次数:20869 次

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中的”分离”思想。

补充内容: 关于Flash CS3类路径的设置,如果您希望设计本人的package。那么则需求把这个package放在classpath下面,而不要把package文件夹本人设置为classpath

切入正题,我们逐渐开局:
一、建立文档类(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方