Noob AS3关于使用事件处理程序从stage中删除MovieClip对象的问题

时间:2011-07-07 17:57:20

标签: actionscript-3 event-handling removechild

我是一个AS3菜鸟,只是想让我更舒服地使用Flash中的事件处理程序,并在我的应用程序中构建交互性。

在下面的代码中,我创建了一个名为LineChart1的DrawLineChart类的实例。当我测试电影时,它在舞台上显示得很好,当我点击它时,我可以使用trace命令来获取写入输出窗口的字符串语句。

但是,现在我希望能够在舞台上单击LineChart1并将其删除。当我这样做时,我收到一条错误消息1120:访问未定义属性LineChart1。

有人可以向我解释为什么我无法引用我的实例LineChart1以及我需要做什么以便我可以参考它并在点击它时将其删除?另外,我很想知道为什么trace语句在运行时单击LineChart1时有效,而不是removechild命令。

如果这个问题太简单,我很抱歉,但请提前感谢大家的帮助。对此,我真的非常感激。

package{
import flash.display.*;
import flash.events.*;

public class Main extends MovieClip{ 

var recWidth:Number = 250;
var recHeight:Number = 550;
var recX:Number = 50;
var recY:Number = 50;
var recScaleY:Number = 30;

public function Main(){

var LineChart1 = new DrawLineChart(recX, recY, recWidth, recHeight, recScaleY);
LineChart1.addEventListener(MouseEvent.CLICK, onClickHandler);
addChild(LineChart1);
}

function onClickHandler(e:Event):void{
trace("hello"); // This works.  When I click on the LineChart1 MovieClip on the stage during runtime, I get "hello" as an output.
removeChild(LineChart1); // throws an error 1120: Access of undefined property LineChart1.  Why?  
}
}
}

3 个答案:

答案 0 :(得分:0)

您的问题是您已将LineChart1定义为局部变量。这意味着因为你在一个函数中声明它,它只在该函数中可见。

LineChart1成为您班级的属性,然后您就可以从事件处理程序中看到它。或者,使用e.target as DrawLineChart

答案 1 :(得分:0)

您的变量本地范围为Main,您需要将其声明为实例变量(类级别),以正确定义其范围。

private var _lineChart1:DrawLineChart; 

//main function
_lineChart1 = new DrawLineChart(...

//handler function
this.removeChild(_lineChart1);

有关AS3范围的更多信息,请查看livedocs

干杯

答案 2 :(得分:0)

所有答案都很好,但如果你在舞台上有一个以上的答案你能做什么? 您可以使用数组来获取mc的列表,然后您可以使用该数组删除舞台上的mc。 这是一个简单的例子:

  package
 {

    import flash.display.*;

    import flash.events.*;

    public class Main extends MovieClip{ 

    private var recWidth:Number = 250;
    private var recHeight:Number = 550;
    private var recX:Number = 50;
    private var recY:Number = 50;
    private var recScaleY:Number = 30;
    private var lineArray:Array = new Array();

    public function Main()
    {
        for(var i:int = 0;i<10;i++)
        {
            var LineChart1 = new DrawLineChart(recX, recY, recWidth, recHeight, recScaleY);
            LineChart1.addEventListener(MouseEvent.CLICK, onClickHandler);
            LineChart1.name = line+i.toString(); // u can use whatever u want for name's
            lineArray.push(lineChart1);
            addChild(LineChart1);
        }
        //if u want to place this 10 LineChart1 u can set x and y values like recX += recX and ect.
    }
    private   function onClickHandler(e:Event):void
    {
        //when u click one of your LineChart1 and want to remove it from stage u can use this
        trace(e.currentTarget.name); // if u want to see what is the name of ur mc
        var myId:String = e.currentTarget.name.substring(4,10);
        removeChild(getChildByName("line"+myId));
    }
}

希望它适用于你