ライブラリにおいてあるムービークリップに対して、リンゲージでActionScriptに書き出しをチェックを入れてクラス化したモノを、var 変数名:クラス名 = new クラス名();で生成して、stage.addChild(変数名);でステージに配置するのは基本だと思います。が、この一連の流れで一体どこにインスタンス名を設定するのか非常に悩んでしまいました。

単純にMovieClipを生成するだけなら、var 変数名:MovieClip = new MovieClip();でできちゃいます。ActionScript2以下の場合では、createEmptyMovieClipを使って空のMovieClipを生成していたと思います。

インスタンスを作成する場所.createEmptyMovieClip(インスタンス名, 深度)

第二引数にインスタンス名を設定ができ、例えばforで繰り返し生成する場合は、インスタンス名に対して「i」を連結させて連番名などにしたりしていました。さて、、ActionScript3.0ではどうするのでしょうか。。。

まず、空のMovieClipを生成した時の名前を調べました。

var mc:MovieClip = new MovieClip();
trace(mc.name);//「instance1」と出力
「name」はActionScript2以下の場合は「_name」でアンダーバーがいりましたが、ActionScript3.0ではアンダーバーがいらなくなりました。newしたMovieClipの名前をtraceしてみると「instance1」と出力されました。
これをforで繰り返して生成したMovieClipにアクセスする為には「instance1」「instance2」とかのまま作られたらダメですよね。。。

そこで調べました。なんと!ActionScript2以下ではインスタンス名を調べることしかできなかったnameが、ActionScript3.0からnewしたインスタンス名に設定できることが分かりました、つまり、

var mc:MovieClip = new MovieClip();
mc.name = "myMc";
trace(mc.name);//「myMc」と出力
こう書けちゃうんです!勘の鋭い方はもう分かると思いますが、forで繰り返すときは、変数名.nameに代入する文字列に対して「i」とかを連結すればOK!
for(var i:int = 0; i<5; i++){
	var mc:MovieClip = new MovieClip();
	mc.name = "myMc"+i;//←ここで連番名にできる
	trace(mc.name);
}
これは、ActionScript3.0を覚える最初のほうの壁ですね。。。どなたか同じ壁にぶち当たってこれみて助かれば御の字です。

[2012/04/03追記]

名前を付けたMovieClipにアクセスするには、getChildByName(“インスタンス名”);でアクセスする事ができます。

for(var i:int = 0; i<5; i++){
	var mc:MovieClip = new MovieClip();
	mc.name = "myMc"+i;//←ここで連番名にできる
	stage.addChild(mc);
	trace(mc.name);
}
stage.getChildByName("myMc3").y = 30;
ActionScript3.0でインスタンス名を調べたり設定する方法
Pocket

Tagged on:

6 thoughts on “ActionScript3.0でインスタンス名を調べたり設定する方法

  • 2012/04/04 at 18:52
    Permalink

    cotaponさん本当にありがとうございます!
    頭の中がroot、thisとas2をかなり引きずっているようで
    初心者には「stage」とはなかなか思いつきませんでした。。
    もっと、表示オブジェクトやら表示オブジェクトコンテナなどしっかり勉強せねば!
    でもcotaponさんのおかげでこの件に関しては認識(つもり?)させていただきました!
    最後に重なってなりますが、本当にありがとうございます。

    Reply
  • 2012/04/03 at 20:54
    Permalink

    inlockさん、こんばんは!

    >「this.myMc1.y=30;」
    おおお!こっちのほうですね!
    stage.getChildByName(“myMc1”).y = 30;
    ↑このようにアクセスしてみたら動くと思います。

    stageにaddChildしているので、stageにあるインスタンス名を、getChildByName(“インスタンス名”)でアクセスできます。

    記事に追記しますね!

    Reply
  • 2012/04/03 at 16:41
    Permalink

    cotaponさん、ご教授ありがとうございます!!!
    分かり易い説明で、無事に思っている通り動いてくれました。
    なるほど、「{mc.y=50;});」は最後の変数が代入されたmcなのでそのような動きをしていたんですね!思わずポンと手を打ってしまいました。「currentTarget」。。なかなか出てきませんでした。。本当にありがとうございます。
    ところで、私が記載したスクリプト最後で「this.myMc1.y=30;」とあります。
    せっかく連番でインスタンス名を作ったんだから、他箇所から作ったインスタンス名で何か動きを加えたいのですが、やはりエラーが。。
    こちらも本当にお手数ですがご教授いただけると助かりますので
    是非ともよろしくお願いいたします。

    Reply
  • 2012/04/03 at 08:55
    Permalink

    inlockさん、こんにちは。はじめまして。

    mc.addEventListener(MouseEvent.CLICK, function(event)
    {mc.y=50;});
    ↑ここのところの、mc.y=50; のmcは、forでまわした最後の5番目が変数に代入されるので、プログラム的には正しいことになります。

    {mc.y=50; trace(event);});
    MouseEventの引数、eventに対してtraceすると、そのクリックされたMCのeventが見れると思います。この引数にeventにいろんな情報がありまして、

    {event.target.y=50; trace(event.target);});
    ↑event.target とすると、クリックされた実態が出て、画像も無事に動くと思います。が、[object Loader]と出てしまい、動いているように見えますが、実は画像を読み込んだ、mc_loaderが動いていることになるので、

    mc.addEventListener(MouseEvent.CLICK, function(event)
    event.currentTarget.y+=50;});
    ↑こうすると、inlockさんがやりたいことになると思います。おそらくこれが正解じゃないでしょうか??

    僕もFlashやり始めでつまずいたところです。^ ^ ;

    Reply
  • 2012/03/30 at 22:24
    Permalink

    はじめまして。as3初心者のinlockといいます。
    MovieClipをforを使用し作った際にインスタンス名を変えたい!と思っていたところこのサイトを発見し、なるほど!!と思い感謝しています。
    例文で出ているものに画像を読込んでそれぞれボタン機能(クリックしたボタンの位置を変える)を付属しようと思ったところウムム。。思った通りに動きませんでした。。どのボタンをクリックしても動くのは最後に作ったMovieClipだけ。。どうやらクリックした際には皆同じ「mc.y=50;」が。そこでスクリプト一番下の「this.myMc1.y=30;」でインスタンス名をせっかく付けたんだから単純に動かしてみよう!と思ったらエラー「TypeError: Error #1010: 条件は未定義であり、プロパティがありません。」。それではと「mc.addEventListener」を「”myMc”+i」にしてみたりしてみたのですが結果はエラーに。かなりのas3初心者でもうどこをどう修正したらいいのか分からなくなりコメント(質問ですね。すみません)させていただきました。少しずれてしまうかもしれませんがお手数ですがご教授いただけませんでしょうか?

    for(var i:int = 0; i<5; i++){
    var mc:MovieClip = new MovieClip();
    mc.name = "myMc"+i;//←ここで連番名にできる

    var mc_loader:Loader = new Loader();
    mc.addChild(mc_loader);
    mc_loader.load(new URLRequest(i+".png"));
    stage.addChild(mc);
    mc.x=85*i; mc.y=100;
    mc.buttonMode = true;
    //trace(mc.name); //出力myMc0〜5

    mc.addEventListener(MouseEvent.CLICK, function(event)
    {mc.y=50;});

    }
    this.myMc1.y=30;

    Reply

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です