staticとすると、クラスインスタンスを作らなくてもアクセスできるようになる。
例えば、
//カスタムクラス:Test
package {
public class Test {
static public var n:int = 100;
static public var m:int = 200;
public var q:int = 500;
function Test() {
plus();
}
function plus() {
trace("test:"+q);
}
}
}
//メインのタイムライン
trace(Test.n);
var test:Test = new Test();
出力は、
100
test:500
となり、クラスのインスタンスを作る前に直接に変数を値を取得できる。
使い道としては、子クラスから親クラスのプロパティ値を取得したいときとか。
でも、親クラスのプロパティがスタティックだらけになってなんか気持ち悪い気が・・・
(他に取得方法はあるのだろうか?parrentとか?)
あと使ってて気づいた点。
staticは関数にも使えるが、その際、そこで扱う変数もstaticの必要があるっぽい。
例えばさっきのカスタムクラスのfunction plusをstaticにすると。。。
qがstaticではないので、
未定義のプロパティqへのアクセスです、
と怒られる。
なので、qをstaticにすると大丈夫らしい。
//これでOK
package {
public class Test {
static public var n:int = 100;
static public var m:int = 200;
static public var q:int = 500;
function Test() {
plus();
}
static function plus() {
trace("test:"+q);
}
}
}
よくわからんな・・・
Tags: AS3, Flash
//XMLからノードを抜き出したものがXMLListとなるらしい。
//抜き出したノードはXMLListに代入できる
var xml:XML=
<data1>
<node>Node1</node>
<node>Node2</node>
</data1>;
var xmllist:XMLList = new XMLList();
xmllist = xml.node;
//でもXMLに代入はできない。
var xml:XML=
<data1>
<node>Node1</node>
<node>Node2</node>
</data1>;
var xml1:XML = new XML();//XMLではダメ。
xml1 = xml.node;
//2008/1/15追記
//これならXMLとなる
xml1 = xml.node[0];
Tags: AS3, Flash, XML, XMLList
mcを入れ子にした状態でも可能。
たとえば子のMCのフレームアクションで定義した変数や関数にも親MCのフレームアクションでアクセスするもOK。
test();
function test(){
trace("i="+i);//出力:i=0(intの初期値は0)
}
var i:int;
※変数の初期化はできるけど代入はできないみたい。
test();
function test(){
trace("i="+i);//出力:i=0(intの初期値は0)
}
var i:int = 5;//5を代入しても、traceでは0となる。
Tags: AS3, Flash
var mc:MovieClip = new MovieClip();
this.addChild(mc);
//removeChildして、nullを代入すること
this.removeChild(mc);
mc= null;
Tags: AS3, Flash
例えば、
//フレームアクション
var n:Boolean = true;
stage.addEventListener(MouseEvent.CLICK, xClick);
function xClick(e:MouseEvent):void {
n = !n;
if (n) {
trace("true:"+n);
} else {
trace("false:"+n);
}
}
↑を↓のように書いても同じこと。
var n:Boolean = true;
stage.addEventListener(MouseEvent.CLICK, xClick);
function xClick(e:MouseEvent):void {
if (n = !n) {
trace("true:"+n);
} else {
trace("false:"+n);
}
}
Tags: AS2, Flash
スコープがあってないと思うのだけど理屈がよくわからない・・・
例えば、こんなカスタムイベントはOK
(ステージに_mc1インスタンスを配置)
//////////
//フレームアクション
import mx.events.EventDispatcher;
import mx.utils.Delegate;
var frog1:Object = new Object();
EventDispatcher.initialize(frog1);
function passPoint(eventObj:Object):Void {
trace(eventObj.child);
}
frog1.addEventListener("passPoint",this);
_mc1.onRelease = function() {
trace("on");
trace("this;"+this);
var testObj:test2 = new test2(frog1);
};
//////////
//カスタムクラス(test2.as)
class test2 {
var childID = 300;
var frog1:Object;
public function test2(frog1) {
this.frog1 = frog1;
tat();
}
function tat() {
frog1.dispatchEvent({type:"passPoint", child:childID});
}
}
//////////
でもこれを以下のようにフレームアクションを変えるとイベントが受信できない。
//////////
import mx.events.EventDispatcher;
import mx.utils.Delegate;
var frog1:Object = new Object();
EventDispatcher.initialize(frog1);
_mc1.onRollOver = Delegate.create(this, testOver);
function testOver() {
trace("this:"+this);
function passPoint(eventObj:Object):Void {
trace(eventObj.child);
}
frog1.addEventListener("passPoint",this);
};
_mc1.onRelease = function() {
trace("on");
trace("this;"+this);
var testObj:test2 = new test2(frog1);
};
function testOverは委譲しているので、this参照は_lovel0になっているのに。
・・・何か別の問題があるのだろうか?
/////////////////////////////////////
12/5 追記
理解しました。
function内にfunctionが入っているとそれはローカル変数的なfunctionになるのだそう。
(passPointがtestOverに含まれてしまっているということ)
this参照が_lovel0でもグローバル的な関数にはなりえないってことらしい。
つまり・・・
////////////////////////
//これはtraceできないけど。。。
var test:Function;
function main(){
//test = test();
function test(){
trace("a");
};
}
main();
test();
////////////////////////
//これならできる、みたいな
var test:Function;
function main(){
test = test();
function test(){
trace("a");
};
}
main();
test();
Tags: AS2, Flash
参考サイト
http://katapad.com/wp/2008/05/25/study_as2_delegate_create/
Delegate.asを以下のように書き換える。
static function createWithArgs(obj:Object, func:Function, args:Array):Function//args:Arrayを追加
{
var f = function()
{
var target = arguments.callee.target;
var func = arguments.callee.func;
return func.apply(target, arguments.callee.args.concat()); //ここを追加
};
f.target = obj;
f.func = func;
f.args = args; //ここを追加
return f;
}
配列で引数を渡せるみたい。
ただし、配列として色んな値を格納して、それを取り出すなんてことはできないみたい。
例えば、ステージに_mcというインスタンスをおいた状態で、
import mx.utils.Delegate;
var tstArray:Array = new Array();
tstArray.push(100);
tstArray.push(200);
_mc.onRollOver = Delegate.create(this, onRollOverTest,tstArray);
function onRollOverTest(x){
trace("delegate+"+x);//出力:100
}
これでは値はunderfinedになってしまった。
import mx.utils.Delegate;
var tstArray:Array = new Array();
tstArray.push(100);
tstArray.push(200);
_mc.onRollOver = Delegate.create(this, onRollOverTest,tstArray[0]);
function onRollOverTest(x){
trace("delegate+"+x);//出力:100
}
Tags: AS2, AS3, Flash
AsBroadcasterでのイベント配信との使い分けがよくわからんです。
イベントオブジェクトにプロパティがもてるのでより柔軟に使えるってことかしら。
//EventDispatcherにパスを通す
import mx.events.EventDispatcher;
//ブロードキャスターとなるオブジェクトを作成
var casterObj:Object = new Object();
//ブロードキャスター(イベントをdispatchする人)に登録する
EventDispatcher.initialize(casterObj);
//リスナーとなるオブジェクトを作成
var listenerObj:Object = new Object();
//リスナーオブジェクトにメソッド(リスナーメソッド)を定義
listenerObj.eventComp = function(e:Object){
trace("end");
//イベントオブジェクトのプロパティを参照できる
trace("target:"+e.type);//出力:target:eventComp
}
//リスナーオブジェクトとイベントをブロードキャスターのリスナーとして登録
casterObj.addEventListener("eventComp",listenerObj);
//ブロードキャスターがイベント”eventComp”イベントを配信する。
//dispatchEvent(eventObject)
//eventObjectはtypeプロパティにイベント名のStringを持たなければ駄目
casterObj.dispatchEvent({type:"eventComp"});
Tags: AS2, Flash
AsBroadcasterでイベントを配信できる。
EventDispatcherとの違いがよくわからないのだが・・・
下記のような順番で書いていくこと。
//ブロードキャスターとなるオブジェクトを作成
var casterObj:Object = new Object();
//ブロードキャスターに登録する
AsBroadcaster.initialize(casterObj);
//リスナーとなるオブジェクトを作成
var listenerObj:Object = new Object();
//リスナーオブジェクトにメソッド(リスナーメソッド)を定義
listenerObj.eventComp = function(){
trace("end");
}
listenerObj.eventComp1 = function(){
trace("end1");
}
//リスナーオブジェクトをブロードキャスターのリスナーとして登録
casterObj.addListener(listenerObj);
//ブロードキャスターがイベント”eventComp”を配信する。
casterObj.broadcastMessage("eventComp");
//ブロードキャスターがイベント”eventComp”を配信する。
casterObj.broadcastMessage("eventComp1");
Tags: AS2, Flash
委譲という言葉自体よくわからんが、こんなことらしい。
as2での例
ステージに_mcというMCがあり、メインのタイムラインのフレームアクション
_mc.onEnterFrame = xEnterFrame;
function xEnterFrame(){
trace(this)
}
//出力_level0._mc
ここでthisを他のものに変えたい時には以下のように書く
_mc.onEnterFrame = Delegate.create(this.xEnterFrame);
function xEnterFrame(){
trace(this)
}
//出力_level0
Delegate.create(第一引数.第二引数);
第一引数でスコープオブジェクトを指定できる。
Tags: AS2, Flash