你好可爱的Actionscript人。我在创建一个使用AS3的按钮时遇到了一些问题,该按钮可以隐藏或显示由不同类调用的特定动画片段。老实说,我认为我的问题是我没有从根本上理解在AS3中使用的OOP /类,但是我会在这里发布我对这个问题的理解 -
我有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;
}
在我的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:错误#1009:无法访问空对象引用的属性或方法。 在SideMenu / LinkOpenSideMenu()[SideMenu :: frame1:9]
非常感谢任何帮助。
答案 0 :(得分:0)
您的问题是对象引用和实例化之间的混淆。
使用new
关键字时,您正在创建一个全新的对象。
当你这样做时ConStartMenu
:
public var menuDisplay:Menu = new Menu();
您正在创建一个新的Menu
对象。
而且,在SideMenu
执行此操作时:
public var centerMenu:Menu = new Menu();
您正在创建第二个Menu
对象(与第一个无关)。
您想要的是对创建的第一个菜单的引用。
有几种方法可以做到这一点:
将引用传递给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
}
在menuDisplay
ConStartMenu
中设置static
var。 (静态变量可以通过类本身访问,而不是实例化的一部分
public static var menuDisplay:Menu = new Menu();
//now you can access it anywhere in your app by doing:
ConStartMenu.menuDisplay
使用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