【问题标题】:How to avoid having messy AS3 code如何避免混乱的 AS3 代码
【发布时间】:2011-06-09 13:21:43
【问题描述】:

我已经使用 ActionScript 3 进行了一段时间的编程,我注意到我的代码的自然发展似乎采取了一个巨大的文档类的形式,其中包含数十个成员变量、回调和对象句柄舞台。简而言之:有点乱!

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

所以,我想知道...有什么好方法可以帮助整理这些乱码?或者这是正常的吗?我来自 C++ 背景,我喜欢编写面向对象的东西,但我看不到将这种结构延续到 Flash 的方法。任何见解都将不胜感激。

谢谢

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

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

    有很多技巧。很高兴你提出将代码放在主时间线上。我建议不要将代码放在时间线上(这在 AS2 程序中太常见了,而使用 AS3 你可以完全避免它)我建议将每个对象视为一个单独的类。例如,您正在应用鼠标单击代码的影片剪辑可能是使用其自己的类创建的对象。假设 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
            }
        }
    }
    

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

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

    扩展一个我解释的类是AS3版本的'Inheritence'(Ball类继承了MovieClip类)。您还可以使用其他 OO 概念,例如 polymorphism 和封装。您应该尽可能将代码封装到单独的类中。假设您的项目中有几种不同类型的球 MovieClip,并且您希望 Ball 类成为 Soccer ball、Pool ball 和 Baseball 的父类。这些子类中的每一个都可以扩展 Ball 类。我发现对大型项目有用的另一件事是创建一个静态类来处理我的应用程序的所有事件。因为我将它定义为public static class,所以我可以将它导入到我的每个类中,并且它的变量只在应用程序期间创建一次。这可能非常有用。

    我还在类中创建了自己的伪析构函数,以努力像 c++ 一样使用 AS3。最简单的方法是在销毁对象实例之前调用伪析构函数。我确实让它在一个应用程序中自动发生,所以如果这让任何人感兴趣,我可以追踪代码。但 AS3 在后台处理垃圾收集,通常不需要析构函数,但也许我只是认为不需要它,因为我在 AS3 编程中养成的坏习惯太久了。

    就我个人而言,我认为你越是努力在 AS3 中开发应用程序,就好像你在使用 C++ 开发一样,它会变得越有趣,你的代码就越可重用。坚持下去.. 很快你就会得到一堆乱七八糟的动作脚本文件,而不是一堆乱七八糟的动作脚本文件。哈哈。有点双刃剑,但是whatevs。

    【讨论】:

    • +1 答案。我认为要记住的主要事情(考虑到 OP 来自 c++)是时间线代码可能非常不可预测,并且应该(除了极少数例外)不惜一切代价避免。有了 as3 中的所有面向对象的特性,它也是不必要的。
    • 对。我认为问题是,当我第一次进入 AS 时,我养成了一些坏习惯......而且他们有点卡住了,因为他们让我得到了结果。但是,是的,是时候以正确的方式做事了。
    • 绝对。 Flash IDE 中的时间线编码是贫民区,应该用适当的类文件替换。此外,在这样做时,您应该使用更纤细的 Sprite 对象而不是 MovieClip 对象。
    • @TheDarkIn1978 感谢您指出这一点! @Mike Belotti 也许我是老派,但我认为在学习 AS3 的情况下,花 50% 的时间编码和 50% 的时间参考文档中的内容是一件好事。假设您扩展了 MovieClip.. 如果您查看文档中的 MovieClip 类,您将了解到它扩展了 Sprite 类。该文档是一个很棒的学习工具恕我直言。 @任何人都可以用你自己的经验在这里纠正我,但我发现这比书本更有用(假设你已经使用过其他编程语言)。
    • 另外,使用更新的 AS3 文档的 livedocs 版本:livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3
    【解决方案2】:

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

    就个人而言,我会一起放弃时间线。这是我的工作方式:

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

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

    【讨论】:

      【解决方案3】:

      首先,如果不是必须的,或者您不能使用代码,请不要在舞台上使用时间线和元素。我的 fla 只有 1 层,1 帧,舞台上什么都没有。但我确实在链接到类的库中拥有我需要的所有图形元素。如果我对这些元素做的不多,我会保留它们的基本类(大部分时间是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..
      

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

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

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

      【讨论】:

        【解决方案4】:

        使用MVC 框架。有些人发现它们有限制,但每次我不将其用于“简单”项目时,范围就会扩大,我对自己做出的错误决定感到恐惧。

        一个好的框架可以让您摆脱对某些应用程序方面的决策,并允许您以一致的方式实现事物。

        一个好的框架还可以让你在其他项目中重用东西。

        一个好的框架已经投入了大量的工时,并且比大多数人在不付出同样努力的情况下可以组合起来的框架要经过深思熟虑。

        我使用PureMVC,但任何流行的都应该可以。

        【讨论】:

          【解决方案5】:

          由于您来自 OOP 背景,您应该不会遇到这个问题。然而,通过快速阅读几本好书很容易解决这个问题。

          基本动作脚本 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

          以您的 OOP 背景,这些都是完美的。

          如果你得到一个大文件,显而易见的想法是首先将事情分解成类。

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

          【讨论】:

            【解决方案6】:

            查看Robot Legs - 这是一个很棒的 MVC 框架,它确实帮助我编写了比平时更简洁(而且更少!)的代码。

            我还推荐 Robert Penner 的 Signals 库,原因有以下三个:1) 它可以让您编写更少的代码 2) 类不再需要扩展 EventDispatcher 3) 我非常喜欢它!

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

            【讨论】:

            • 类不必为了调度事件而扩展 eventDispatcher。您可以通过让类实现 IEventDispatcher 并将 EventDispatcher 对象作为其成员变量之一来从组合中获得相同的结果,通过该对象路由事件。为了使定位正常工作,当您实例化成员 EventDispatcher 时,您将“this”作为参数传递给构造函数 new EventDispatcher(this);
            • @scriptocalypse 这是一个有趣的策略,但 Singals 仍然是我的首选方法 :)
            猜你喜欢
            • 1970-01-01
            • 2014-11-07
            • 2021-04-13
            • 2011-06-28
            • 2018-12-07
            • 2012-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多