0

因此,我的游戏菜单位于一个单独的 .fla 文件中,我使用了类似这样的加载器将菜单加载到我的游戏中:

package  {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.display.Stage;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.ui.Mouse;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.text.TextFormat;
import flash.text.TextField;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.system.LoaderContext;
import flash.display.Sprite;
import flash.net.Socket;
import caurina.transitions.Tweener;


public class Main extends MovieClip {

public static var gameLayer:Sprite = new Sprite;
public static var endGameLayer:Sprite = new Sprite;
public static var menuLayer:Sprite = new Sprite;

public var gameTime:int;
public var levelDuration:int;

public function Main()
{
    addChild(gameLayer);
    addChild(endGameLayer);
    addChild(menuLayer);

    var myMenu:Loader = new Loader();
    var url:URLRequest = new URLRequest("Menu.swf");
    myMenu.load(url);
    myMenu.contentLoaderInfo.addEventListener(Event.COMPLETE, menuLoaded);

    function menuLoaded(event:Event):void
    {
        menuLayer.addChild(myMenu.content);
    }

    playBtn.addEventListener(MouseEvent.CLICK, startGame);
}



public function startGame(e:Event)
{
    // Code to remove the menu (menuLayer.removeChild?)
    // Code here to start timers etc
}

我为我的按钮设置了实例名称,但是当我尝试做类似的事情时menuLayer.playBtn.addEventListener(MouseEvent.CLICK, startGame);,我收到消息说Access of undefined property playBtn

现在,我仔细检查了我的 Menu.fla,我确实给了按钮一个实例名称,playBtn但它不起作用。请问有什么帮助吗?可能是我错过的非常明显的事情,但我不确定是什么。

编辑:尝试另一种方式(将菜单转换为电影剪辑),但不能 100% 确定如何准确地做到这一点。我的代码是:

public class Main extends MovieClip {

var mainMenu:menuMain = new menuMain;
// Other variables

 public function Main()
   {
        addChild(gameLayer);
        addChild(endGameLayer);
        addChild(menuLayer);

        menuLayer.addChild(mainMenu);
        mainMenu.addEventListener(Event.COMPLETE, menuLoaded);
   }

   function menuLoaded(event:Event):void
   {
         //var mainMenu:LoaderInfo = event.currentTarget as LoaderInfo;
         //var menuInstance:MovieClip = menuLayer.getChildAt(0) as MovieClip;

         // now you can actually add the listener, because the content is actually loaded
        mainMenu.playBtn.addEventListener(MouseEvent.CLICK, startGame);
   }

    public function startGame(e:Event)
    {
       // Code to execute timers etc.
    }
4

1 回答 1

1

我的猜测是,你认为当你去menuLayer.addChild(myMenu.content)那个 menuLayer 突然变成了一个实例,menu.swf但事实并非如此。它成为 menuLayer 的子级。

尝试这个 :

menuLayer.addChild(myMenu.content);
var menuInstance:MovieClip = menuLayer.getChildAt(0) as MovieClip;
trace (menuInstance.playBtn);

此代码假定您没有向 menuLayer 添加任何其他内容,在这种情况下,您的 menu.swf 内容将是 menuLayer 显示列表中的唯一子项。

我还假设 menu.swf 的内容是一个 MovieClip。

如果我的假设是错误的,这可能行不通。

我还注意到您的构造函数中有 menuLoaded 方法。不是一个好主意。特别是因为下一行期望 playBtn 存在并且菜单甚至还没有加载。

尝试这样的事情:

public function Main()
{
    addChild(gameLayer);
    addChild(endGameLayer);
    addChild(menuLayer);

    var myMenu:Loader = new Loader();
    var url:URLRequest = new URLRequest("Menu.swf");
    myMenu.load(url);
    myMenu.contentLoaderInfo.addEventListener(Event.COMPLETE, menuLoaded);



}


function menuLoaded(event:Event):void
{
     var myMenu:LoaderInfo = event.currentTarget as LoaderInfo;
     menuLayer.addChild(myMenu.content);
     var menuInstance:MovieClip = menuLayer.getChildAt(0) as MovieClip;

     // now you can actually add the listener, because the content is actually loaded
     menuInstance.playBtn.addEventListener(MouseEvent.CLICK, startGame);
}


public function startGame(e:Event)
{

    // Code to remove the menu (menuLayer.removeChild?)
    // Code here to start timers etc
}
于 2013-05-11T18:36:50.227 回答