• 締切済み

クラスからステージの参照方法

お世話になります。 ActionScript3に関する質問です。 現在カスタムクラスを勉強中です。 カスタムクラスからstage.stageWidthを見に行きたいのですが、 『nullのオブジェクト参照のプロパティまたはメソッドに アクセスすることはできません・・・』というエラーが出てしまいます。 カスタムクラスからアクセスするにはどのように記述すれば良いでしょうか? また、stage以外でもクラスからこういうアクセスが汎用的 という例があればアドバイスいただけると幸いです。 お手数ですが、宜しくお願いいたします。

  • Flash
  • 回答数2
  • ありがとう数8

みんなの回答

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

クラスを設計する際には、外部のオブジェクトを直接参照しない設計にするのが一般的です。 外部のオブジェクトを直接参照するようなクラスは汎用的ではない=クラスにする意味が薄い、との理由です。 いやいや、外部のオブジェクトを操作するクラスはよくあるじゃないか、と思われるかも知れません。 var hoge = New HogeHoge(); hoge.target = fuga; 上記のように、外部から参照を設定して、クラス内から外部オブジェクトを操作できるようにします。 ※もちろんクラス内では、target(=fuga)を変数に保持して以降targetに対してあらゆる操作を行います。 クラスにするからには、クラス外の事はクラス自身は何も知らなくて良い。 それがクラスの設計手法で、どんな言語でも共通の事と言えます。

John12345
質問者

お礼

ご回答いただきましてありがとう御座います。 まだクラスの勉強をはじめて間もないですが、可能な限り汎用的な 作りにしたいと考えておりますので、外部のオブジェクトを参照しない ような作りにしたいと思います。 先にご回答いただいた方への返信にも記載しておりますが、 リサイズイベントで変更されたstageの値を外部クラスから 処理したいと思いますが、どの様な方法が綺麗なやり方でしょうか? 具体的にお教えいただけると幸いです。 宜しくお願いいたします。

回答No.1

stageプロパティはDisplayObjectのプロパティです インスタンスがステージにaddChildされるまではnullです DisplayObjectクラスの拡張クラスでないなら 直接stageプロパティを作ってステージを教えてやるか ステージにあるDisplayObjectのインスタンスを プロパティに持っているならそれのstageを取得する というような方法で取得できます

John12345
質問者

お礼

ご回答ありがとう御座います。 具体的には、下記に記載している画面のリサイズ時の処理を 外部クラス化したいと考えております。 画面のリサイズ時のRESIZEイベントを発生させた際に、 リサイズ後のstageの値を得るにはどうしたら良いでしょうか? 度々申し訳御座いません。 stage.addEventListener(Event.RESIZE, onStageResize); function onStageResize(event:Event):void { // ステージサイズを再計算 stageW = stage.stageWidth; stageH = stage.stageHeight; // ここにリサイズ処理が入る }

関連するQ&A

  • 外部クラスからステージへのaddChild()メソッドの利用について

    いつもお世話になります。 ActionScript3(以下AS3)で記述したスクリプトを外部クラス化したいと考えており、FLAファイル側で外部クラスsample.asクラスをnew sample();で呼び出し、外部クラス内で生成したSpriteをステージに追加する為にaddChild(basebg);と指定するとコンパイルエラーとなり、「1180:未定義である可能性が高いメソッドaddChildの呼び出しです。」と表示されます。 外部クラスにはbasebgに追加するaddChild()メソッドを複数使用していますが、それらはエラーが出ていません。 外部クラスからステージにオブジェクトを追加するにはどのような記述が必要でしょうか? 初歩的なミスかもしれませんが、ご教授いただけると幸いです。 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • クラスでプロパティを使う方法

    お世話になります。 VCの勉強をしていて良く分からないところが出てきました。 オブジェクトにはプロパティが付いていますが、 それをクラスではどのように記述しているのでしょう。 メンバ変数としてpublicで書けばプロパティになると思うんですが、 プロパティっていうのは変更するとオブジェクトも変化するではないですか。 例えばボタンの.topとか.leftを変化させれば大きさや位置が変わります。 そういう変化は何かメンバ関数を作って記述するのかなと思ったんですけど それだとメソッドになってしまうので、やはり違う気がします。 WEBも色々探してみたんですけど、 探し方が悪かったのか、よく分かりませんでした。

  • 外部クラス(カスタムクラス)からテキストフィールドに表示させたい。

    外部クラス(カスタムクラス)からテキストフィールドに表示させたい。 環境はFLASH CS3でActionScript3.0です。 例えばドキュメントクラス(Main.as)があり、そこからカスタムクラス(Test.as)をImportしています。 ステージにはテキストフィールド(インスタンス名tf)があり、Test.asの中の変数の値などをtfに表示させたいのです。 Test.asの中で、 var disp = "OK"; tf.text = disp; などを試しましたが 「1120: 未定義のプロパティ tf へのアクセスです。」と表示されます。 stage.tf.textやroot.tf.textなど試しましたが全てエラーとなってしまいます。 分かる方は教えて欲しいです。宜しくお願いします。

    • ベストアンサー
    • Flash
  • setTimeoutのthis参照について

    prototypeメソッドの中でsetTimeout関数を使用したところ、thisで自身の関数を参照しなくなりました。setTimeoutの挙動についてぐぐってみたのですが、いまいちsetTimeoutを使用したときのスムーズな記述方法がわかりません。 ******************************** var hoge=function(){ this.myName="ほげ"; } hoge.prototype={ init:function(){ setTimeout(function(){ hoge.prototype.displayName(); // ★(1)setTimeout関数の中でのメソッドの適した呼び出し方は? // ↑の記述でも呼び出せるけど、間違ってる気がする。。 },1000) }, displayName:function(){ // ★(2)ここでhogeオブジェクトのmyNameプロパティを参照するにはどう記述すれば良いのか? //console.log(this.myName); //↑setTimeoutを使ったのでthis参照はwindowオブジェクトになっているから違う //console.log(hoge.myName); →undefinedを返す } } window.onload=function(){ var a=new hoge(); a.init(); } ******************************** 上記のようなprototype関数を使用したときのスムーズな記述方法を教えていただけませんでしょうか。 知りたいのは下記2点です。 ★(1)prototypeメソッドを使用したとき、setTimeout関数の中でのメソッドの適した呼び出し方は? ★(2)setTimeout関数内で呼び出したメソッドから、自身のオブジェクトのプロパティを参照するにはどう記述すれば良いのか? 初心者なので説明が下手だったり、質問内容で間違った記述があるかもしれません。 質問内容で問題がありましたらご指摘いただけると助かります。

  • adobeFlashPlayer10 「ActionScriptエラー

    adobeFlashPlayer10 「ActionScriptエラーが発生しました」 なんとなくユーストリームを開いて視聴しようと思ったら TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 と表示されます。 許可、許可しないと選択できるのですが、どっちをやっても普通に視聴でき問題ないのですが 開く度にこのポップアップが出るのと、何故このような表示がでるのか気になって困っています ためしにFlashPlayerを再インストールしてみたのですが、得に変わりはありませんでした。 詳しいかたよかったらよろしくおねがいします

  • 継承元クラスのプロパティを参照する手段

    お世話になります。 ActionScrip3に関する質問です。 現在、カスタムクラスを勉強しております。 外部クラスでClassA、ClassBを作成し、 ClassAにある処理の途中でClassBを実行し、ClassBの中からClassAのプロパティを参照しにいく 処理を行いたいと思い、ClassBのコンストラクタからClassAのプロパティをtraceしました。 プロパティppt2は「かきくけこ」が出力されましたが、ppt1は「null」になってしまいました。 恐らく、タイムラインからClassAに対して設定したプロパティの値は見にいけていないようですが、 タイムラインから設定したプロパティの値を継承したClassBから参照しにいく方法はありますでしょうか? 下記ソースと同じ方法でなくても結構ですので、タイムラインから設定した スーパークラスのプロパティ値をサブクラスから参照・変更できる方法を ご教授いただければと存じます。 お手数ではありますが、宜しくご教授ください。 宜しくお願いいたします。 /* タイムライン側の処理 -----------------------*/ var test:ClassA = new ClassA(); test.ppt1 = "あいうえお"; test.goNext(); /* ClassAの処理 -----------------------*/ package {  // インポート記述は省略  public class ClassA {   var ppt1:String;   var ppt2:String = "かきくけこ";   // コンストラクタ   public function ClassA() { }   public function goNext():void {    var classb:ClassB = new classB();   }  } } /* ClassBの処理 -----------------------*/ package {  // インポート記述は省略  public class ClassB extends ClassA {   // コンストラクタ   private function ClassB() {    trace(ppt1);    trace(ppt2); }  } }

    • ベストアンサー
    • Flash
  • as3 クラスファイルからルートにaddChildしたmcへのアクセス

    as3 クラスファイルからルートにaddChildしたmcへのアクセス いくつか似たような記事はあったのですが、解決せず質問させていただきます。 ルートにtestというmcを配置しています。 それに、外部のswfをaddChildしてます。 ~中略~ var loadMc:MovieClip = loader_obj.content as MovieClip; test.addChild(loadMc); これはうまくいっています。 このtestをクラスファイルから操作したいのですが、 ■クラスファイル(test.as)抜粋 MovieClip(root).test.x = 100; これでうごくかな~と思ってたんですが、 TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 at MethodInfo-181() このエラーが出ます。 どうしたらよいでしょうか。。。。

    • ベストアンサー
    • Flash
  • フレーム内のアプレットの参照ができない

    <frameset rows="*,100"> <frame src="Q0001.html" name="main"> <frame src="navigator.html" name="navigator"> </frameset> 上記のフレーム構成で、Q0001.html から navigator.html のアプレット、name="ResultRegister" を参照しようとしています。 var objElement = window.top.navigator.getElementsByName("ResultRegister"); で参照しようとすると、「オブジェクトでサポートされていないプロパティ、又はメソッドです」となり var objElement = window.top.navigator.document.getElementsByName("ResultRegister"); で参照しようとすると、「window.top.navigator.documentは、Null又はオブジェクトではありません」となり 参照できません。 どのように参照したらよいのでしょうか? 宜しくお願いします。

  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • AS3[Loaderクラス]について

    main.flaから インスタンス.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS , loop); インスタンス.contentLoaderInfo.addEventListener(Event.COMPLETE , done); インスタンス.load("※※※.swf"); funjction loop(e :ProgressEvent) :void {   } function done(e :Event) :void {  addChild(インスタンス); } で実行したところ下記のエラーが発生してしまい悩んでいます。 Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 何故そうなるのかまったく解らず困っています。何方か教えて頂けませんでしょうか?

専門家に質問してみよう