2012-01-10 3 views
0

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

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

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, ошибка исчезнет. Все еще не знаю, что это значит. Почему я не могу добавить его только тогда, когда он загружается?

+0

Что происходит в классе 'BallImage'? –

+0

Отредактировано (BallImage - это мувиклип в библиотеке). – Skuge

+0

Вставьте сообщение переполнения стека –

ответ

3

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

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

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

+0

Также эта тема может быть полезна для понимания разницы между ADDED и ADDED_TO_STAGE: http://www.actionscript.org/forums/showthread.php3?t=220154 – Cadin

+0

Именно это, спасибо. Кроме того, возникает ошибка, возникающая из-за того, что я перезаписываю переменную mc? – Skuge

+0

Нет, ошибка исходит из того, что функция beginClass эффективно вызывает себя бесконечно до тех пор, пока программа не сработает. – Cadin

1

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

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

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

Смежные вопросы