14歳の自分に衝撃の事実を告げてください

※実際にやりたいことは違うのですが、
分かりやすくするため簡易的にしています。

ステージに配置された2つのインスタンスを
y=300に移動するというものを作りたいと思っています。
(実際には100以上になるので動的に生成したいです。)

var num:int = 2;

var _mc:Array = [];
var _mcName:Array = [];
for(var i=0; i < num; i++){
_mc.push("test_mc"+i);
_mcName.push("test_mc"+i);
}

for(var n=0; n < num; n++){
_mc[n] = new MovieClip;
_mc[n].addEventListener(Event.ENTER_FRAME, function() {
MovieClip(getChildByName(_mcName[n])).y = 300;
});
}

上記を実行すると下記のエラーが出ます。

TypeError: Error #2007: パラメータ name は null 以外でなければなりません。
at flash.display::DisplayObjectContainer/getChildByName()
at MethodInfo-1()


下記のように並べて記述するとうまくいくのですが・・・・
これを100個以上も書くのはばかばかしいので。。。

_mc[0] = new MovieClip;
_mc[0」.addEventListener(Event.ENTER_FRAME, function() {
MovieClip(getChildByName(_mcName[0])).y = 300;
});
_mc[1] = new MovieClip;
_mc[1」.addEventListener(Event.ENTER_FRAME, function() {
MovieClip(getChildByName(_mcName[1])).y = 300;
});

ご教授お願いいたします!

A 回答 (1件)

元から全体的に無茶な感じがしますが.../(-_-)ヽ。


というか,
「getChildByNameに変数を利用する」意味などあるのだろうか?
という気がします。



まず,
getChildByName(NAME)
に入れるNAMEは "インスタンス名" ですよ。

そもそも「MovieClipインスタンス」とはステージ上に存在するインスタンスです。
(「シンボル と インスタンス」 でいう意味のインスタンスです。)
また「MovieClipのインスタンス名」とはステージ上に存在するときのインスタンスの名前です。


だからまず _mc[n] をステージ上に配置した上で,
そのインスタンスにインスタンス名を付けなければなりません。

それで書き直すと次のようになります。

----------------------------
var num:int = 2;

var _mc:Array = [];
var _mcName:Array = [];
for(var i=0; i < num; i++){
_mc.push("test_mc"+i);
_mcName.push("test_mc"+i);
}

for(var n=0; n < num; n++){
_mc[n] = new MovieClip;
addChild(_mc[n]);
_mc[n].name = _mcName[n];
_mc[n].addEventListener(Event.ENTER_FRAME, setY(n));
}

function setY(myNum:int):Function{
return function():void{
MovieClip(getChildByName(_mcName[myNum])).y = 300;
}
}
----------------------------


しかしどうみても回りくどすぎます。
なんでわざわざインスタンス名を付けてそれを取得せねばならないんですか?
意味がわかりません。

ActionScript 3.0 では,そもそもインスタンス名など使う必要性は 0 に近いんです。
※手動でステージ上に配置するインスタンスの場合
  インスタンス名を付けておくと,
  オーサリングが自動的にそのインスタンスを参照する
  同名の変数を用意してくれます。
  ActionScript 3.0 では一般的に
  その変数に対して何かを命令します。
  したがってActionScript上では結局
  インスタンス名自体に特に意味はないということです。

というわけで,
インスタンス名など使わず,これで良いのではないでしょうか↓。

----------------------------
var num:int = 2;

var _mc:Array = [];
for (var i=0; i < num; i++) {
_mc.push ("test_mc"+i);
}

for (var n=0; n < num; n++) {
_mc[n] = new MovieClip;
//addChild (_mc[n]);//←あってもなくても実行上問題ない
_mc[n].addEventListener (Event.ENTER_FRAME, setY(n));
}

function setY(myNum:int):Function{
return function():void{
_mc[myNum].y = 300;
}
}
----------------------------


あと,
Event.ENTER_FRAM で y を 300 にし続ける意味もさっぱりわかりませんが,
これは1つの例(実際はあり得ないけど単なる架空のサンプル例)という意味としてそのままにしています。

「F-site [AS3] MovieClipインスタンスとインスタンス名」
http://f-site.org/articles/2008/04/19014939.html

この回答への補足

すいません。
スレから少しづれてしまったので、
いったん締めます!
また、別スレでご質問させていただきます。
ありがとうございました。

補足日時:2010/04/11 02:39
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

1個目に記述いただいたの方問題なく動作いたしましたありがとうございます。

ただ、最後に記述いただいた、

var num:int = 2;

var _mc:Array = [];
for (var i=0; i < num; i++) {
_mc.push ("test_mc"+i);
}

for (var n=0; n < num; n++) {
_mc[n] = new MovieClip;
//addChild (_mc[n]);//←あってもなくても実行上問題ない
_mc[n].addEventListener (Event.ENTER_FRAME, setY(n));
}

function setY(myNum:int):Function{
return function():void{
_mc[myNum].y = 300;
}
}

は動きませんでした。
エラーこそないのですが。。。
(そちらでは動いていますでしょうか・・・)

私も初めは、普通に_mc.yという感じでやってたのですが、
うんともすんともいかず、インスタンス名で指定するやり方を
知りそれで試したところうまくいったもので・・・

もしお時間なりましたら、
再度ご確認いただけますと幸いです!!

お礼日時:2010/04/10 17:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!