メイン ActionScript 3.0 特設会議室 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 | 投稿するにはまず登録を |
スレッド表示 | 古いものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
mamotin | Åê¹ÆNo.40928 投稿日時: 2008-12-3 3:45 |
新米 居住地: 投稿: 19
使用環境:
WinXP FlashCS3 |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 野中文雄さん、ニノミヤ カズノリさん返信ありがとうございます。
今回色々と教えていただいたおかげで少し理解が深まりました。 どういったクラスで、どんなプロパティをもっているのかを調べるのが必要だと思いました。 |
野中文雄 | Åê¹ÆNo.40750 投稿日時: 2008-11-13 17:06 |
ちょんまげら 居住地: 東京 投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1) |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 ActionScript 3.0では、クラスに予め「定義」されていないプロパティ(変数)は、原則として勝手に追加することは許されません。それが「未定義」というエラーの意味です。
[ActionScript 3.0コンポーネントリファレンスガイド]の[コンパイルエラー]より引用: 指定されたオブジェクトには存在しないプロパティにアクセスしようとしています。 ただし、ObjectやMovieClipなどdynamicなクラスには、例外として自由にプロパティ(変数)やメソッド(関数)を加えることが可能です。「子オブジェクト」が作成できるできないの問題ではありません(表示リストに加えたインスタンスは「子オブジェクト」です。ただ、そのインスタンスを格納する「変数」が、勝手に設定できないだけのことです)。
引用: mamotinさんは書きました: |
ニノミヤ カズノリ | Åê¹ÆNo.40736 投稿日時: 2008-11-13 10:25 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 引用:
mamotinさんは書きました: その通りです。 flash.display.Sprite は dynamic クラスではない為、 インスタンスに属性や関数定義を追加する事は出来ません。 参考: 【akihiro kamijo: dynamic クラス】 |
mamotin | Åê¹ÆNo.40733 投稿日時: 2008-11-13 5:11 |
新米 居住地: 投稿: 19
使用環境:
WinXP FlashCS3 |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 ニノミヤ カズノリさん返信ありがとうございました!
あれから色々と試してみたのですが、また一つ疑問点がでてきてしまいました。 前のスクリプトではムービークリップの中に「mc001.sh002 = new Shape();」とシェイプを追加しておりましたが、今度は「sp001.sh003 = new Shape();」というふうにスプライトの中にシェイプを追加しようとしたところ、 1119: 未定義である可能性が高いプロパティ sh003 に静的型 flash.display:Sprite の参照を使用してアクセスしています。 というようなエラーが発生してしまいます。 また以下のような書き方をすれば、ちゃんと表示されるのですが・・・ for (var k:int = 5; k<7; k++) { var sh003:Shape = new Shape(); sh003.graphics.beginFill(0xff0000); sh003.graphics.drawCircle(0,0,50); sh003.graphics.endFill(); sh003.y=200; sh003.x=100*k; sh003.name = "maru"+k; sp001.addChild(sh003); } これは、表示リストにシェイプを追加することはできても、 スプライトの子オブジェクトとしてシェイプを作成することができないということなのでしょうか? ----------------------------------------ソースここから var mc001:MovieClip = new MovieClip(); addChild(mc001); var sp001:Sprite = new Sprite; addChild(sp001); for (var j:int = 3; j<5; j++) { mc001.sh002 = new Shape(); mc001.sh002.graphics.beginFill(0xff0000); mc001.sh002.graphics.drawCircle(0,0,50); mc001.sh002.graphics.endFill(); mc001.sh002.y=100; mc001.sh002.x=100*j; mc001.sh002.name = "maru"+j; mc001.addChild(mc001.sh002); trace(mc001.sh002.name); } for (var k:int = 5; k<7; k++) { sp001.sh003 = new Shape(); sp001.sh003.graphics.beginFill(0xff0000); sp001.sh003.graphics.drawCircle(0,0,50); sp001.sh003.graphics.endFill(); sp001.sh003.y=200; sp001.sh003.x=100*k; sp001.sh003.name = "maru"+k; sp001.addChild(sp001.sh003); trace(sp001.sh003.name); } /* //////////////////////////////////////////////////動き addEventListener( Event.ENTER_FRAME, this.loop3D );////////毎フレームレンダリング開始 function loop3D( event:Event ):void { sp001.getChildByName("maru5").y=mouseY; mc001.getChildByName("maru3").y=mouseY; } |
mamotin | Åê¹ÆNo.40732 投稿日時: 2008-11-13 4:06 |
新米 居住地: 投稿: 19
使用環境:
WinXP FlashCS3 |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 getChildByNameを使ってアクセスする方法でやってみました。
-------------------------------------ソースここから var sp001:Sprite = new Sprite; addChild(sp001); //////////////////////////////シェイプを作成 for (var i:int = 0; i<3; i++) { var sh001:Shape = new Shape(); sh001.graphics.beginFill(0xffff00); sh001.graphics.drawCircle(0,0,50); sh001.graphics.endFill(); sh001.x=100*i; sh001.name = "maru"+i; sp001.addChild(sh001); } //////////////////////////////////////////////////動き addEventListener( Event.ENTER_FRAME, this.loop3D );////////毎フレームレンダリング開始 function loop3D( event:Event ):void { sp001.getChildByName("maru0").y=mouseY; } |
mamotin | Åê¹ÆNo.40726 投稿日時: 2008-11-12 1:19 |
新米 居住地: 投稿: 19
使用環境:
WinXP FlashCS3 |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 野中さん、返信ありがとうございます!
どうしても、「mc001.h001[1].y = mouseY;」のように記述したかったのは、以下のソースの様に配列を作成した後、さらにその要素の中に配列を作成し、その後アクセスをしたかった為です。 以下の様に要素の中に配列を作成すると、同じ名前の要素(h001[i])が作られるので、それらを「一つ一つ別々に動かしたい」となった時、「h002[1].h001[3].y = mouseY;」の様な形が必要になりました。 なんとか動かすことができました! ------------------------------------------ソースここから var h002:Array = new Array(9); for (var j:int = 0; j<10; j++) { h002[j]= new MovieClip(); h002[j].y=j*100; addChild(h002[j]); h002[j].h001 = new Array(9); for (var i:int = 0; i<10; i++) { h002[j].h001[i] = new Shape(); h002[j].h001[i].graphics.beginFill(0xffff00); h002[j].h001[i].graphics.drawCircle(0,0,50); h002[j].h001[i].graphics.endFill(); h002[j].h001[i].x = i*100; h002[j].addChild(h002[j].h001[i]); } } //////////////////////////////////////////////////動き this.addEventListener( Event.ENTER_FRAME, this.loop3D );////////毎フレームレンダリング開始 function loop3D( event:Event ):void { h002[1].h001[1].y=mouseY; } |
野中文雄 | Åê¹ÆNo.40718 投稿日時: 2008-11-11 2:47 |
ちょんまげら 居住地: 東京 投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1) |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 mc001.sh001にsh001の参照を代入したのは、エラーが発生する理由を確かめるためです。どちらの変数も同じShapeインスタンスを参照しているのですから、とくに必要がないかぎり、MovieClipインスタンスmc001にわざわざ変数sh001を設定しなくてもよいと思われます。
引用: mamotinさんは書きました: 「flash mxでのflv再生」のご質問は、解決したのでしょうか? 引用: Fumioは書きました: |
mamotin | Åê¹ÆNo.40716 投稿日時: 2008-11-11 1:38 |
新米 居住地: 投稿: 19
使用環境:
WinXP FlashCS3 |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 野中文雄さん、ニノミヤ カズノリさん、返信ありがとうございます!
addChildで変数(sh001)がそのまま、ムービークリップ(mc001)に追加されるわけでは無いのですね・・・ 野中さんの方法では最後に変数をわたしてあげていて、 ニノミヤさんの方法では変数の宣言事態を、ムービークリップ(mc001)の中でしているのですね! 基本をちゃんと理解していないとダメですね・・・ わかりやすい解説本当にありがとうございました! ↓配列を含むものでもやってみました。----------------------- var mc001:MovieClip = new MovieClip(); addChild(mc001); mc001.x = 100; mc001.y = 100; /* mc001.sh001 = new Shape(); mc001.sh001.graphics.beginFill(0xffff00); mc001.sh001.graphics.drawCircle(0,0,50); mc001.sh001.graphics.endFill(); mc001.addChild(mc001.sh001); var sh001:Shape = new Shape(); sh001.graphics.beginFill(0xffff00); sh001.graphics.drawCircle(0,0,50); sh001.graphics.endFill(); mc001.addChild(sh001); mc001.sh001 = sh001; */ var h001:Array = new Array(9); for (var i:int = 0; i<10; i++) { h001[i] = new Shape(); h001[i].graphics.beginFill(0xffff00); h001[i].graphics.drawCircle(0,0,50); h001[i].graphics.endFill(); h001[i].x = i*40; mc001.addChild(h001[i]); mc001.h001=h001; } //////////////////////////////////////////////////動き function loop3D( event:Event ):void { mc001.h001[1].y=mouseY; } this.addEventListener( Event.ENTER_FRAME, this.loop3D ); |
野中文雄 | Åê¹ÆNo.40713 投稿日時: 2008-11-11 0:00 |
ちょんまげら 居住地: 東京 投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1) |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 「sh001」は、このフレームアクション上に宣言された変数です。「mc001」には、同名の変数やプロパティが設定されていません。
引用: mamotinさんは書きました: F-site「MovieClipインスタンスとインスタンス名」をお読みください。 引用: また上記の様に後から動的にムービークリップを追加するのではなく、最初からステージにムービークリップを作っておき、以下のようにするとちゃんとうごいてくれます。 なお、ご質問に回答が得られたら、フィードバックをしましょう。→【フィードバックをしない】 |
ニノミヤ カズノリ | Åê¹ÆNo.40712 投稿日時: 2008-11-10 23:50 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: 動的に入れ子になったインスタンスを追加し、そのインスタンスを動かす。 addChild は表示リストに追加するメソッドであり、
オブジェクトをそのまま mc001 に追加している訳ではありませんので、 mc001.sh001 でアクセスする事は出来ません。 今回の場合、マウスに追従させるのであれば sh001 を内包している mc001 を動かす。 もしくは sh001 自体を動かせば良いので、mamotin さんが書かれているコードで問題は無い訳です。
引用: mamotinさんは書きました: この場合は mc001 の子オブジェクトとして作成しているので、スクリプトで同じ様にするなら、例えば下記の様にする必要があります。
|
(1) 2 » |
スレッド表示 | 古いものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |