トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   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なクラスには、例外として自由にプロパティ(変数)やメソッド(関数)を加えることが可能です。「子オブジェクト」が作成できるできないの問題ではありません(表示リストに加えたインスタンスは「子オブジェクト」です。ただ、そのインスタンスを格納する「変数」が、勝手に設定できないだけのことです)。
var my_mc:MovieClip = new MovieClip();
my_mc.test = "MovieClip";  // OK
var mySprite:Sprite = new Sprite();
// mySpreite.test = "Sprite";  // エラー

引用:
mamotinさんは書きました:
前のスクリプトではムービークリップの中に「mc001.sh002 = new Shape();」とシェイプを追加しておりましたが、今度は「sp001.sh003 = new Shape();」というふうにスプライトの中にシェイプを追加しようとしたところ、
引用:
1119: 未定義である可能性が高いプロパティ sh003 に静的型 flash.display:Sprite の参照を使用してアクセスしています。

というようなエラーが発生してしまいます。
...[中略]...
これは、表示リストにシェイプを追加することはできても、
スプライトの子オブジェクトとしてシェイプを作成することができないということなのでしょうか?


----------------
 

ニノミヤ カズノリ
Åê¹Æ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さんは書きました:
前のスクリプトではムービークリップの中に「mc001.sh002 = new Shape();」とシェイプを追加しておりましたが、今度は「sp001.sh003 = new Shape();」というふうにスプライトの中にシェイプを追加しようとしたところ、

1119: 未定義である可能性が高いプロパティ sh003 に静的型 flash.display:Sprite の参照を使用してアクセスしています。

というようなエラーが発生してしまいます。

-- 中略 --

これは、表示リストにシェイプを追加することはできても、
スプライトの子オブジェクトとしてシェイプを作成することができないということなのでしょうか?

その通りです。
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さんは書きました:
↓配列を含むものでもやってみました。-----------------------
...[中略]...
function loop3D( event:Event ):void {
	// mc001.h001[1].y = mouseY;
	h001[1].y = mouseY;
}

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さんは書きました:
var mc001:MovieClip = new MovieClip();
addChild(mc001);

var sh001:Shape = new Shape();
sh001.graphics.beginFill(0xffff00);
sh001.graphics.drawCircle(0,0,50);
sh001.graphics.endFill();
mc001.addChild(sh001);
mc001.sh001 = sh001;  // 追加

//////////////////////////////////////////////////動き


function loop3D( event:Event ):void {
	mc001.sh001.x = mouseX;
}
this.addEventListener( Event.ENTER_FRAME, this.loop3D );

...[中略]...
以上のように
mc001.sh001.x = mouseX;

と記入するとエラーが発生してしまいます。

F-site「MovieClipインスタンスとインスタンス名」をお読みください。
引用:
また上記の様に後から動的にムービークリップを追加するのではなく、最初からステージにムービークリップを作っておき、以下のようにするとちゃんとうごいてくれます。
mc001.sh001.x = mouseX;

上記のものと比べて、後で作るか、最初に作るかぐらいしか違いがわからないのですが、何か違いがあるのでしょうか?

なお、ご質問に回答が得られたら、フィードバックをしましょう。→【フィードバックをしない


----------------
 

ニノミヤ カズノリ
Åê¹Æ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 さんが書かれているコードで問題は無い訳です。
mc001.x = mouseX;
sh001.x = mouseX;

引用:
mamotinさんは書きました:
また上記の様に後から動的にムービークリップを追加するのではなく、最初からステージにムービークリップを作っておき、以下のようにするとちゃんとうごいてくれます。

mc001.sh001.x = mouseX;

上記のものと比べて、後で作るか、最初に作るかぐらいしか違いがわからないのですが、何か違いがあるのでしょうか?

この場合は mc001 の子オブジェクトとして作成しているので、スクリプトで同じ様にするなら、例えば下記の様にする必要があります。
var mc001:MovieClip = new MovieClip();
addChild(mc001);

mc001.sh001 = new Shape();
mc001.sh001.graphics.beginFill(0xffff00);
mc001.sh001.graphics.drawCircle(0,0,50);
mc001.sh001.graphics.endFill();
mc001.addChild(mc001.sh001);
(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops