按钮上的事件监听器不工作

时间:2013-05-11 16:12:31

标签: actionscript-3 flash flash-cs6

所以,我的游戏菜单是在一个单独的.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.
    }

1 个答案:

答案 0 :(得分: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
}