0

我将不胜感激在这个问题上的一些帮助。我想出的代码是如此混乱,以至于我宁愿从头开始以获得正确的想法。

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

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

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

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

4

1 回答 1

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;
        }
    }

}

简而言之,尽可能避免直接与兄弟类对话,并将父级与子级之间的交互限制为暴露的公共属性。公开尽可能少的属性。

于 2013-04-30T16:40:29.000 回答