電子書籍の厳選無料作品が豊富!

ActionScript3.0です。
やりたい事としましては、例えばAのBOXがあり、その中にb,cのインスタンスがあるとします。
このAの中にあるbをAのBOXから出したいのですが、そういうことは出来るのでしょうか?

すいません分かりづらくて。
ようするに、
A.b.addEventListener.....とアクセスするのを、
b.addEventListener....で、アクセス出来るように変更したいんです。

もしお詳しい方いればご教授ください。

A 回答 (2件)

確かに分かりずらいご質問ですね...。


なぜかと言うと

「A.b.addEventListener...を b.addEventListener...に変更」
「オブジェクトの重なり順を変更する」
「Aの中にあるbをAのBOXから出す」

この3つは,基本的には全く別のことだからです。

3つとも全てに回答すれば
そのうちのどれかが求めていらっしゃることに当たるかもしれません。

以下ではすべて,
はじめに次のようなタイムライン階層になっているものとします。

 スクリプトを書く階層(=this)
   └A(ムービークリップ)
      └b(ムービークリップ)

※ A 内の c は登場しないようなので略します。



=== === ===

(1)A.b.addEventListener...を b.addEventListener...に変更

ActionScript 3.0 では,
ムービークリップにインスタンス名を付けると言っても
結局のところインスタンスは「変数」で管理するようになっています↓。

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

したがって

> A.b.addEventListener.....とアクセスするのを、
> b.addEventListener....で、アクセス出来るように変更

これは簡単なことで
次の1行のスクリプトを書けば良いだけです。

-------------------------------
//変数「b」に 「A」内の「b」の参照を代入
var b:MovieClip = A.b;
-------------------------------

これで本当にできているのか,
「制御」→「ムービープレビュー」で検証する用のスクリプトも書いておきます。

-------------------------------
//変数「b」に 「A」内の「b」の参照を代入
var b:MovieClip = A.b;

//「b」クリック時に 関数bClick を実行
b.addEventListener(MouseEvent.CLICK,bClick);

//関数bClick の定義
function bClick(e:Event):void {
//「b」のインスタンス名でも出力させてみる
trace(e.currentTarget.name);
}
-------------------------------



(2) オブジェクトの重なり順を変更する

重なり順とはZ軸の表示順序で,
ActionScript 1.0/2.0 時代の名残かもしれませんが深度とも言われます。

・ActionScript 3.0「深度」
http://www.yosukesugahara.com/diary/actionscript …
・AS3.0リンケージ深度やレイヤー階層
http://d.hatena.ne.jp/jedisystemer/20100113/1263 …

上記ページなどに書いてあるように,
重なり順は setChildIndex や swapChildren などで変えます。

「A」内の「b」を,「A」の箱から出したように見せるには
次のようにして「A」内での「b」の重なり順を一番上にしても良いでしょう。

-------------------------------
//「A」内の最高深度を取得
var h_depth:int = A.numChildren - 1;

//「A」内の「b」を「A」内の最高深度にする
A.setChildIndex(A.b, h_depth);
-------------------------------

下の添付図↓は,
上記スクリプトを実際に確かめてみた様子です。
添付図のようなものを作成した場合,
「A」内の「b」が,「A」内に描いた箱の外(上)に表示されるようになります。



(3) Aの中にあるbをAのBOXから出す

つまりインスタンス自体のタイムライン階層を
次のように↓変更するということですね。

 スクリプトを書く階層(=this)
   ├b(ムービークリップ)
   └A(ムービークリップ)

これは ActionScript 2.0 まではできなかったことなのですが
ActionScript 3.0 では概念が変わったため簡単にできます。
たった1行です↓。

-------------------------------
//この階層に「A」内の「b」を配置
this.addChild(A.b);
-------------------------------



(1)~(3) の3通りの回答をしてみました。

ここまで書いて思うのですが,
仮に (3) の「Aの中にあるbをAのから出す」が求めていらっしゃることだったとします。
しかし
(3) をしても (1) の「A.b.addEventListener...を b.addEventListener...に変更」 をしたことにはなりません。

次のように試してみるとわかります。
「bなど存在しないよ!」という内容のエラーが出ると思います。

-------------------------------
//この階層に「A」内の「b」を配置
this.addChild(A.b);

//「b」クリック時に 関数bClick を実行
b.addEventListener(MouseEvent.CLICK,bClick);

//関数bClick の定義
function bClick(e:Event):void {
//「b」のインスタンス名でも出力させてみる
trace(e.currentTarget.name);
}
-------------------------------

なぜエラーが出るのかという理由は (1) で書いたURLページの説明にある通りで
「b」という変数がスクリプトを書いた階層に存在しないからです。

したがって
(1) と (3) の両方をする場合は
(1) のことも (3) のことも両方ともしなければならないということになります。
(1) と (3) とは全く別のことですから。↓

-------------------------------
//変数「b」に「A」内の「b」の参照を代入
var b:MovieClip = A.b;

//この階層に変数「b」が参照するMCを配置
this.addChild(b);

//「b」クリック時に 関数bClick を実行
b.addEventListener(MouseEvent.CLICK,bClick);

//関数bClick の定義
function bClick(e:Event):void {
//「b」のインスタンス名でも出力させてみる
trace(e.currentTarget.name);
}
-------------------------------



長くなりましたが以上です。
「オブジェクトの重なり順の変更」の回答画像2
    • good
    • 0
この回答へのお礼

ありがとうございます!!
説明分かりづらくてすみません!!

自分のやりたかったのはまさに(3)でした!!
すごく分かりやすい説明で大変勉強になりました!

またなにかありましたらよろしくお願いします!!!

お礼日時:2011/05/27 22:53

AのparentにbをaddChildすれば


かってにAからはremoveされますが
重ね順はどうやったって変わってしまいます


それにちゃんと外に出したらAにかかってた
transformとかfiltersとかを乗じてやんないと
ちゃんともとの位置と形になりません

しかもtransform.matrixって
getter setter実装な上に
matrix.concatは結果を返さないから
一回どっかに格納してわたさないといけない

めんどいです


var mtx=A.b.transform.matrix
mtx.concat(A.transform.matrix)
A.b.transform.matrix=mtx
A.parent.addChild(A.b)

とりあえずmatrixだけでいいならこんなカンジ

あとアニメーションとかしてたら
そっちにも反映してやらんといけない

把握しきれないならやらない方がいいです
っていうか階層構造変えるとかやらないほうがいいです

あっちで参照が切れてエラーになっただの
こっちでアニメーションが変になっちゃっただの
ろくなことが起きません

どうしてもやらないとダメなんですか?
    • good
    • 0
この回答へのお礼

ありがとうございます!

おかげさまでやり方分かりました!
はい、どうしてもやりたいんです。

たしかにあまり複雑にしてしまうと大変そうですね!
参考にさせてもらいます!!

お礼日時:2011/05/27 22:55

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