2011-06-09 119 views
9

我一直在使用ActionScript 3编程了一小会儿,我已经注意到,我的代码的自然进程似乎采取一个巨大的文档类的形式,与几十个成员变量,回调和处理舞台上的对象。总之:这有点混乱!如何避免凌乱的AS3代码

事情是,我真的没有看到它的方式(至少还没有)。我在时间轴上使用不同的关键帧来表示应用程序中的不同状态,虽然我在时间轴上有一些代码(对于像鼠标点击影片剪辑那样的快速操作),但大多数逻辑只是倾倒在主文档类。

所以,我不知道......有什么好的方法来帮助neaten了这个代码,走了野生?或者这是正常的?我来自C++背景,我喜欢编写面向对象的东西,但是我看不到将这种结构传递给Flash的方法。任何洞察力将非常感激。

谢谢

回答

9

您可以将许多C++技能应用于您的AS3项目。

有很多技巧。很高兴你提出了在主要时间表上放置代码。我没有在时间轴上放置代码(这在AS2程序中很常见,而在AS3中可以完全避免),所以我建议将每个对象作为一个单独的类来考虑。例如,您正在使用鼠标点击代码的动画片段可以是使用其自己的类创建的对象。说MovieClip是一个球的图形。你应该创建一个扩展(继承)MovieClip类一个“球”级,并在其处理的鼠标点击事件:

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 

    public class myObjects.Ball extends MovieClip 
    { 
     public function Ball() 
     { 
      this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
     } 

     private function mouseDownHandler(event:MouseEvent):void 
     { 
      // Code 
     } 
    } 
} 

然后,找到你在图书馆窗格球的影片剪辑,右键单击它,属性,切换到高级模式,勾选导出为AS。现在,请注意您的MovieClip已经将MovieClip类引用为其基类了吗?因为你的Ball类扩展了MovieClip类,所以你不会再需要这个了。所以在Class字段中写入'myObjects.Ball'并清除Base类字段。如果您编写了Flash IDE可以找到的名称空间Ball类的路径,则应该看到一个绿色复选标记。

现在,您的Ball类将使用该MovieClip,因此当您在主类中创建Ball的新实例时,可以使用它作为MovieClip并动态地将其附加到舞台上。或者,您可以通过在该处手动拖动Ball MovieClip将其添加到时间线中。

扩展我解释的类是AS3的'继承'版本(Ball类继承MovieClip类)。你也可以使用其他的OO概念,如polymorphism和封装。尽可能将代码封装到单独的类中。假设您的项目中有几种不同类型的球形动画片段,并且您希望球形课程成为足球,球形球和棒球的父级。每个孩子课程都可以扩展Ball类。我发现对于大型项目有用的另一件事是创建一个静态类来处理我的应用程序的所有事件。因为我将它定义为public static class,所以我可以将它导入到每个类中,并且只在应用程序的持续时间内为其创建一次变量。这可能非常有用。

我也在类中创建了自己的伪析构函数,以便像使用C++一样使用AS3。最简单的方法是在销毁对象的实例之前调用伪析构函数。我确实是在一个应用程序中自动实现的,所以如果我感兴趣的人可以追踪代码......但AS3处理幕后的垃圾回收,通常不需要析构函数,但也许我只是认为它不是必需的,因为我在AS3编程中养成了很长时间的坏习惯。个人而言,我认为你越努力在AS3中开发应用程序就好像你正在用C++开发一样,获得的乐趣越多,代码的可重用性越高。保持它..很快,而不是一堆代码,你会有一堆动作文件大声笑..一把双刃剑,但whatevs一点点。

+0

+1答案。我认为要记住的主要事情(考虑OP来自C++)是时间线代码可能是非常不可预测的,应该是(极少数例外)不惜一切代价避免。使用as3中的所有面向对象功能,它也是不必要的。 – Bosworth99 2011-06-09 14:53:35

+0

对。我认为,当我第一次进入AS时,我形成了一些不好的习惯......并且因为他们得到了我的结果而陷入了困境。但是,是时候以正确的方式做事了。 – 2011-06-09 15:01:38

+0

绝对。 Flash IDE中的时间线编码是贫民窟,应该用适当的类文件替换。此外,您还应该使用较细的Sprite对象而不是MovieClip对象。 – TheDarkIn1978 2011-06-10 04:52:02

1

使用MVC框架。有些人觉得他们是有限制的,但是每次我不用一个“简单”项目时,范围就会扩大,我对我做出的糟糕决定感到恐惧。

一个很好的框架,让您摆脱对某些应用方面的决策,并允许你实现一致的方式事情。

一个好的框架还允许您在其他项目中重用。

一个好的框架已经陷入它工时万吨,将能更好地想出比大多数人可以放在一起没有同样的努力。

我用PureMVC,但任何流行的应该工作。

2

那么,你可以做的第一件事就是将每个应用程序的状态封装在MovieClip中。然后,您将能够为此MovieClip分配一个班级,并且您是否在布线(事件&)。

人事方面,我会把时间表放在一起。以下是我的工作方式:

我在Flash Builder中创建了一个纯粹的ActionScript项目。我在lib文件夹中添加任何外部库。 我在Flash Pro中为我的资产创建了一个fla。这个fla导出了一个swc,它与我的Flash Builder项目相关联。

您也可以尝试RobotLegs。这是一个微小的MVC框架,可以帮助您连接应用程序。

2

首先,如果不是真的必须的,也可以不与代码做什么,不要在舞台上使用时间轴和元素。我的fla只有1层,1帧,没有舞台。但是我确实有图书馆需要的所有图形元素链接到类。如果我对这些元素做的不多,我会保留它们的基本分类(大部分时间是电影剪辑),但是如果我打算对它们进行一些操作,我将它们链接到自定义类。

我还根据自己的需要组织我的lib文件夹。例如:

lib 
    -> gui 
    ->Controls.as (Controls class) 
    -> etc.. 
    -> elements 
    -> Ball.as (Ball class for controling bal element) 
    -> Hammer.as (Class for controling hammer) 
    -> etc.. 
    -> animation 
    ->Tween.as (custom tween class) 
    ->etc.. 
    -> data 
    -> XmlParser.as (class for getting data from xml) 
    -> etc.. 

当然,这个结构只是一个例子,可以用你需要的任何方式来组织。

除此之外,我尝试从显示部分分离逻辑部分,有时也分离数据部分。

随着每个项目我建立我自己的外部库,其中我把当前项目创建的可重用类,我知道或我认为他们将/可以在未来的项目中使用。

1

既然你从一个OOP背景你不应该有这个问题。但是,通过快速浏览一些精彩的书籍很容易解决这个问题。

基本的ActionScript 3.0 http://www.amazon.com/Essential-ActionScript-3-0-Colin-Moock/dp/0596526946

的ActionScript 3.0的设计模式。 http://www.amazon.com/ActionScript-3-0-Design-Patterns-Programming/dp/0596528469

随着你的面向对象的背景,这些都是完美的。

如果你得到一个显而易见的想要做的大文件就是先把事情分解成类。

如果您无法在AS3中可靠地编写OOP,那么您将会在MVC或任何其他设计模式上浪费时间。

1

退房Robot Legs - 这是一个很棒的MVC框架,它的确帮助我编写比我平常更清洁(而且更少)的代码。

我也建议罗伯特·潘纳的Signals库有三个原因:1)它可以让你编写更少的代码2)类不再需要扩展EventDispatcher 3)我害怕'喜欢它!

我不能强调使用MVC框架 - 它提供的用于组织代码的文件/文件夹结构是值得的。

+1

类不必为了派发事件而扩展eventDispatcher。通过让类实现IEventDispatcher并将EventDispatcher对象作为其成员变量之一,它可以通过组合实现相同的结果。为了使定位工作正确,当你实例化成员EventDispatcher时,你在构造函数new EventDispatcher(this)中传递“this”作为参数; – scriptocalypse 2011-06-09 16:02:30

+0

@scriptocalypse这是一个有趣的战术,但Singals仍然是我的首选方法:) – 2011-06-09 16:56:12