【问题标题】:How do I access a movieClip on the stage using as3 class?如何使用 as3 类访问舞台上的电影剪辑?
【发布时间】:2011-09-02 18:12:48
【问题描述】:
public class MyClass extends MovieClip {
            public function MyClass():void {
                my_mc.addEventListener(MouseEvent.CLICK, action);
            }
            private function action(e:MouseEvent):void {
                trace("cliked");
            }
        }

时间线代码

 var myClass:MyClass = new MyClass();
    addChild(myClass);

我无法访问 my_mc(放置在 FLA 中)影片剪辑。如何访问?

【问题讨论】:

  • 您是否手动添加了my_mc 对象,如果是,它的实例名称是否为“my_mc”?还是您以编程方式添加了my_mc 显示对象?如果是这样,它在时间线上是否带有代码stage.addChild(my_mc);addChild(my_mc);?还是只是在库中并在第一帧导出为动作脚本?
  • 我在舞台上画了一个MC,我给了一个实例名my_mc

标签: actionscript-3 actionscript flash-cs3


【解决方案1】:

试试这个:

public class MyClass extends MovieClip
{
    public function MyClass()
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);

    }// end function

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);

        var myMc:MovieClip = stage.getChildByName("my_mc") as MovieClip;
        // var myMc:MovieClip = parent.getChildByName("my_mc") as MovieClip;

        myMc.addEventListener(MouseEvent.CLICK, onMyMcClick)

    }// end function

    private function onMyMcClick(e:MouseEvent)
    {
        trace("clicked");

    }// end function

}// end class

如果这不起作用(我认为它不会起作用),那是因为您的 my_mc 显示对象不是舞台的子对象,而是 MainTimeline 实例的子对象。如果是这样,那么只需将上面代码中的以下语句注释掉:

var myMc:MovieClip = stage.getChildByName("my_mc") as MovieClip;

并取消注释上面代码中的以下语句:

// var myMc:MovieClip = parent.getChildByName("my_mc") as MovieClip;

如果我的假设是正确的,my_mcmyClass 显示对象共享同一个父对象。

【讨论】:

  • MovieClip(parent).my_mc.addEventListener(MouseEvent.CLICK, onMyMcClick); 工作...谢谢。
  • 显示对象共享同一个父对象。我没听懂。你能解释一下吗?
  • "my_mcmyClass 显示对象共享同一个父级",基本上它们都是同一显示对象容器的子级,即 MainTimeline显示对象容器。
  • MainTimelinestage 是否不同?
  • 查看kirupa.com/forum/… 上的“stage、root 和 MainTimeline 如何融合”帖子,这是我了解MainTimeline 的地方。
【解决方案2】:

如果my_mc 是MyClass 舞台上的MovieClip,您可能试图过早地访问它。构造函数代码通常在绘制第一帧之前执行,因此您需要通过侦听Event.ADDED_TO_STAGE 来等待该绘制发生:

public class MyClass extends MovieClip {
    public function MyClass():void {
        if(stage) {
            init();
        } else {
            addEventListener(Event.ADDED_TO_STAGE,init);
        }
    }

    private function init(e:Event = null):void {
        if(e) removeEventListener(Event.ADDED_TO_STAGE,init);
        stage.my_mc.addEventListener(MouseEvent.CLICK, action);
    }

    private function action(e:MouseEvent):void {
        trace("cliked");
    }
}

【讨论】:

  • 不...不工作。如果我使用MyClass 作为文档类,那么它就可以工作了。
  • 好的,那么my_mc 是什么?它是主时间线上的对象还是 MyClass 中的对象?你得到什么错误?
  • 是舞台上的对象。 1120: Access of undefined property my_mc.
  • 啊,好的,看看我的编辑。您只需要查找stage.my_mc,因此您仍然需要我提供的代码来确保舞台对象可用。
猜你喜欢
  • 2011-05-27
  • 1970-01-01
  • 2014-01-04
  • 2013-04-08
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多