使用类来处理多个嵌套的动画片段及其特定事件

时间:2013-04-07 16:21:59

标签: actionscript-3

我有一个带五个按钮的菜单。菜单始终可见。每个菜单项都有click事件。从左到右滑动相应的影片剪辑。每个影片剪辑都有不同的自然事件和各自的动画和活动。例如,选项卡1带来视频页面。在该影片剪辑中,我有视频事件,如播放暂停音量和完整等事件和代码。选项卡2具有时间按钮组和另一个按钮组功能。根据用户选择代码将计算并显示动画计数器上的值。选项卡3具有时间和按钮组源的按钮组。根据用户选择,它将计算并将值显示为动画图形。等等。

现在我将所有单独的标签影片剪辑都有自己的时间线代码用于自己的事件。和一些交叉变量和其他标签的引用。一切都按预期工作。没问题。我知道时间线代码不是进行任何复杂项目的最佳方式。

所以,如果这是正确的方法,我想将整个编码作为一个或多个类。 就初级逻辑而言,我是初学者。我已经创建了Main作为文档类,可以控制选项卡的常规导航及其初始外观。但坚持使用特定于标签的按钮事件以及特定选项卡的其他此类唯一事件。

非常感谢任何帮助。提前致谢。 任何类似的例子或建议。

首先,非常感谢您的快速反应。好像我甚至不是初学者。我需要阅读很多,并且可以彻底地掌握所有基本概念。我已经浏览了您的评论中建议的链接。我想慢慢消化这些东西。我没有关于OOP或任何类型的编程的正式非正式教育。说实话,我很难理解你提出的代码。不是因为你的代码,而是因为我的水平。我将不得不花费一些时间让自己更清楚地了解事件和序列等。不同的标签内容作为主要时间轴的动画片段并已经放在舞台上。它来到相应的标签按钮点击事件。我没有把你的答案标记为是,因为我仍然需要根据你的建议做我自己的作业。再次感谢你。我相信我稍后会再问几个问题。

1 个答案:

答案 0 :(得分:0)

这是我设计它的方式:

我有一个菜单类,包含按钮,并将其点击“转换”为更具体的事件。这可能看起来像这样:

public Class Menu extends Sprite {
     protected var buttons:Vector. = new Vector.();
     public function Menu() {
         super();
         var loops:int = numChildren;
         for (var i:int=0; i<loops; i++) {
            var button:SimpleButton = getChildAt(i) as SimpleButton;
            if (button) {
                buttons[buttons.length] = button;
                button.addEventListener(MouseEvent.CLICK, broadcastMenuEvent);
            }
         }
     }
     public function broadcastMenuEvent(e:Event):void {
         var button:DisplayObject = e.currentTarget as DisplayObject;
         dispatchEvent(new Event(button.name, true));//bubbling, can catch at any level
     }
}

构建它的方式,您只需更改在舞台上为按钮实例提供的名称即可更改正在调度的事件。请注意,如果您未选中“自动声明实例”,则需要将Menu作为基类而不是类来实现,因为这样做可以让编译器以基类的方式为您生成这些实例名称不必了解。

此时,您可以在另一个地方处理这些事件 - 无论是您的主要文档类还是您有一个单独的控制器。

我会将您描述的每个视图定义为一个单独的类。如果舞台上有对象进出,你可以使用described here之一来处理它。否则,从基类而不是时间轴代码处理时间轴实例是相当简单的。同样,您可以在主文档类或专用控制器中监听这些事件 - 重点是确保您的视图不做任何重要决策,通常它们不应该编辑数据。

您可以选择让您的主文档协调添加和删除标签的方式(我非常喜欢使用goToAndStop时间轴,但不是每个人都分享这个偏好),或者,您可以再次分离这个逻辑出一个专门的控制器。我建议如果可以概括一下你的意见如何让他们实现一个Interface。这样,您可以为它们提供单个实例名称,并使用相同的getter / setter对管理它们(假设您使用时间轴路径)。

请注意,Flash编译器在这方面并不十分复杂,因此如果您执行此操作并且您的Views扩展了不同的父类,您将收到编译器警告。只要忽略这些 - 它们没有任何意义。

你试图完全根除代码的东西是视图相互引用的部分。唯一一个可以接受一个视图来了解另一个视图的时间是父母知道它的孩子。即便如此,尽量少掌握具体的知识。请注意我在菜单视图中写的一个例子,父母只知道可能是一些SimpleButtons,但它没有具体知道他们在舞台上的位置,具体是什么,在其中,或者甚至那些实例名称都是。

不要让你的观点彼此了解,而是让第三方(你可以再次选择使用主文件类)来传递状态变化请求(以事件的形式)到另一个。