関数の中に関数を入れた場合(関数クロージャというらしい)、中の関数でのthisの扱いには注意が必要。
例えば。。。
//フレームアクション
function main(){
trace(this);
//mc赤い四角定義
var mc = new MovieClip();
mc.graphics.beginFill(0xFF0000);
mc.graphics.drawRect(0,0,100,100);
mc.graphics.endFill();
sub();
//関数クロージャ(たぶん)
function sub(){
trace(this);
addChild(mc);
}
}
main();
上記を実行すると100×100の赤い四角がx:0,y:0の位置に表示される。
ここで注意したいのが、function subの中のaddChild(mc);
これは本来の文法的にはDisplayObjectContainer.addChild(mc)
DisplayObjectContainerが記載されてないから、thisになるのか、
と思うとそうでもない。。。
this.addChild(mc)
これはエラーになります。
finction sub()のthisと、function main()のthisはtrace結果を見ると違うものです。
よって、関数クロージャのaddChild(~)は、thisが省略されてるわけではないってことで。
※この例では”メインのタイムライン”になっているみたい。(フレームアクションなので)
Tags: AS3, Flash
_onload(),_onInit(),_onCastAdded(),_onCastRemoved(),_onGoto()などのoverride系のメソッドの中のaddCommand()は、execute()無しで、自動的に実行されるみたい。
addCommand()はリスト(CommandList?)にコマンドを追加するメソッドで、色んなクラスに入っている。
が、しかし、
CommandListクラスのメソッドのaddCommand()と
SceneObjectクラスのメソッドのaddCommand()とでは
動作の意味が若干違うみたい。(ドキュメントに書いてあることが違うし)
Tags: AS3, Flash, progression, 未解決
loaderInfo.addEventListener( Event.COMPLETE, _complete );
↑これってメインのタイムラインとかドキュメントクラスには書いといた方がいいのかな?
Tags: AS3, Flash, 未解決
まずはドキュメントのサンプルより
パラレルリストの中にパラレルリストを作って実行しているがメリットがわからない・・・
var list:ParallelList = new ParallelList();
list.addCommand(
new ParallelList( null,
new Trace("この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" )
);
list.execute();
コマンド内に書くとexecute();無しでも自動で実行されるのでシンプルな感じ
↓これで上と同じ意味になってるっぽいけど厳密には違うのかしら?
addCommand(
new ParallelList( null,
new Trace( "この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" )
)
);
Tags: AS3, Flash, progression, 未解決
gihyoでのプログレッション特集4のサンプルでの疑問点
各シーンの閉じるボタンを表示リストに追加する際に、各シーンに割り当ててるページ(CastSprite)ではなく、SceneObject自体に追加している。
これは、閉じるボタンの戻り先を設定をする際、SceneObjectじゃないと、sceneId:progression.root.sceneIdが使えないから・・・でいいののか?
(CastSpriteはprogressionプロパティをもっていないので)
それでも、CastSpriteに閉じるボタンをおきたいときは、
progression.root.sceneIdをtraceすると中身は”/index”だったので、、、
var sId:SceneId = new SceneId(“/index”);とSceneIdのインスタンスを用意して
sceneId:sId;
としてあげればOKでした。
Tags: AS3, Flash, progression, 未解決
変数 = Math.min(Math.max(値 , 最小値) , 最大値);
例えば、
var randomNum:Number = Math.random()*100;
var maxNum:Number = 50;
var minNum:Number = 10;
var ans:Number = Math.min(Math.max(randomNum, minNum) , maxNum);
ただし、if文で作った方が処理的に速いらしい。
(Mathは遅いそうな)
Tags: AS2, AS3, Flash
並び変えを、任意の関数でルールが作れるようだ。
var myArray:Array = [10,5,2,34];
myArray.sort(compare);
function compare(a,b) {
if (a>b) {
return 1;
} else if (a<b) {
return -1;
} else {
return 0;
}
}
trace(myArray);//出力:2,5,10,34
Tags: AS3, Flash
コンストラクタに渡す引数は正の整数でなくてはならない。
var myBitmapData:BitmapData = new BitmapData(0,0);
//ランタイムエラー
しかし、ライブラリのビットマップにリンケージでクラス指定したものを呼び出すときは、0でもOK。
var myBitmapData:MyBitmapData = new MyBitmapData(0,0);
//エラー無し
Tags: AS3, Flash
【投影象の大きさ】:【オリジナルの大きさ】 = 【焦点距離】:【焦点距離+z方向距離】
投影像の大きさ = オリジナルの大きさ × 焦点距離 / (焦点距離 + z方向距離)
焦点距離をFとすると、投影面のxy座標は以下の公式であらわせる
x’ = x × F/(F+z)
y’ = y × F/(F+z)
最前面奥行き(z)を0にした場合。
F/(F+z) = 1
最背面奥行き(z)を1にした場合の最小比率をSとすると
F/(F+z) = S
F/(F+1) = S
F = S × (F + 1)
F = (1-S)/S