AS3:通过带有静态类型Class的引用调用可能未定义的方法addEventListener

时间:2014-07-15 07:20:59

标签: actionscript-3 flash

我收到以下错误:

  

场景1,图层'动作',第1帧,第110行,第14列1061:通过具有静态类型Class的引用调用可能未定义的方法addEventListener。

     

场景1,图层'动作',第1帧,第113行,第14列1061:通过具有静态类型Class的引用调用可能未定义的方法removeEventListener。

     

场景1,图层'动作',第1帧,第128行,第14列1061:通过带有静态类型Class的引用调用可能未定义的方法addEventListener。

     

场景1,   图层'操作',第1帧,第131行,第14列1061:调用可能的   undefined方法removeEventListener通过带有static的引用   类型。

代码部分是:

    function allowTapCaveman():void {
/*line 110*/    btn_caveman.addEventListener(TouchEvent.TOUCH_TAP, btn_cavemanMenu);
    }
    function cancelTapCaveman():void {
/*line 113*/    btn_caveman.removeEventListener(TouchEvent.TOUCH_TAP, btn_cavemanMenu);
    }
    function allowTapCavemanClose():void {
/*line 128*/    btn_caveman.addEventListener(TouchEvent.TOUCH_TAP, btn_cavemanMenuClose);
    }
    function cancelTapCavemanClose():void {
/*line 138*/    btn_caveman.removeEventListener(TouchEvent.TOUCH_TAP, btn_cavemanMenuClose);
    }

btn_caveman是一个动画片段(是的,我知道我有'btn')通过数组在舞台上调用;

var startingcaveman:Array = new Array();
for (var i:Number = 0; i<2; i++) {
    startingcaveman.push(new btn_caveman());
    addChild(startingcaveman[i]);
    startingcaveman[i].name = 'startingcavemen' +i;
    startingcaveman[i].x = Math.random()*550;
    startingcaveman[i].y = Math.random()*400;
}
    startingcaveman[0].x = 213.60;
    startingcaveman[0].y = 312.90;
    startingcaveman[1].x = 211.75;
    startingcaveman[1].y = 400.15;
    stage.addEventListener(Event.ENTER_FRAME, example);
    function example (evt:Event) {
        for each (var btn_caveman in startingcaveman) {
            addEventListener(TouchEvent.TOUCH_TAP, btn_cavemanMenu3);
        }
    }

这可能是如此简单,但我无法得到它,这让我感到烦恼。

2 个答案:

答案 0 :(得分:1)

简单的答案可以让你解决问题,并考虑到你的编码风格,也可以解决许多未来的问题:

您不能将变量名称用作类的名称。在您的情况下,您有一个名为btn_caveman的类,但稍后您尝试使用名为btn_caveman的变量。不要那样做。

如果您遵循编码约定,您将永远不会遇到这类问题。类名应该是这样的:

ButtonCaveman

变量名应该是这样的:

buttonCaveman

答案 1 :(得分:0)

这应该是

var startingcaveman:Array = [];
for (var i:Number = 0; i<2; i++) {
  // symbols should start with an upcase letter,
  // because they're classes
  // stick to "Caveman" for example
  var btn:MovieClip = new btn_caveman();
  startingcaveman.push(btn);
  addChild(btn);
  btn.name = 'startingcavemen' +i;
  btn.x = Math.random()*550;
  btn.y = Math.random()*400;
}

startingcaveman[0].x = 213.60;
startingcaveman[0].y = 312.90;
startingcaveman[1].x = 211.75;
startingcaveman[1].y = 400.15;
stage.addEventListener(Event.ENTER_FRAME, example);

function example (evt:Event) {
    // here was the error. you used the class name.
    // that's why naming is important!
    for each (var btn in startingcaveman) {
        btn.addEventListener(TouchEvent.TOUCH_TAP, btn_cavemanMenu3);
    }
}