AS3 addChild ().Ошибка переполнения стека - PullRequest
0 голосов
/ 10 января 2012

У меня проблемы с addChild () из класса.

У меня есть Ball класс:

package {
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.events.*;
import Achievement;
public class Ball extends Sprite {
    //the image I want to add
    var mc:MovieClip;

    public function Ball() {
        addEventListener(Event.ADDED, beginClass);
    }

    private function beginClass(event:Event):void {
        mc = new BallImage();
        addChild(mc);
    }

}
}

Где BallImage это мувиклип из библиотеки, экспортированный для ActionScript.

Я добавляю его в основную примерно так:

import Ball;
var littleBall:Ball = new Ball();
addChild(littleBall);
littleBall.x=100;
littleBall.y=100;

Изображение загружается очень хорошо, и я вижу его на экране.Но я получаю ошибку переполнения стека.Кажется, все работает просто отлично ... Так что я не могу понять, в чем проблема.

Редактировать: Если я переместить addChild () в конструктор Ball , ошибкауходит.Все еще не знаю, что это значит.Почему я не могу добавить его только при загрузке?

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Event.ADDED срабатывает каждый раз, когда объект или любой его дочерний элемент добавляется в список отображения. Так что он срабатывает один раз, когда вы добавляете Ball, а затем рекурсивно срабатывает каждый раз, когда вы добавляете BallImage в Ball.

Исправить:
Либо удалите прослушиватель событий в начале функции beginClass, либо используйте вместо него Event.ADDED_TO_STAGE (для которого вам, вероятно, следует также удалить прослушиватель после его запуска).

Если вам специально не нужно прослушивать эти события, вы также можете просто вызвать beginClass непосредственно из конструктора и вообще обойти события.

1 голос
/ 10 января 2012

Проблема в том, что вы никогда не очищаете свой прослушиватель событий.

private function beginClass(event:Event):void {
    removeEventListener(Event.ADDED, beginClass);  // add this line
    mc = new BallImage();
    addChild(mc);
}

Когда вы добавляете BallImage, он снова вызывает событие Event.ADDED, поэтому вам нужно удалить слушателя, прежде чем добавлять что-либоеще.

...