• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:actionscript クラスのメンバ変数のアクセスについて)

ActionScriptクラスのメンバ変数のアクセスについて

このQ&Aのポイント
  • ActionScriptのクラスでメンバ変数へのアクセス方法について説明します。
  • コンストラクタ関数で値が正しく渡されているにもかかわらず、moving関数でメンバ変数の値を取得できない現象が発生しています。
  • メンバ変数へのアクセス方法を確認し、正しい書き方を行う必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.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; }

trfnc223
質問者

お礼

ご丁寧にありがとうございました。 すべて理解するまで時間がかかりますので、 取り急ぎお礼まで。 ありがとうございます!!

trfnc223
質問者

補足

今すべて理解しました!!! 僕の思いとおりの結果になりましたし、 細かくまで納得することができました!!! 本当に感謝です!!