0

クラスからの 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 用にエクスポートされたライブラリ内の movieClip です

次のようにメインに追加します。

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

画像は問題なく読み込まれ、画面に表示されます。しかし、スタック オーバーフロー エラーが発生します。すべてがうまく機能しているようです...だから、何が問題なのかわかりません。

編集: addChild() をBallのコンストラクターに移動すると、エラーはなくなります。それが何を意味するのかはまだわかりません。読み込み時に追加できないのはなぜですか?

4

2 に答える 2

3

Event.ADDEDオブジェクトまたはその子のいずれかが表示リストに追加されるたびに起動します。したがって、Ballを追加すると1回起動し、Ballに新しいBallImageを追加するたびに再帰的に起動します。

修正するには:
beginClass関数の先頭でイベントリスナーを削除するか、Event.ADDED_TO_STAGE代わりに使用します(これは、起動後にリスナーも削除する必要があります)。

これらのイベントを特にリッスンする必要がない場合は、コンストラクターから直接beginClassを呼び出して、イベントを完全にバイパスすることもできます。

于 2012-01-10T17:09:41.120 に答える
1

問題は、イベント リスナーをクリーンアップしないことです。

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

BallImage を追加すると、Event.ADDED イベントが再びトリガーされるため、何かを追加する前にリスナーを削除する必要があります。

于 2012-01-10T17:11:53.520 に答える