デフォルトのmain.jsをいじる13,既存クラス(オブジェクト)に関数追加
前回では関数の引数を知った。
[Documents]で見ると分かるように、tmlibに用意されたクラスにはたくさんの関数が、要素として登録されている。
そしてそこに、新しく関数を作る事もできる。
と言っても難しい話ではない。既存のクラスに新しく変数を作って、関数を代入すればいいだけ。
(むしろ他のプログラム言語と比べた時、制限が無さ過ぎるくらい)
例えば
if (key.getKey("z")) { // …省略 } //以後追加 if (key.getKey("c")) { this.star.test = function(){ console.log(this.width); } this.star.test(); }
main.jsのkey.getKey("z")に並ぶ形でこう記述すれば、cキーでstarのwidthを表示できるようになる。
ただ気を付けなければいけないのは、testに入れてる関数の中での"this"の扱い。
見れば、this.star.width と今までなら書いていた所を、this.width だけで済ませている。
実はこのthis.は、指しているものが違っている。
元々this. というのは"自分自身"を指すのだけど、
this.star… と書いていた時のthis が MainScene なのに対し、
この関数内では、this. とは、star自身のことだ。
(だってstarの中のtestに入れて、その中から呼び出す関数だから)
言わば、thisと書く時に"そのプログラムの部分を持っているのは誰か?"が問われる。
ここまで来れば、当たり判定に拡大率を反映させる事も見えてきた。
まず、"拡大率を反映した横幅"を表示してみる。
if (key.getKey("z")) { // …省略 } if (key.getKey("c")) { this.star.scale_sp_width = function() {console.log(this.width * this.scaleX);} this.star.scale_sp_width(); }
こんな感じで、拡大してからcを押すと数字が大きくなったはず。
ただ問題がある。
if (key.getKey("c")) { this.star.scale_sp_width = function() {this.width * this.scaleX;} var aaa = this.star.scale_sp_width(); console.log(aaa); // # undefined… }
こうして関数の結果を外に持ち出そうとした時、これではできないのだ。
(変数のスコープを思い出して、もしかしたら出来るかもしれないけど、それより良い手段がある)
次回はそこを学習し、拡大率に合わせた当たり判定の関数を、完成させる。