Flash 如何避免AS3代码混乱

Flash 如何避免AS3代码混乱,flash,actionscript-3,Flash,Actionscript 3,我用ActionScript3编程已经有一段时间了,我注意到我的代码的自然进程似乎是以一个巨大的文档类的形式出现的,该类包含几十个成员变量、回调和舞台上对象的句柄。简言之:有点乱 问题是,我真的没有找到解决的办法(至少现在还没有)。我在时间轴上使用不同的关键帧来表示应用程序中的不同状态,虽然我在时间轴上有一些代码(用于快速操作,如在电影剪辑上单击鼠标),但大多数逻辑最终都会转储到主文档类中 所以,我想知道。。。有什么好的方法可以帮助整理这些疯狂的代码?还是这很正常?我来自C++背景,我喜欢编写面

我用ActionScript3编程已经有一段时间了,我注意到我的代码的自然进程似乎是以一个巨大的文档类的形式出现的,该类包含几十个成员变量、回调和舞台上对象的句柄。简言之:有点乱

问题是,我真的没有找到解决的办法(至少现在还没有)。我在时间轴上使用不同的关键帧来表示应用程序中的不同状态,虽然我在时间轴上有一些代码(用于快速操作,如在电影剪辑上单击鼠标),但大多数逻辑最终都会转储到主文档类中

所以,我想知道。。。有什么好的方法可以帮助整理这些疯狂的代码?还是这很正常?我来自C++背景,我喜欢编写面向对象的东西,但我看不出如何将这种结构转换成Flash。任何见解都将不胜感激

谢谢使用框架。有些人发现它们有局限性,但每次我不在一个“简单”的项目中使用它们时,范围就会扩大,我对自己做出的错误决定感到恐惧

一个好的框架可以使您从对某些应用程序方面的决策中解脱出来,并允许您以一致的方式实现事情

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

一个好的框架已经投入了大量的人力,并且比大多数人不用同样的努力就可以组合起来的更好


我使用,但是任何一个流行的都应该有效。

好吧,你可以做的第一件事是将每个应用程序的状态包装在一个MovieClip中。然后,您将能够为这个MovieClip分配一个类,并在那里连接(事件和内容)

就我个人而言,我会把时间线都抛在一边。以下是我的工作方式:

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


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

首先,如果不是必须的,或者您不能使用代码,请不要在舞台上使用时间线和元素。我的fla只有一层,一帧,舞台上什么都没有。但我在库中确实有所有需要的图形元素链接到类。如果我对这些元素做的不多,我会让它们的基本类保持原样(大部分时间是movieClip),但如果我计划对它们进行一些操作,我会将它们链接到自定义类

我还根据他们的需要组织我的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..
当然,这个结构只是一个例子,可以按照您需要的任何方式进行组织

除此之外,我尝试将逻辑部分和显示部分分开,有时还将数据部分分开


在每个项目中,我都会构建自己的外部库,在其中我放置了为当前项目创建的可重用类,我知道或者我认为它们将/可以在未来的项目中使用

由于您的应用程序来自OOP背景,因此不应该出现此问题。然而,通过快速阅读几本好书,很容易解决这个问题

基本动作脚本3.0

ActionScript 3.0设计模式。

在你的OOP背景下,这些都是完美的

如果你得到了一个大文件,最明显的想法是从把事情分解成类开始

如果你不能在AS3中可靠地编写面向对象的代码,那你就是在浪费MVC或任何其他设计模式的时间。

请检查-这是一个很棒的MVC框架,它确实帮助我编写了比平时更干净(更少!)的代码

我还建议使用Robert Penner的库,原因有三:1)它可以让您编写更少的代码2)类不再需要扩展EventDispatcher 3)我非常喜欢它


<>我不能用MVC框架来强调-它提供的组织文件的文件夹/文件夹结构是值得的。

< P>你可以将你的C++技巧应用到你的AS3项目。 有很多技巧。很高兴你提出把代码放在主时间线上。我建议将每个对象看作一个单独的类,而不是将代码放在时间轴上(这在AS2程序中太常见了,使用AS3可以完全避免)。例如,您正在应用mouseclick代码的movieclip可以是使用自己的类创建的对象。假设电影唇是一个球的图形。您应该创建一个扩展(继承)MovieClip类的“Ball”类,并在其中处理mouseclick事件:

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
        }
    }
}
然后,在库窗格中找到球的MovieClip,右键单击它,属性,切换到高级模式,选中导出为。现在,请注意您的MovieClip是如何引用MovieClip类作为其基类的?由于您的Ball类扩展了MovieClip类,因此您不再需要该类。。所以在类字段中写'myObjects.Ball'并清除基类字段。如果您编写了flashide可以找到的带名称空间的Ball类的路径,您应该会看到一个绿色的复选标记

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

扩展我解释的类是AS3版本的“继承”(Ball类继承MovieClip类)。您还可以使用其他OO概念,如、和封装。您应该尽可能将代码封装到单独的类中。假设您的项目中有几种不同类型的球类电影,并且希望ball类成为足球、台球和棒球的父类。每个子类都可以扩展Ball类。我发现另一件对大型项目有用的事情是创建一个静态类来处理我的应用程序的所有事件。因为我把它定义为
公共状态