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

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

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

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

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

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1です。 > 何故クラス宣言の後に生成したMovieClipが > ステージに追加されたのかがわからなかったので 書いていらっしゃる意味がよくわかりません。 コンストラクタ関数を実行するときの引数が,この場合 this(MovieClip) であって, その引数を受けてコンストラクタが動作するのですが。 なんだかさっぱりわかりませんね.....。 この場合の this とはあえて言うと root ですよ。 root はそもそも MovieClip です。 別の言い方をすればこの場合の this は SWF のメインのタイムラインです。 SWF のメインのタイムライン は デカイ MovieClip です。 メインのタイムラインは階層も持ちます。タイムラインも持ちます。その他ムービークリップクラスのすべてのプロパティも持ちます。 階層ですからムービークリップその中に内包することができます。 つまりムービークリップです。 ただもっと大きな目で見ると,root は DisplayObject(表示オブジェクト) です。 例えば, 佐藤太郎 は 佐藤一家の 「お父さん」 です(そうだったとします)。 しかし同じ 佐藤家の「お父さん」佐藤太郎 であっても,別のもっと大きな枠で言うと 佐藤太郎は「人間」です。 人間の中の 佐藤家の「お父さん」 なだけで, 佐藤太郎 は,佐藤家の「お父さん」 には違いありません。 this は root であり root は MovieClip です。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

Documentクラスのクラスではない通常のクラスファイルからは ステージ上のインスタンスのパスは stage なども含めて直接指定できないので, (仮に指定できても汎用性の欠けたものしか作れないと思う) new するときの引数として ステージ や root のようなパスを渡せばできます。 例↓ ---タイムライン----------------- var smp:sample = new sample(this); ----------------------------- ---「sample.as」------------------- package { import flash.display.*; import flash.display.Shape; public class sample { private var me:MovieClip; public function sample(me) { var spr1:Sprite = new Sprite(); spr1.graphics.beginFill(0x0000FF); spr1.graphics.drawRect(0, 0, 300, 200); var spr2:Sprite = new Sprite(); spr2.graphics.beginFill(0xFF0000); spr2.graphics.drawCircle(150, 100, 50); spr1.addChild(spr2); me.addChild(spr1); } } } --------------------------------

John12345
質問者

お礼

ご指摘ありがとうございます。 さっそくタイムライン側のクラス呼び出しの引数に(this)を指定しましたが、同じエラーが表示されてしまいました。 引数の指定以外に必要なものはありますでしょうか? 宜しくお願いいたします。

John12345
質問者

補足

度々申し訳ありません。 ご指摘の通りタイムライン上で引数にthisを指定し、クラスのコンストラクタの前にprivate var me:MovieClip;と記述しmeにaddChildで追加した所、エラーが出ずに再生されましたが、何故クラス宣言の後に生成したMovieClipがステージに追加されたのかがわからなかったのでご教授いただけると幸いです。 初歩的な質問かもしれませんが、宜しくお願いいたします。

関連するQ&A

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

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

  • ASファイルからのstage

    flashcs3 actionscript3.0で作成しています。 asファイル "Test.as" package { import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.display.Stage; import flash.display.StageDisplayState; import flash.events.*; public class Test extends Sprite { public function Test() { init(); } private function init() { for (var i:uint = 0; i<10; i++) { var sp:Sprite = new Sprite(); sp.graphics.beginFill(0x00CCFF); sp.graphics.drawRect(i*20,50,20,20); sp.graphics.endFill(); stage.addChild(sp); } } } } flash var hoge2 = new Test(); と書いてflash上のstage上にSpriteをaddChildしたいのですがstageをnullと解釈してしまいます。 この場合flash上のstageを参照するにはどうすれば良いのでしょうか?

    • ベストアンサー
    • Flash
  • AS3.0・自作クラス内でフレームレート変更

    タイトルの通り自分で作った自作クラス内でフレームレート変更の操作をしたいのですが、上手くいかず困っています。 自作クラス内でstage.frameRateにアクセスしようとするとエラーをはいてしまいます。 自作クラス:A.as(省略してあります) package { import flash.display.*; public class MyClass { private var f:int = stage.frameRate; public function MyClass() { //... } } } -- ・メインとなるクラスからしかstageにはアクセスできないのでしょうか? 自分としては、このクラスでボタンによってフレームレートを変更する機能をつけたいので、このような書き方をしたいのですが・・・。 ・また、このクラス内でaddChilde()するときもエラー(1180: 未定義である可能性が高いメソッド addChild の呼び出しです。)をはいてしまうのですが、これはこのクラスのインスタンスを生成するときに、addChildするための場所(?)を引数として持ってこないといけないのでしょうか? わかる方ご回答よろしくお願いします。

    • ベストアンサー
    • Flash
  • wonderflで作ったクラスを、flaで呼び出す

    3Dオブジェクトが回るクラス http://wonderfl.net/c/cOMF を、同階層に置いたflaファイルで走らせて、swfファイルを作りたいのですが、 何か根本的に間違っているようで、どうしてもうまくいきません。 以下の手順だと思うのですが、、 1) 外部クラスをimportする 2) そのクラスを使って変数を作る?(型は?) 3) 作った変数をaddChildする? flaの1フレーム目: A) MovieClipで import PV3D_01; import flash.display.MovieClip; var showUp:MovieClip = new PV3D_01(); addChild(showUp); 上記を走らせると、以下のエラーが出ます。 1067: Implicit coercion of a value of type PV3D_01 to an unrelated type flash.display:MovieClip. B)Spriteを使ってみると import PV3D_01; import flash.display.Sprite; var showUp:Sprite = new PV3D_01(); addChild(showUp); こんなエラーが出ます。 INFO: Papervision3D 2.0.0 (March 12th, 2009) TypeError: Error #1009: Cannot access a property or method of a null object reference. at PV3D_01() at PV3D_01_kudou_fla::MainTimeline/frame1() おわかりの方、どうか!よろしくお願いします。

    • ベストアンサー
    • Flash
  • addChildした後に操作したい。

    package { import flash.display.*; public class goo extends Sprite { public function goo() { create(); stage.myRect.y =100;// 1119 未定義である可能性が高い・・・エラー。 } public function create() { var myRect:Sprite = new Sprite(); myRect.graphics.beginFill(0xFF0000); myRect.graphics.drawRect(10,10,200,100); myRect.name = "rect"; addChild(myRect); } } } addChildした後にmyRectのyの位置等を変更するにはどうすればよいでしょうか。 また、この問題について詳しく載っているURL等があれば教えてください。 よろしくお願いいたします。

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

    外部クラス(カスタムクラス)からテキストフィールドに表示させたい。 環境は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
  • 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
  • 親クラスのメソッドを別のパッケージの子クラスでオーバーライドするときについて

    早速ではございますが、質問をさせていただきます。 親クラスのパッケージとは異なるパッケージに子クラスが あるとき、子クラスが親クラスのメソッドをオーバーライ ドするときに、親クラスのメソッドのアクセス修飾子を publicかprotectedにしなければコンパイルエラーになり ます。それはなぜなのでしょうか? どうかご教授のほどよろしくお願いします。

    • ベストアンサー
    • Java
  • DirectX8でコンパイルエラー

    DirectX8実践プログラミングという本についてくるサンプルプログラムを コンパイルしようとしているのですが、 sprite.obj : error LNK2001: 外部シンボル "_D3DXCreateSprite@8" は未解決です sprite.obj : error LNK2001: 外部シンボル "_D3DXCreateTextureFromFileA@12" は未解決です sprite.obj : error LNK2001: 外部シンボル "_Direct3DCreate8@4" は未解決です .\Debug/spriteanimate.exe : fatal error LNK1120: 外部参照 3 が未解決です。 link.exe の実行エラー となってしまいます。DirectXを使っての勉強をはじめたばかりなのですが いきなりつまってしまいました。 おそらくライブラリが見つからないのかと思うのですが ライブラリのディレクトリ設定でC:\mssdk\libも追加されていました。 DirectX8SDKについてくるサンプルはコンパイル出来るのですが どういう理由が考えられるでしょうか?

  • AddChildで配置したインスタンスを動かす

    三角や四角などのブロックを並べて遊ぶアプリを作ろうとしています。 ActionScript3.0のAddChildでライブラリからインスタンスを配置させ それをドラッグできるようにしたいのです。 三角のインスタンスを出現させるために「sankakuBlockBtn」というインスタンス名の ボタンを配置し、それをクリックするとライブラリからインスタンスが配置されるという仕組みを考えています。 //クリックイベント sankakuBlockBtn.addEventListener(MouseEvent.CLICK, sankakuHandler); function sankakuHandler(event:MouseEvent):void { //リンケージでクラス名を「sankakuClass」と設定したものをAddChildでステージに配置 var sankaku:sankakuClass = new sankakuClass this.addChild(sankaku); sankaku.x =400; sankaku.y =400; trace(sankaku.name); } 配置することをまではできるのですが、 これをstartDrag()で動かそうとするのですが、 AddChildで配置するたびにインスタンス名が「instance○○」となるので、 これらをどうやって制御するのか分かりません。 最終的には「三角」「四角」「菱形」「台形」「六角形」をそれぞれステージ上に複数配置して、並べて遊べるようにしたいと思っています。 どなたかお力添えいただけないでしょうか。

専門家に質問してみよう