ActionScript3隐藏或显示当前在不同类

时间:2015-05-14 18:36:55

标签: actionscript-3 flash actionscript

你好可爱的Actionscript人。我在创建一个使用AS3的按钮时遇到了一些问题,该按钮可以隐藏或显示由不同类调用的特定动画片段。老实说,我认为我的问题是我没有从根本上理解在AS3中使用的OOP /类,但是我会在这里发布我对这个问题的理解 -

  1. 我有3个不同的类,ConsStartMenu.as(文档类),Menu.as(我要隐藏和显示的菜单)和SideMenu.as(包含我想要的按钮)点击隐藏/显示菜单)。我正在调用ConsStartMenu.as的Menu和SideMenu MovieClips的显示。相关代码在这里 -

    public var menuDisplay:Menu = new Menu();
    public var sidemenuDisplay:SideMenu = new SideMenu();
    
    public function ConsStartMenu():void  {
        stage.addChild(menuDisplay);
        menuDisplay.x=stage.stageWidth * .5;
        menuDisplay.y=stage.stageHeight * .5;
        stage.addChild(sidemenuDisplay);
        sidemenuDisplay.x=stage.stageWidth*.98;
        sidemenuDisplay.y=stage.stageHeight*.5;
    }
    
  2. 在我的SideMenu.as中,我有这段代码来引用我认为的菜单吗?在舞台上 -

    public var centerMenu:Menu = new Menu();
    
  3. 然后按下按钮所在框架的动作 -

    import flash.events.MouseEvent;
    
    stop();
    
    OpenSideMenu.addEventListener(MouseEvent.CLICK, LinkOpenSideMenu);
    
    function LinkOpenSideMenu(event:MouseEvent):void {
        if (centerMenu.parent.stage){
            trace ("center Menu is in display list");
            centerMenu.parent.removeChild(centerMenu);
        }
        else
        {
            trace("Adding menu back to stage");
            centerMenu.parent.addChild(centerMenu);
        }
    }
    

    当我点击按钮时,我从中得到了这个错误 -

      

    TypeError:错误#1009:无法访问空对象引用的属性或方法。       在SideMenu / LinkOpenSideMenu()[SideMenu :: frame1:9]

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您的问题是对象引用和实例化之间的混淆。

使用new关键字时,您正在创建一个全新的对象。

当你这样做时ConStartMenu

public var menuDisplay:Menu = new Menu();

您正在创建一个新的Menu对象。

而且,在SideMenu执行此操作时:

public var centerMenu:Menu = new Menu();

您正在创建第二个Menu对象(与第一个无关)。

您想要的是对创建的第一个菜单的引用。

有几种方法可以做到这一点:

  1. 将引用传递给SideMenu的构造函数。

    public var menuDisplay:Menu;
    public var sidemenuDisplay:SideMenu;
    
    public function ConsStartMenu():void  {
        menuDisplay = new Menu();
        sidemenuDisplay:SideMenu = new SideMenu(menuDisplay);
        //...rest of code
    
  2.     //then in your side menu class:
    
        public var centerMenu:Menu;
        public function SideMenu(menu:Menu){
            centerMenu = menu;
            //now you have a reference to the menu
        }
    
    1. menuDisplay ConStartMenu中设置static var。 (静态变量可以通过类本身访问,而不是实例化的一部分

      public static var menuDisplay:Menu = new Menu();
      
      //now you can access it anywhere in your app by doing:
      ConStartMenu.menuDisplay
      
    2. 使用parentage查找它。由于您的ConStartMenu实例是SideMenu的父级,因此您可以使用父关键字访问ConStartMenu的任何公共方法/ var:

      //from within SideMenu
      parent.menuDisplay;
      
      //or, to avoid a warning, tell the compiler that parent is of type ConStartMenu (cast)
      ConStartMenu(parent).menuDisplay