おいしいAS3 -28ページ目

生きてやがったよ

ENTER_FRAMEのリスナーが
対象がステージになくても
影で動き続けるのは有名な話

これ、Loaderで読み込まれた
swfでも同じで
unloadしても影でずっと
リスナーは生き続けるようです

Loaderでswfを読み込んだときは
どこでunloadされても
確実に片付けできるように
しときましょう



しかし重いものはちゃんと
片付けてるつもりなんだけど
なんか残ってる…

ENTER_FRAMEのリスナーは全部
removeEventListenerしてるし
BitmapDataは全部disposeしてるのに
どんどん重くなっていく

大して重くないだろうからって放置してた
プリミティブな型の値の変数
CLICKとかROLL_OVERとかのリスナーも
全部消したほうがいいのだろうか?


でもそんな重さじゃない気がするんだよな…
なんか片付け忘れてるのだろうか…?

疑似3D表現のクラス?

疑似3Dとも言えないようなクラス

AS1の時代に一番最初にやったアニメーションを
もうちょっと使い勝手よくしてAS3で書き直したものです

このクラスのいい所は元のMCの子が
ちゃんとステージに収まっていれば
その座標にマウスを持って行けば
その部品は出現するようになってるってこと

難しい計算をすることなく
非常に簡単に3Dみたいなカンジに
できるってことですね



/*
■使い方
擬似的な3D空間を演出するクラスです

■パブリックプロパティ

■パブリックメソッド
Dim(対象、最小、最大)
*/
package{

import flash.display.*
import flash.events.*
import flash.geom.*


public class Dim{

public function Dim(tgtMC:DisplayObjectContainer,min:Number=1,max:Number=3){
var orgPnts:Array=new Array()
var num=tgtMC.numChildren
for(var i=0;i<num;i++){
var scl=min+(max-min)*(i/((num-1)||1))
tgtMC.getChildAt(i).scaleX=tgtMC.getChildAt(i).scaleY=min+(max-min)*(i/(num-1))
orgPnts.push(new Point(tgtMC.getChildAt(i).x,tgtMC.getChildAt(i).y))
tgtMC.getChildAt(i).x*=scl
tgtMC.getChildAt(i).y*=scl
}
tgtMC.addEventListener(Event.ENTER_FRAME,frameTick)
tgtMC.addEventListener(Event.ADDED_TO_STAGE,function(e){tgtMC.addEventListener(Event.ENTER_FRAME,frameTick)})
tgtMC.addEventListener(Event.REMOVED_FROM_STAGE,function(e){tgtMC.removeEventListener(Event.ENTER_FRAME,frameTick)})
function frameTick(e){
var msPnt=new Point(tgtMC.mouseX,tgtMC.mouseY)
for(var i=0;i<num;i++){
var tgt=tgtMC.getChildAt(i)
var vec=Point.interpolate(orgPnts[i],msPnt,tgt.scaleY)
tgt.x=vec.x
tgt.y=vec.y
}
}
}

}
}

イベントに変数を乗せる

複数のイベントリスナーを作る時
処理がほとんど同じでちょっと
変数が違うだけってことがあります

リスナーの関数を動的に生成する
というのもありなんですが
リスナー登録するものが
リスナーの関数で動かしたい対象に
アクセスできない所にあって
そこで動的にリスナー関数を
つくれないとかいう状況ってのがあります

Loaderで読み込んだswfのボタンに
親のswfのインスタンスを操作させたい時とかです


そういうときは真っ向正直に
Eventに変数のせるようにします


といってもEventクラスは動的クラスじゃないので
勝手にプロパティ作れません

ってことで拡張してプロパティを追加できるようにしておきます



package{
import flash.events.*
public dynamic class ExEvent extends Event{
public function ExEvent(type){
super(type)
}
}
}




こういうクラスを作っておいて

var myEvent=new ExEvent("myEvent")
myEvent.myVar="myVar"
dispatchEvent(myEvent)

とでもやればmyVarに値を乗せたイベントを発信して
リスナー側で引数のイベントオブジェクトから
e.myVarってカンジで値をとれます