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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     リンゲージの動的な複製
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
yakumo
Åê¹ÆNo.42597
投稿日時: 2009-6-18 12:05
常連
居住地: 東京
投稿: 67
使用環境:
WinVista,FlashCS4,Actionscript3.0
リンゲージの動的な複製
いつもお世話になっています。

ライブラリでリンゲージ設定した2つのアイコンを、縦にずらしながら動的に複数表示するスクリプトを書いています。
問題なのが、せっかく配置できたはずのインスタンスを後に実行した関数が上書きしてしまい。結果として4つ表示させたいものが2つになってしまう点です。(※1)

実体が1つのリンゲージを動的に複数生成する理解、つまり深度、名前等をずらしてaddChildする考え方を理解していない気がします。どなたかアドバイスをいただけないでしょうか?


//空のムービークリップを作成
var mc:MovieClip = new MovieClip();

//リンゲージからMovieClip生成
var ic0:MovieClip = new Icon0();
var ic1:MovieClip = new Icon1();

//位置の変数
var myX:uint = 0;
var myY:uint = 0;

addIcon(ic0); //表示NG
addIcon(ic1); //表示NG
addIcon(ic0); //表示OK(※1)
addIcon(ic1); //表示OK(※1)

//メインタイムラインに配置
this.addChild(mc);

//mcに配置
function addIcon(iconName):void {
mc.addChild(iconName);
iconName.y = myY;
iconName.x = myX;
myY += 10;
}

vader
Åê¹ÆNo.42599
投稿日時: 2009-6-18 13:54
常連
居住地: 東京
投稿: 76
使用環境:
MacOS10.8,FlashCS6
Re: リンゲージの動的な複製
yakumoさん、こんにちわ。

var ic0:MovieClip = new Icon0();
var ic1:MovieClip = new Icon1();
var ic2:MovieClip = new Icon0();
var ic3:MovieClip = new Icon1();

addIcon(ic0);
addIcon(ic1);
addIcon(ic2);
addIcon(ic3);

trace(mc.numChildren);

で如何でしょうか?

yakumoさんのやりたいことを理解できていないかも
知れません。
違ってたら、ごめんなさい。

頑張って下さい。
yakumo
Åê¹ÆNo.42601
投稿日時: 2009-6-18 15:07
常連
居住地: 東京
投稿: 67
使用環境:
WinVista,FlashCS4,Actionscript3.0
Re: リンゲージの動的な複製
vaderさん

投稿有難うございます。
理解しずらい投稿で申し訳ありません。
mc.numChildrenが「2」でなく「4」にする方法を模索しています。
どうぞよろしくお願いたします。
野中文雄
Åê¹ÆNo.42603
投稿日時: 2009-6-18 15:33
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: リンゲージの動的な複製
vaderさんのアドバイスされたのが、その「方法」ではないでしょうか。DisplayObjectContainer.addChild()メソッドには、インスタンスを「複製」する機能はありません。ActionScript 3.0に、DisplayObjectインスタンスを「複製」するメソッドというのは、おそらく備わっていないと思います。
引用:
yakumoさんは書きました:
mc.numChildrenが「2」でなく「4」にする方法を模索しています。


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

yakumo
Åê¹ÆNo.42608
投稿日時: 2009-6-18 17:20
常連
居住地: 東京
投稿: 67
使用環境:
WinVista,FlashCS4,Actionscript3.0
Re: リンゲージの動的な複製
野中さま
有難うございます。

アドバイスをもとに完成できました。
今までは変数を上書きをしていたので、
最後に実行されたもののみが表示されていたようです。

しかし、前から気になっていたんですが、
「ic0」「ic1」という変数が必要に応じて複数生成されているので、変数がかぶっているということです。

同じ変数のインスタンスが複数配置されている…
これは普通の事で、特に気にする事はないのでしょうか?



//位置の変数
var myX:uint = 0;
var myY:uint = 0;

addIcon("ic0");
addIcon("ic1");
addIcon("ic0");
addIcon("ic1");

//mcに配置
function addIcon(ic:String):void {

if(ic == "ic0"){
var ic0 = new Icon0();
ic0.y = myY;
ic0.x = myX;
addChild(ic0);
}else if(ic == "ic1"){
var ic1 = new Icon1();
ic1.y = myY;
ic1.x = myX;
addChild(ic1);
}
myY += 10;
}

野中文雄
Åê¹ÆNo.42610
投稿日時: 2009-6-18 19:02
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: リンゲージの動的な複製
「変数がかぶっている」という意味がわかりかねます。関数を呼出すたびにローカル変数が新たに宣言され、異なった値が代入されることを指しているのでしょうか?それをいわれるのであれば、引数も変数です。これも「かぶっている」と思われるのですか?
var i:String = "timeline variable";
xTest(0);
xTest(1);
trace(i);
function xTest(n:int):void {
	var i:int = n;
	trace(i);
}

なお、「ローカル変数」については、以下をご参照ください。

参考:「キー操作とif以外の条件判定」注釈※1)
引用:
yakumoさんは書きました:
しかし、前から気になっていたんですが、
「ic0」「ic1」という変数が必要に応じて複数生成されているので、変数がかぶっているということです。


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

yakumo
Åê¹ÆNo.42611
投稿日時: 2009-6-18 21:03
常連
居住地: 東京
投稿: 67
使用環境:
WinVista,FlashCS4,Actionscript3.0
Re: リンゲージの動的な複製
野中さま
ご返信有難うございます。
参考サイトもご提示いただき有難うございます。

下記のように簡略化してもう一度考えてみました。
関数を呼び出すたびに、毎回同じローカル変数(ic0)が新たに宣言されるので、
4回目の関数が実行された結果のみ表示されるのでは…と疑問でした。
もう少しこの辺を勉強してみます。


//結果:4つのIcon0が重なって表示される
addIcon(); //1回目
addIcon(); //2回目
addIcon(); //3回目
addIcon(); //4回目★

function addIcon():void {
var ic0 = new Icon0();
addChild(ic0);
}

野中文雄
Åê¹ÆNo.42612
投稿日時: 2009-6-18 21:18
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: リンゲージの動的な複製
インスタンスの存在とその参照を代入した変数の値とは、区別する必要があります。
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0x0000FF);
mySprite.graphics.drawCircle(50, 50, 50);
addChild(mySprite);
mySprite = null;

var o:Object = new Object();
var _array:Array = new Array();
_array.push(o);
o = null;
trace(o, _array);

var o0:Object = new Object();
var o1:Object = o0;
o0 = null;
trace(o0, o1);

引用:
yakumoさんは書きました:
関数を呼び出すたびに、毎回同じローカル変数(ic0)が新たに宣言されるので、
4回目の関数が実行された結果のみ表示されるのでは…と疑問でした。


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

森 巧尚
Åê¹ÆNo.42614
投稿日時: 2009-6-18 21:43
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: リンゲージの動的な複製
最初から「上書きしてしまい」と言っておられるので、半分理解されているようです。

newの返り値を入れる変数は、そのオブジェクトをつかんでおく首輪のようなものです。

1個の変数で4回newを繰り返すこともできますが、首輪は1本しかないので、これは最後の1匹だけは捕まえていますが、最初の3匹は放し飼い状態ということです。

放ったらかしでいいならそれでもいいですが、それぞれに何か命令したいなら首輪は4本用意しておくほうがいいということです。


----------------
森 巧尚
http://www.ymori.com

yakumo
Åê¹ÆNo.42617
投稿日時: 2009-6-18 22:42
常連
居住地: 東京
投稿: 67
使用環境:
WinVista,FlashCS4,Actionscript3.0
Re: リンゲージの動的な複製
▼野中さま

ご返信有難うございます。

「インスタンスの存在とその参照を代入した変数の値とは、区別する必要があります。」

なんとなくしっくりこなかった部分が見えてきました!
私が理解していなかった事の1つが
「値渡しと参照渡し」についてですね。

ic0は「参照」をしている変数ですね。(これでこの変数の役目は終わり?)
作られたオブジェクトへの参照にこの変数を使うのではなく、
getChildAt()などを使ったり…


▼森さま

ご返信有難うございます。

もう一つ理解していなかったのがこれですね。
最後の1匹以外は放し飼い状態なんですね。
すごく分かりやすいです(笑)

ほったからしにしても、上記のようにgetChildAt()で捕まえられるので、
問題ないということですね。


皆様本当にありがとうございます。
突き詰めていくと、初心者にとって重要な部分だと分かりました。
完璧に理解するために、この辺をこれからじっくり検証したいと思います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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