Actionscript 3 AS3:从舞台上的电影剪辑进入我的主页
使用Adobe Flash Professional CS6,AS3Actionscript 3 AS3:从舞台上的电影剪辑进入我的主页,actionscript-3,flash,menu,navigation,movieclip,Actionscript 3,Flash,Menu,Navigation,Movieclip,使用Adobe Flash Professional CS6,AS3 如果我需要提供更多信息,请告诉我 我正在尝试设置一个导航菜单,我的问题是,“如何让MovieClip从Stage调用Main.as文件中的函数?”只有一个帧(我不需要更多),不同的菜单屏幕(只是MovieClip)在需要时添加到Stage中。我在文件Main.com中有一个公共函数,名为\u About(),我的MovieClip“MenuScreen”无法访问该函数。我可以成功地让_Menu()使用eventListener
如果我需要提供更多信息,请告诉我
我正在尝试设置一个导航菜单,我的问题是,“如何让MovieClip从Stage调用Main.as文件中的函数?”只有一个帧(我不需要更多),不同的菜单屏幕(只是MovieClip)在需要时添加到Stage中。我在文件Main.com中有一个公共函数,名为\u About(),我的MovieClip“MenuScreen”无法访问该函数。我可以成功地让_Menu()使用eventListeners将MovieClip添加到舞台上,但当mc回拨更改屏幕时,我收到以下错误: TypeError:错误#1034:类型强制失败:无法转换闪存。显示::Stage@51ca0d1要闪烁.display.MovieClip。在MenuScreen/clickAbout()[MenuScreen::frame1:32] Frame1:32的代码是:
MovieClip(parent)._About();
我的Main.as中的第51行:
public function _About():void
{
trace("The About Function");
}
下面我详细介绍了Main.as和大部分脂肪修剪
package
{
import stuff
public class Main extends MovieClip
{
//Load the screen MCs onto the stage
public var _menu:MenuScreen = new MenuScreen();
public var _about:AboutScreen = new AboutScreen();
public var isMenu:Boolean = true;
public var isAbout:Boolean = false;
public function Main()
{
_Menu();
}
public function _Menu():void
{
isMenu = true;
stage.addChild(_menu);
}
public function _About():void
{
trace("The About Function");
}
查看
MenuScreen
的完整类会有所帮助,但下面是可能发生的情况:
您正在public var_菜单上实例化:MenuScreen=new MenuScreen()当发生这种情况时,它可能会在您将MenuScreen
添加到stage.addChild(\u菜单)的stage之前调用MovieClip(parent)。\u About()
代码>-发生这种情况并导致错误时,它还没有父级
有两种方法可以解决这个问题:
- 在引用
Main
类的MenuScreen
构造函数中添加所需参数。MenuScreen
中的构造函数将以public function MenuScreen($main:main){
开始,当您从main
类实例化MenuScreen
时,您将编写public var\u菜单:MenuScreen=new MenuScreen(this);
现在您可以在MenuScreen
的构造函数中使用$main.\u About()
- 在
MenuScreen
的构造函数中添加一个侦听器,用于检查何时将其添加到后台:addEventListener(Event.added_to_stage,addedStage)
。在函数addedStage
中,您可以正确调用父级或后台,并且MovieClip(parent)。\u About()
可能在这里起作用
设置静态属性:
public static var instance:Main;
public function Main(){
instance = this;
_Menu();
}
然后从任何可以使用代码的地方:
Main.instance._About();
解决问题的一个简单方法是将菜单项不添加到后台!而是将它们添加到主类中。这样,项目的父级将改为main.as
但是,您需要将父对象强制转换为主对象
Main(parent)._About();
也不是很好。物品现在不应该是它们后面的东西
最好的方法是从不同的屏幕发送事件。
意思是:你创建你的屏幕对象,当屏幕发生变化时,你会发送自定义事件
dispatchEvent(new Event("showAbout"));
在主类中,您可以处理以下事件:
public function Main()
{
_Menu();
_menu = new MenuScreen();
_menu.addEventHandler("showAbout", showAboutHandler);
}
public function showAboutHanlder(e:Event):void
{
_About();
}
更好的方法是使用屏幕标识符作为参数的自定义事件。这样,您只需添加一个处理程序,并在处理程序代码中决定要显示哪个屏幕
事件处理就绪后,您的菜单项与main没有直接连接。main也不需要有关屏幕类的更多信息。您的命名约定是您自己的,但是我需要问一下,为什么您使用\u Caps
作为公共方法,而\u
通常用于私人成员和所有成员BER是pascalCase
。虽然这是绝对可行的,但它不是一个好的设计模式。根据应用程序的大小/复杂性,您应该努力避免使用系统中任何其他对象都可以访问的公共静态变量。这基本上是一个相当粗心的单例。它将d到难以调试的意大利面代码。一个可能更健壮的解决方案是使用提供更通用功能的命令模式或实用程序类。是的,您将拥有多少主要实例项?始终是1。难以调试?我不知道为什么…我知道这不是一个好的设计模式,但却是最好的解决方案在类似于flash timeline的小型应用程序中。当全局作用域中有可用的内容时,可以在程序中的任何其他位置调用、访问或修改。随着应用程序的增长,这可能会导致问题。@Larusso使用事件传输触发功能的消息的想法是正确的。@turbosqel-谢谢太多了!虽然这种方法在这里似乎不是最流行的,但它确实满足了我的需要,对我来说非常有意义。我知道,一直都可以在全球范围内访问某些东西应该是不好的做法,但这正是我想从我的主类中得到的。我对这种方法还不太熟悉,所以我可能会看到我的wa的错误总有一天…别忘了它对小应用的好处。当你制作更大的东西时,使用事件。