(section07-02 表示リストから抜粋)
表示オブジェクトをメモリから消去する場合、イベントのリスナー関数を登録したままだとイベントが発生したタイミングで参照エラーになるので注意が必要です。表示オブジェクトを表示リストから取り除く際には、登録しておいたイベントのリスナー関数を忘れずに取り除かなければなりません。Event.ENTER_FRAMEイベントなどは表示リストに登録していなくてもイベントが発生します。
次のサンプルは、FlowerAクラスのインスタンスを再生イベントの繰り返しを利用して作成し、ステージの上から下へと回転しながら降らせるムービーです。このサンプルではインスタンスを大量に作成しますが、作成してすぐに表示リストに追加するので、アニメーションの途中でメモリから消去されてエラーになることはありません。また、インスタンスを回転しながら降らせるためにインスタンスに再生イベントのリスナーonFrowerStep()を登録していますが、表示リストから消去する前にこのリスナー関数も取り除いています。
→swfを試す
表示オブジェクトをメモリから消去する場合、イベントのリスナー関数を登録したままだとイベントが発生したタイミングで参照エラーになるので注意が必要です。表示オブジェクトを表示リストから取り除く際には、登録しておいたイベントのリスナー関数を忘れずに取り除かなければなりません。Event.ENTER_FRAMEイベントなどは表示リストに登録していなくてもイベントが発生します。
次のサンプルは、FlowerAクラスのインスタンスを再生イベントの繰り返しを利用して作成し、ステージの上から下へと回転しながら降らせるムービーです。このサンプルではインスタンスを大量に作成しますが、作成してすぐに表示リストに追加するので、アニメーションの途中でメモリから消去されてエラーになることはありません。また、インスタンスを回転しながら降らせるためにインスタンスに再生イベントのリスナーonFrowerStep()を登録していますが、表示リストから消去する前にこのリスナー関数も取り除いています。
→swfを試す
[:script:]ステージの外に出たら表示リストから消す
//再生イベントでonNewFrower()を繰り返し実行する addEventListener(Event.ENTER_FRAME, onNewFrower); function onNewFrower(eventObj:Event):void { if (Math.random()<0.3) { //約30%の確率でflower_mcインスタンスを作る var flower_mc:FlowerA=new FlowerA(); //最初の位置をステージより上に隠れたランダムな位置にする flower_mc.x=stage.stageWidth*Math.random(); flower_mc.y=-20; //スケールを0.5〜1.5のランダムな大きさにする flower_mc.scaleX=flower_mc.scaleY=Math.random()+0.5; //表示リストに追加する addChild(flower_mc); //再生イベントのリスナー関数にonFrowerStepを登録する flower_mc.addEventListener(Event.ENTER_FRAME, onFrowerStep); } } //flower_mcの再生イベントで繰り返し実行する function onFrowerStep(eventObj:Event):void { //再生イベントの対象のインスタンスを特定する var target_mc:MovieClip=eventObj.target as MovieClip; //スケールが小さいものほど速く回す target_mc.rotation+=Math.ceil(20/target_mc.scaleX); //左右に揺れながら降らせる target_mc.x+=4*Math.random()-2; target_mc.y+=5; //ステージより下まで来たら消去する if (target_mc.y>(stage.stageHeight+target_mc.height)) { //onFrowerStepリスナー関数を取り除く target_mc.removeEventListener(Event.ENTER_FRAME, onFrowerStep); //表示リストから取り除いて消す removeChild(target_mc); } }