Home > Archives > 2009-03

2009-03

Snippetに登録されてるfunction


既に皆さん、お使いのことと思いますが…

Progressionではコマンドリストの中に直接functionを記述することが出来ます。

その場合、僕は、function():void{~と全て(コードを)手打ちしていた訳です。

しかし、FlashDevelopを使っている場合、Ctrl+BでSnippetを呼び出して、その中にデフォルトで登録されているfunctionを選択すると、

//AS3の場合
function ():void {
						
}

と、コードを補完してくれるっ…

「こっちの方が便利だ~~~~!」と気がついたのが、つい先ほど…

間抜けです。

getCommandByIdはSerialListと組み合わせると便利!


クラスファイルを覗いてみると、getCommandByIdは以下のように定義されています。

指定されたidと同じ値が設定されているCommandインスタンスを返します。

簡単な使い方

var a:Command = new Command(null,null,{id:"uniq"});
/*
//上記は以下と同じことです。
var a:Command = new Command();
a.id = "uniq";
*/
//aのインスタンスを作成
var b:Command = getCommandById("uniq");
//bのidをtraceしてみる
trace(b.id);

これを実行してみると…

uniq

と、出力パネルに表示されます。

う~ん、他にどういう使い方があるかなぁ…と悩んでいたら、northprintさんから「まだ試してはいないんですが、SerialListで(getCommandById)使えないですかねぇ…」とのアドバイスを…

northprintさん、ありがとうございます!

で、試してみたら、かなりこの組み合わせは便利そうです。

SerialListと組み合わせてみた例

var sList:SerialList = new SerialList( {id:"uniq"});
// 実行したいコマンドを登録する
sList.addCommand(
	new Trace("あああああ"),
	new Wait(1000),
	new Trace("いいいいい")
);
sList.execute();

ちなみにですが、こういう書き方も出来ます。

var sList:SerialList = new SerialList( {id:"uniq"},
	new Trace("あああああ"),
	new Wait(1000),
	new Trace("いいいいい")
);
sList.execute();

それでこのSerialListを使いたい他のファイルで、以下のように定義してあげます。

//getCommandByIdを使って、id="uniq"のSerialListを取得する
var sList:SerialList = SerialList(getCommandById("uniq"));
sList.execute();

これを実行すると、”あああああ”と表示され、1秒経過した後に”いいいいい”と表示されます。

気をつけることは、SerialList(getCommandById(“uniq”));とSerialListでキャストしてあげることです。

getCommandById(“●●”);の戻り値はCommandクラスなので、キャストしてあげないとコンパイルエラーになります。

getCommandByIdの便利な使い方

  1. ある一連の処理をSerialListで定義しておいて、それにユニークなidを付けておく。
  2. それを他のクラスファイルで、getCommandByIdで取得して使い回す

こんな便利なことが出来そうです。

これは余談ですが…(ParallelListの場合)

もちろんParallelListでもgetCommandByIdは使えます。

ParallelListの例・1

var pList:ParallelList = new ParallelList( {id:"uniq"},
	new Trace("あああああ"),
	new Wait(1000),
	new Trace("いいいいい")
);
pList.execute();

こんな感じで定義しておいて、使いたいクラスファイル側で…

var pList:ParallelList = ParallelList(getCommandById("uniq"));
pList.execute();

これを実行すると、出力パネルには…

あああああ
いいいいい

(ParallelListなので)二つが同時に表示されます。

ParallelListの例・2

var sList:SerialList = new SerialList( {id:"uniq"},
	[
	new Trace("あああああ"),
	new Wait(1000),
	new Trace("いいいいい")
	]
);
sList.execute();

こんな感じでSerialList内で[]を使うことでParallelList化しておいて、使いたいクラスファイル側で…

//SerialListだけど、実行するとParallelList
var sList:SerialList = SerialList(getCommandById("uniq"));
sList.execute();

こんな感じでも使えます。(これだと分かりにくいかも…)

getScenesByRegExpの使い道


名前から判断すると、正規表現を使ってシーンオブジェクトを取得するのかぁ…

大して正規表現を知っている訳ではない僕は、使うことはないかなぁ…なんて、当初は思っていたのですが…

試してみたら、このクラスはいろんな事が出来そうなので、そこらあたりをエントリしたいと思っています。

RegExpの例・1(id編)

getSceneByIdと同じくidを使って、シーンオブジェクトを取得することが出来ます。

この例では、idにindexと定義されたシーンオブジェクトを取得します。

//new RegExpの例1(idで試してみる)
var a:Array = getScenesByRegExp("id",new RegExp("index"));
for (var i:uint = 0; i< a.length; i++){
	trace(a[i]);
}

RegExpの例・2(group編)

getScenesByGroupと同じくgroupを使って、シーンオブジェクトを取得することが出来ます。

この例では、groupにuniqと定義されたシーンオブジェクトを取得します。

//new RegExpの例2(groupで試してみる)
var a:Array = getScenesByRegExp("group",new RegExp("uniq"));
for (var i:uint = 0; i< a.length; i++){
	trace(a[i]);
}

RegExpの例・3(sceneId編)

getSceneBySceneIdと同じくsceneIdを使って、シーンオブジェクトを取得することが出来ます。

この例では、indexシーンの子のシーンを全て取得します。

//new RegExpの例3(sceneIdで試してみる)
var a:Array = getScenesByRegExp("sceneId",new RegExp("^/index/"));
for (var i:uint = 0; i< a.length; i++){
	trace(a[i]);
}

ここまでは他のクラスファイルでも出来ることなので、わざわざgetScenesByRegExpクラスを使うまではないかと思うのですが…

getScenesByRegExpの中身を覗いてみると、第一引数はfieldName:Stringとなっていました。

ここに他のモノ(SceneObjectのプロパティであるtitleやnameとか)は入れられないのかなぁ…なんて思ったので試してみることに…

RegExpの例・4(title編)

titleを使って、シーンオブジェクトを取得することが出来ます。

例えば、IndexSceneにはtitle = “トップページ”。AboutSceneにはtitle = “製品紹介ページ”と設定してあるとします。

fieldNameにtitleを設定してあげると、title = “●●ページ”;となっているもの全てを拾ってくれます。

//new RegExpの例4(titleで試してみる)
var a:Array = getScenesByRegExp("title",new RegExp("ページ$"));
for (var i:uint = 0; i< a.length; i++){
	trace(a[i]);
}

RegExpの例・5(name編)

nameを使って、シーンオブジェクトを取得することも出来ます。

例えば、ContactSceneにname=”contact”。CollectionSceneにname=”collection”と設定してあるとします。

fieldNameにnameを設定してあげると、nameがcから始まるもの全て(この場合ならContactSceneとCollectionScene)を拾ってくれます。

//new RegExpの例5(nameで試してみる)
var a:Array = getScenesByRegExp("name",new RegExp("^c"));
for (var i:uint = 0; i< a.length; i++){
	trace(a[i]);
}

他にもイロイロ出来そうですが、とりあえずこんなもんで…

getScenesByGroupで複数シーンの値を取得する


getSceneByIdやgetSceneBySceneIdを使うと、残念ながら一つのシーンの値を取得することしか出来ません。

複数のシーンの値を一気に取得出来ないの? と思った方もいらっしゃるのでは?

Progressionには、そういうことが出来るクラスがきちんと用意されています。

それが、getScenesByGroupです。

早速使ってみましょう!

今回はシーンを一つ増やして、IndexScene、AboutScene、ContactSceneでやってみたいと思います。

★IndexScene

public var str:String = "ユニークな名前を設定";

//コンストラクタ
public function IndexScene() {
group = "uniq";
}

groupというプロパティを設定しておきます。

★AboutScene

//コンストラクタ
public function AboutScene() {
group = "uniq";
}

先ほどのIndexSceneと同じくgroupというプロパティを設定しておきます。

★ContactScene

ここで複数シーンの値を取得してみます。getScenesByGroupの戻り値は配列です。

var a:Array = getScenesByGroup("uniq");
for (var i:uint = 0; i< a.length; i++){
    trace(a[i]);
}

この様に設定すると…

[IndexScene sceneId=”/index” name=”index” group=”uniq”]
[AboutScene sceneId=”/index/about” name=”about” group=”uniq”]

こんな感じで表示されます。

getScenesByGroupには第二引数も指定出来ます。第二引数は配列の値をソートするかしないかです。デフォルトはfalseになっています。

先のソースをこのように変更してみると…

var a:Array = getScenesByGroup("uniq",true);
for (var i:uint = 0; i< a.length; i++){
    trace(a[i]);
}

配列がソートされ、以下の様に表示されます。

[AboutScene sceneId=”/index/about” name=”about” group=”uniq”]
[IndexScene sceneId=”/index” name=”index” group=”uniq”]

★最後にもう一つ。

getScenesByGroupのクラスファイルを覗いてみると、以下の様に書かれています。

指定された group と同じ値を持つ SceneObject インスタンスを含む配列を返します。

つまり返ってくる配列の値は、SceneObjectインスタンスということなのです。

これの何が便利かというと…

var a:Array = getScenesByGroup("uniq");
for (var i:uint = 0; i< a.length; i++){
    trace(a[i]);
}

//IndexSceneの変数にアクセスしてみる
trace(a[0].str);

これを実行すると…

[IndexScene sceneId=”/index” name=”index” group=”uniq”]
[AboutScene sceneId=”/index/about” name=”about” group=”uniq”]
ユニークな名前を設定

こんな感じで、getSceneByIdやgetSceneBySceneIdを使わなくても、特定のシーンの変数とかにもアクセス出来ちゃいます!

これまた便利!

getSceneBySceneIdでも同じことが…


昨日のエントリで、ProgressionではgetSceneByIdを使うと異なるシーン間で値の受け渡しが出来ると書きましたが、getSceneBySceneIdクラスを使っても同じことが出来ます。

getSceneByIdはユニークな一意のID名を付けて、それにアクセスするという手法を取りましたが、getSceneBySceneIdはシーンについているsceneId名を使ってアクセスします。

前回と同じくIndexSceneとAboutSceneを使ってみたいと思います。

変数がpublicな場合

★IndexScene

public var _str:String = "ほげほげ";
//コンストラクタ
public function IndexScene() {
}

★AboutScene

var a:IndexScene = IndexScene(getSceneBySceneId(new SceneId( "/index" )));
trace(a._str);

これを実行すると、

ほげほげ

と出力パネルに表示されます。

getSceneBySceneIdの引数には、sceneId名を渡してあげる必要があります。

変数がprivateな場合

前回と一緒で、getter、setterを使ってあげます。

★IndexScene

private var _str:String = "ほげほげ";
//コンストラクタ
public function IndexScene() {
}

//getterを定義
public function get str():String{
     return _str; 
};

//setterを定義		
public function set str(value:String):void{
    _str = value;
}

★AboutScene

var a:IndexScene = IndexScene(getSceneBySceneId(new SceneId( "/index" )));
trace(a.str);
a.str = "ユニークな一意の名前";
trace(a.str);

これを実行すると、

ほげほげ
ユニークな一意の名前

このように表示されます。

ユニークなID名をつけるのが面倒な場合は、getSceneBySceneIdを使ってアクセスしてあげればOK。

これまた便利ですね。

Home > Archives > 2009-03

Search
Feeds
Meta

flashDevelopスポンサー

Return to page top