tmlibの練習ブログ

自分流にtmlibを触っていきます。分かったことを解説。入門用になれば…?

デフォルトから一本のゲームを完成させる3.オブジェクトをreturnで返す。

前回はtm.app.Label( );といった宣言部を毎回繰り返していてしつこい、という事だった。


ではそこも、グローバルな関数内に入れてみよう。
すると、こう変わる。

function makeLabel(l_obj){
	var label = tm.app.Label(); // 関数内でラベル作成
	label.position.set(l_obj.x , l_obj.y);
	label.text = l_obj.text;
	label.align = l_obj.align;
	label.width = l_obj.width;
	label.fontSize = l_obj.fontSize;
	return label; // ラベル返す
}

(役割の変化にしたがって、関数名もsetLableからmakeLabelとした)


呼び出し側はこう。

l_obj = {
	// ...省略
}
this.scoreLabel = makeLabel(l_obj); // #変更(返されたラベルを変数に格納)
this.addChild(this.scoreLabel);


今までラベルを作って、関数の引数にthatとして渡していた所が、"そもそも関数内で作り、それをreturn、呼び出し部が受け止めて名前を付ける"
となっている。


順番が逆になっても、ラベル(のオブジェクト)に名前を付けて、後からちゃんと判別できる、という基本的なルールは変わってないので、これでもいける訳だ。


ちなみにそのルールで言えば、this.addChild(…)に追加する際にも、変数名は問題ではない。
this.addChildで追加してるのは、変数名ではなく、その"中身"だから(後述)


なので更にこんな省略もできる。

function makeLabel(that , l_obj){
	var label = tm.app.Label();
	label.position.set(l_obj.x , l_obj.y);
	label.text = l_obj.text;
	label.align = l_obj.align;
	label.width = l_obj.width;
	label.fontSize = l_obj.fontSize;
	that.addChild(label); // #呼び出しのをここに持ってくる
	return label;
}
this.scoreLabel = makeLabel(this , l_obj); // 一行に


要はオブジェクトを作った時点で、そのオブジェクトには固有の番号が振られるのだ。

//  ID:123456 を発行。var labelはそれを要素の一つとして持つ。
var label = tm.app.Label(); 

これをシーンに登録して

// ID:123456のオブジェクトをthis(MainScene)に登録
this.addChild(label);

returnで受け取れば

// this.scoreLabelにはID:123456を持つオブジェクトが返る
this.scoreLabel = makeLabel(l_obj); 


あとから、その番号を呼び出す事ができる。きちんと辿れる事が分かるだろうか。


ここまでのコード(main.js)
http://spchinese.s601.xrea.com/tmlib_text/main_2013_11_26.txt
*バージョンは、tmlib.js 0.2.0で作成。