Вопрос Noob AS3 относительно использования обработчиков событий для удаления объекта MovieClip со сцены - PullRequest
0 голосов
/ 07 июля 2011

Я новичок AS3, просто пытаюсь более комфортно работать с обработчиками событий во Flash и встроить интерактивность в мое приложение.

В приведенном ниже коде я создал экземпляр класса DrawLineChart с именем LineChart1.Когда я тестирую фильм, он замечательно появляется на сцене, и когда я нажимаю на него, я могу использовать команду трассировки для получения строкового оператора, записанного в окне вывода.

Однако теперь я хочу иметь возможность щелкнуть 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 голосов
/ 07 июля 2011

Ваша переменная имеет локальную область действия Main, вам необходимо объявить ее как переменную экземпляра (уровень класса), чтобы правильно определить ее область действия.

private var _lineChart1:DrawLineChart; 

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

//handler function
this.removeChild(_lineChart1);

Для получения дополнительной информации о области действия в AS3 = проверьте aliveocs .

Приветствия

0 голосов
/ 14 августа 2015

Все ответы хорошие, но если у вас на сцене больше одного, что вы можете сделать? Вы можете использовать массив, чтобы взять список ваших 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));
    }
}

надеюсь, что это работает для вас

0 голосов
/ 07 июля 2011

Ваша проблема в том, что вы определили LineChart1 как локальную переменную.Это означает, что, поскольку вы объявляете его внутри функции, он виден только внутри этой функции.

Сделайте LineChart1 свойством вашего класса, тогда вы сможете увидеть его из своего обработчика событий.Или используйте e.target as DrawLineChart.

...