ActionScript 3 函数以不同 class 隐藏或显示当前舞台上的动画片段

ActionScript3 Function to hide or show movieclip currently on stage in a different class

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

  1. 我有 3 个不同的 classes,ConsStartMenu.as(文档 class),Menu.as(我想隐藏和显示的菜单) 和 SideMenu.as(包含我想点击以隐藏/显示菜单的按钮)。我正在从 ConsStartMenu.as 调用我的菜单和 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();
    

然后在按钮所在框架的操作上 -

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: Error #1009: Cannot access a property or method of a null object reference. at SideMenu/LinkOpenSideMenu()[SideMenu::frame1:9]

如有任何帮助,我们将不胜感激。

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

当您使用 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
    

    //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. ConStartMenu static 中创建 menuDisplay 变量。 (静态变量可以通过 class 本身访问,而不是实例化的一部分

    public static var menuDisplay:Menu = new Menu();
    
    //now you can access it anywhere in your app by doing:
    ConStartMenu.menuDisplay
    
  2. 利用出身来寻找。由于您的 ConStartMenu 实例是 SideMenu 的父实例,您可以使用父关键字访问 ConStartMenu 的任何 public methods/var:

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