【问题标题】:Event listener on button not working按钮上的事件侦听器不起作用
【发布时间】:2013-05-11 16:12:30
【问题描述】:

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

【问题讨论】:

  • menuLayer 到底是什么?它是您通过链接类名称实例化的库中的符号吗?您需要按原样发布更多代码。如果您在该行收到错误,那是因为 menuLayer 没有 playBtn。我相信这个错误是正确的。
  • 我猜,但可能是一个问题,因为您没有直接将加载程序添加到显示列表(我知道您正在添加加载的内容,但加载程序可能不喜欢这种方式)。试试“menuLayer.addChild(myMenu);”在 menuLoaded 方法而不是当前代码中
  • 更新了代码。 Access of undefined property playBtn 错误是我目前唯一的错误。使用“menuLayer.addChild(myMenu);”在 menuLoaded 方法中给出了相同的错误。
  • 在您发布的代码中,您编写了 playBtn.addEventListener(MouseEvent.CLICK, startGame);,而在 cmets 中,您使用了正确的语法,即 menuLayer.playBtn.addEventListener(MouseEvent.CLICK, startGame);。是哪一个?
  • 无论如何,它们都会给出相同的错误。我都试过了。

标签: actionscript-3 flash flash-cs6


【解决方案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
}

【讨论】:

  • Menu.swf 由一个静态文本项和四个按钮组成,但按钮是我想要添加事件处理程序的唯一内容。
  • menu.swf 的舞台上都是这些东西吗?按钮的实例名称是 playBtn 吗?检查属性面板以确保按钮具有实例名称playBtn。请记住,符号名称不是实例名称。
  • 是的,所有这些对象都在舞台上。我检查了属性面板,实例名称肯定设置为playBtn
  • 我不会在这里玩字谜调试器。如果上述代码不起作用,这可能是您的内容设置不正确的问题。您可以将有问题的文件发送到prototype.in.training@gmail.com,我可以查看它们。您发布的代码与您在 cmets 中所说的内容不一致,所以我宁愿将这方面排除在外。
  • 好的,更新了我的答案,如果您的内容如您所说,这应该可以工作。您还试图在内容存在之前添加该侦听器。而且您的语法假定 playBtn 作为类变量存在,但它不存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2017-07-07
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
相关资源
最近更新 更多