デフォルトから一本のゲームを完成させる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で作成。