我已经使用ActionScript 3进行了一段时间的编程,我注意到我的代码的自然进展似乎采用了一个巨大的文档类的形式,其中包含许多成员变量,回调和对象的句柄舞台。简而言之:它有点混乱!
事实上,我并没有真正看到它的方法(至少还没有)。我在时间轴上使用不同的关键帧来表示应用程序中的不同状态,虽然我在时间轴上有一些代码(对于快速的事情,如鼠标点击影片剪辑),大多数逻辑最终都会被丢弃在主要内容中文件课。
所以,我想知道......有什么好方法可以帮助我解决这个代码疯狂的问题?或者这是正常的吗?我来自C ++背景,我喜欢编写面向对象的东西,但我看不到将这种结构传递给Flash的方法。任何见解都会非常感激。
由于
答案 0 :(得分:9)
您可以将许多C ++技能应用于AS3项目。
有很多技巧。很高兴你把代码放在主时间轴上。而不是在时间轴上放置代码(这在AS2程序中太常见了,而且AS3可以完全避免它)我建议将每个对象视为一个单独的类。例如,您正在应用鼠标单击代码的动画片段可以是使用自己的类创建的对象。假设MovieClip是一个球的图形。你应该创建一个'Ball'类来扩展(继承)MovieClip类,并在其中处理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,右键单击它,“属性”,切换到“高级”模式,选中“导出为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类成为足球,池球和棒球的父类。每个子类都可以扩展Ball类。我发现对大型项目有用的另一件事是创建一个静态类来处理我的所有应用程序的事件。由于我将其定义为public static class
,我可以将其导入到我的每个类中,并且其变量仅在应用程序的持续时间内创建一次。这非常有用。
我还在类中创建了自己的伪析构函数,以便更加像c ++一样使用AS3。解决此问题的最简单方法是在销毁对象实例之前调用伪析构函数。我确实让它在一个应用程序中自动发生,所以如果这对任何人都感兴趣我可以追踪代码..但AS3在幕后处理垃圾收集,通常不需要析构函数,但也许我只是觉得它不需要因为我在AS3的编程中养成了很长的习惯。
就我个人而言,我认为您在AS3中开发应用程序的次数越多,就像使用C ++开发一样,它获得的乐趣越多,代码的可重用性就越高。坚持下去..很快就会有一堆乱七八糟的代码,你会有一堆乱七八糟的动作文件大声笑......有点像双刃剑但是还有whatevs。
答案 1 :(得分:2)
嗯,您可以做的第一件事是将每个应用程序状态包装在MovieClip中。然后,您将能够为此MovieClip分配一个类,并在那里进行布线(事件和事物)。
个人而言,我会把时间表放在一起。以下是我的工作方式:
我在Flash Builder中创建了一个纯ActionScript项目。我在 lib 文件夹中添加了任何外部库。 我在Flash Pro中为我的资产创建了一个 fla 。这个fla导出一个swc,它链接到我的Flash Builder项目。
您还可以试用RobotLegs。这是一个微小的MVC框架,可以帮助您连接应用程序。
答案 2 :(得分:2)
首先,如果不是必须的,或者你不能使用代码,请不要在舞台上使用时间轴和元素。我的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..
当然,这种结构只是一个例子,可以按照你需要的任何方式进行组织。
除此之外,我尝试将逻辑部分与显示部分分开,有时也将数据部分分开。
每个项目我都建立了自己的外部库,在其中我为当前项目创建了可重用的类,我知道或者我认为它们将/可以在未来的项目中使用。
答案 3 :(得分:1)
使用MVC框架。有些人发现它们有限制,但每当我不使用一个“简单”项目时,范围就会增大,我对我做出的错误决定感到恐惧。
一个好的框架可以让您免于对某些应用程序方面做出决策,并允许您以一致的方式实现。
一个好的框架还允许你重用其他项目中的东西。
一个好的框架已经有很多人工时间沉入其中,并且会比大多数人在没有同样努力的情况下更好地思考。
我使用PureMVC,但任何流行的都应该有用。
答案 4 :(得分:1)
由于您来自OOP背景,因此您不应该遇到此问题。然而,通过快速阅读几本好书,可以轻松解决这个问题。
Essential 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
凭借你的OOP背景,这些都是完美的。
如果您获得一个大文件,那么显而易见的想法就是首先将事情分解为类。
如果不能在AS3中可靠地编写OOP代码,您将浪费时间使用MVC或任何其他设计模式。
答案 5 :(得分:1)
查看Robot Legs - 这是一个很棒的MVC框架,它真正帮助我编写了比我通常更清晰(更少!)的代码。
我还建议Robert Penner的Signals库有三个原因:1)它可以让你编写更少的代码2)类不再需要扩展EventDispatcher 3)我真的很喜欢它!
我不能强调使用MVC框架 - 它为组织代码提供的文件/文件夹结构是值得的。