- ベストアンサー
ActionScriptクラスのメンバ変数のアクセスについて
- ActionScriptのクラスでメンバ変数へのアクセス方法について説明します。
- コンストラクタ関数で値が正しく渡されているにもかかわらず、moving関数でメンバ変数の値を取得できない現象が発生しています。
- メンバ変数へのアクセス方法を確認し、正しい書き方を行う必要があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
カスタムクラスについては私も詳しくありませんので, 詳細を説明したり,その他不適切な部分があるとしてもその指摘まではできませんが, ご質問の件まででしたら原因と一応の解決策例は回答できます。 うまく行かない原因は大きく2つありますが, 結局2つとも 「パス(ターゲットパスの方)」 がそもそもの原因です。 また2つとも, _root.move_mc.onEnterFrame = function(){ this._x += (this.rangePro - this._x)/this.speedPro; } この部分が原因の発端になっています。 以下のスクリプトでは,全ての traceアクション は省略します。 ◎ 原因1と対処法 上に引用した部分の関数全体を書くと次のようになっています。 public function moving(){ _root.move_mc.onEnterFrame = function(){ this._x += (this.rangePro - this._x)/this.speedPro; } } この this.rangePro と this.speedPro の指す this は, _root.move_mc です。 ○○.onEnterFrame = function(){ ~ 様々なステートメント ~ }; のように書いた場合, 様々なステートメント 内で使用されるthisは,通常 ○○ になります。 これはあくまでも 「通常」 であって,「いつも必ず」 という意味ではありません。 this が何なのかわからなくなった場合は, trace(this); でその都度 this を調べてみると良いと思います。 ※具体的には, trace(this.speedPro); をする前に trace(this); をした方が良いということです。 ( もし trace(this); をしていたら,わざわざここで, この質問をするには至らなかったかもしれませんよ。) したがって, ここまでで public function moving(){…} を修正すると次のようになります。 public function moving() { _root.move_mc.speedPro = speedPro; _root.move_mc.rangePro = rangePro; _root.move_mc.onEnterFrame = function() { this._x += (this.rangePro-this._x)/this.speedPro; }; } これで, _root.move_mc 内に speedPro と rangePro がセットされるので, this.rangePro と this.speedPro で, rangePro と speedPro の値を取得できます。 ただし,ここを修正しても move_mc をクリックしたときは正常に動作しません。 FLA のフレームに次のように書いた場合は上のままで実行されます。 var move1:Move = new Move(5,100); move1.onclick(); move1.moving(); 以下では元通り move1.moving(); を付けない状態での説明に戻ります。 ◎ 原因2と対処法 原因その2は次の部分にあります。 public function onclick(){ _root.move_mc.onRelease = moving; } これは, _root.move_mc.onRelease に関数 moving を設定(代入) という意味です。 上で修正済みのスクリプトを使うと, つまり,FLAファイルに次のように書くのと同じことになります。 _root.move_mc.onRelease = function(){ _root.move_mc.speedPro = speedPro; _root.move_mc.rangePro = rangePro; _root.move_mc.onEnterFrame = function() { this._x += (this.rangePro-this._x)/this.speedPro; }; }; 当然, FLAファイルのタイムライン直下には speedPro も rangePro も定義されていないので, _root.move_mc.speedPro = undefined; _root.move_mc.rangePro = undefined; _root.move_mc.onEnterFrame = function() { this._x += (undefined-this._x)/undefined; }; となってしまいます。 speedPro も rangePro もタイムライン直下にあるのではなく, Moveクラスのインスタンス move1 にあります。 したがって, public function moving(){…} は次のように修正する必要が出てきます。 public function moving() { _root.move_mc.onEnterFrame = function() { this._x += (_root.move1.rangePro-this._x)/_root.move1.speedPro; }; } これで,move1 内の speedPro と rangePro が参照できます。 しかしこれでは, Moveクラスのインスタンス名を必ず move1 にしなければならないという制限ができてしまいますから 汎用的なクラスファイルとして使い物になりません。 汎用的に使えるようにするには, public function onclick() {…} も加えて, 次のように修正した方が使いやすくなると思います。 public function moving() { _root.move_mc.onEnterFrame = function() { this._x += (this.rangePro-this._x)/this.speedPro; }; } public function onclick() { _root.move_mc.speedPro = speedPro; _root.move_mc.rangePro = rangePro; _root.move_mc.onRelease = moving; } 説明が長くなりましたが, 結局,この回答の結論はこの↑10行だけです。 と言いますか..., 根本原因は public function moving() にあるのですが, 修正すべきは public function onclick() の方だということです。 また上の 10行 のようにしておくと, さらに,次のように使いやすくすることも可能になります。 ■インスタンス生成&メソッドへアクセス var move1:Move = new Move(5,100); move1.onclick(_root.move_mc); ■asファイル ~ 省略 ~ public function onclick(target_mc:MovieClip) { target_mc.speedPro = speedPro; target_mc.rangePro = rangePro; target_mc.onRelease = moving; }
お礼
ご丁寧にありがとうございました。 すべて理解するまで時間がかかりますので、 取り急ぎお礼まで。 ありがとうございます!!
補足
今すべて理解しました!!! 僕の思いとおりの結果になりましたし、 細かくまで納得することができました!!! 本当に感謝です!!