デフォルトのmain.jsをいじる14,関数の外にデータを持ち出す(return)
前回の続き。
変数のスコープの関係上、関数内で使われた数値を外に持ち出すためには、一工夫がいる。
(もちろんグローバル変数を使っても持ち出せるが、関数のたび作っていては不便)
returnというものが用意されている。
具体的には
this.star.scale_sp_width = function() { var aaa = this.width * this.scaleX; return aaa; // #変数aaa(の中身)を返す。 } var result = this.star.scale_sp_width(); // #変数aaa(の中身)をreslutに受け取る console.log(result);
これで、関数内で作った変数の中身を返せる。
もっと省略して
this.star.scale_sp_width = function() { return (this.width * this.scaleX); // #関数の結果をreturnで返す } var result = this.star.scale_sp_width(); // #関数の結果を受け取る console.log(result);
これでもいい。
わざわざ変数を用意しなくても、this.width * this.scaleX の結果を、外側に持ち出せる。
ただし一つ気を付けるのは、returnはデータを返して、関数をそこで終了させて(切り上げて)しまう。
this.star.scale_sp_width = function() { return (this.width * this.scaleX); this.scaleX += 200; // #ここに辿り着く前に、returnで関数から脱出している }
"関数の計算結果を、(最終的に)returnで返す"といった用途で使うのがいいだろう。
さてここまでくれば、拡大率を反映する高さ・幅の関数を.starに追加、
// …省略 this.star = tm.app.Sprite("CAT"); this.star.scale_sp_width = function() {return (this.width * this.scaleX);} // #追加 this.star.scale_sp_height = function() {return (this.height * this.scaleY);} // #追加 this.addChild(this.star);
あとはsetSizeを使い、
// …省略 if (key.getKey("z")) { this.star.scaleX += 0.1; this.star.scaleY += 0.1; this.star.setSize(this.star.scale_sp_width() , this.star.scale_sp_height()); //#追加 }
と、スッキリした形で関数の追加ができる。
あるいは"拡大率を入れる、特別なsetSize"という関数を作ってもいい。
this.star = tm.app.Sprite("CAT"); this.star.scaleSetSize = function() {this.setSize(this.width * this.scaleX , this.height * this.scaleY);} // #追加 this.addChild(this.star);
if (key.getKey("z")) { this.star.scaleX += 0.1; this.star.scaleY += 0.1; this.star.scaleSetSize(); // #追加 }
(scaleSetSize の中でsetSizeを行うので、特に外に持ち出すものがない。なのでreturnもいらなくなった)
関数宣言(追加)という、改造に便利な武器を、理解できた。
ここまでのコード(main.js)
http://spchinese.s601.xrea.com/tmlib_text/main_2013_11_22.txt
*バージョンは、tmlib.js 0.2.0で作成。