AS3 - 来自另一个类的一个类中的调用函数

时间:2013-04-30 15:22:27

标签: actionscript-3 class event-listener

我很感激在这个问题上提供一些帮助。我提出的代码非常混乱,我宁愿从头开始以获得正确的想法。

  • 我有一个主要类的应用程序。
  • 在该类中定义了应用程序类和容器的实例,并使用addChild();
  • 将其添加到显示列表中
  • 添加了名为“应用程序”的影片剪辑,添加时会在容器中显示它们的图标
  • 我想要的是点击图标中的一个按钮,该按钮调用“应用程序”中的一个功能
  • 该函数最终会改变应用程序的某些属性,例如大小,位置,或将其从显示列表中删除。

我会发布一张图片,但看起来我不被允许。

任何一般建议如何做到这一点?我对AS3不太好,但我对一些东西很熟悉。我认为我缺乏一般逻辑......

我想我应该在类之间传递一些引用,但是我真的很困惑应该定义实例的位置等等。我也遇到了一些问题,如果它们在嵌套的影片剪辑(容器中的图标中的按钮)中,事件监听器将无法工作

1 个答案:

答案 0 :(得分:0)

单击该图标时,将生成MouseEvent。您可以通过以下两种方式之一处理:您的图标可以将此常规事件转换为更符合您自己需求的自定义事件类型,并从图标的基类中调度 事件,或者您可以只需在更高级别侦听MouseEvent,然后在那里做出反应。

我将发布一个后一种方法可能会是什么样子的例子,但是因为我发现手动实例化和定位是无聊的,重复的,而且通常很讨厌,我会把它写成好像一切都是实际定位的在IDE的舞台上:

public class Container extends Sprite {
    protected var childApps:Vector.<Application> = new Vector.<Application>();
    protected var _activeApp:Application;
    public function Container() {
        super();
        for (var i:int=0; i &lt; numChildren; i++) {
            var childApp:Application = getChildAt(i) as Application;
            if (childApp) {
                childApps[childApps.length] = childApp;
                childApp.addEventListener(MouseEvent.CLICK, setActiveApp);
            }
        }
    }
    protected function setActiveApp(e:Event):void {
        _activeApp = e.currentTarget as Application;
    }

    public function get activeApp():void {
        return _activeApp;
    }
}

/****************************/

public class MainClass extends MovieClip {

    public var container:Container;
    public var growIcon:Icon;
    public var shrinkIcon:Icon;

    public function MainClass() {
        super();
        stop();
        if (growIcon) {
            growIcon.addEventListener(MouseEvent.CLICK, grow);
            shrinkIcon.addEventListener(MouseEvent.CLICK, shrink);
        }
    }
    protected function grow(e:MoudeEvent):void {
        if (container && container.activeApp) {
            var newScale = container.activeApp.scaleX * 1.5;
            container.activeApp.scaleX = container.activeApp.scaleY = newScale;
        }
    }

    protected function shrink(e:MoudeEvent):void {
        if (container && container.activeApp) {
            var newScale = container.activeApp.scaleX * .75;
            container.activeApp.scaleX = container.activeApp.scaleY = newScale;
        }
    }

}

简而言之,避免在可能的情况下直接与兄弟类进行对话,并限制从父对象到子对象的交互到公开的属性。泄露尽可能少的财产。