「忠犬もちしば」のAIボットを作ろう!

複数生成したムービーの中のムービーはドラッグ移動できないようにしたい。
環境はActionScript3.0です。
chipというシンボルからdotMC+連番というインスタンスを複数生成しながら
ドラッグできるようにして、その中にeditMC+連番というインスタンスを
生成しました。
ところがdotMC+連番はドラッグできるのですが、editMC+連番もドラッグすると
それ単体で移動してしまいます。
おそらくevent.targetにしているのでeditMC+連番単体でも
動いてしまうのでしょうが、それを動かないようにできないでしょうか。
宜しくお願いします。

for(var j=0; j<10; j++) {
var dotMC:chip = new chip();
dotMC.name="dotMC"+j;
addChild(dotMC);
dotMC.addEventListener(MouseEvent.MOUSE_DOWN, chipMCmove);
dotMC.addEventListener(MouseEvent.MOUSE_UP, chipMCStop);

var editMC:edit = new edit();
editMC.name="editMC"+j;
chipMC.addChild(editMC);
}

//▼▼▼▼▼▼▼ドラッグ可能にする
function chipMCmove(event:MouseEvent):void {
event.target.startDrag();
}

function chipMCStop(event:MouseEvent):void {
event.target.stopDrag();
}

このQ&Aに関連する最新のQ&A

A 回答 (3件)

#1です。



> そしてインスタンスを変数に格納して制御することですが
> editMC.name="editMC"+j;
> でeditMC+連番という変数に入れたら
> ドラッグの際は、event.currentTargetでなく
> DisplayObjectContainer.getChildByName()を
> 使えということでしょうか

違いますよ。

> editMC.name="editMC"+j;
を使うな

ということです。
nameプロパティに何かを代入してもしなくても
今現在の状況では何も変わらないと思います。

// 削除↓
// dotMC.name="dotMC"+j;

// 削除↓
// editMC.name="editMC"+j;

という意味です。
これらがあっても getChildByName() を使っていないのですからそもそも無意味でしょう。
また getChildByName() を使うような事態にも普通はなりませんと言う意味です。



name プロパティ を使わずにするとは
例えばこんな感じです。

-----------------------------
for (var j=0; j<10; j++) {
this["dotMC" + j] = new chip();
addChild(this["dotMC" + j]);
this["dotMC" + j].addEventListener(MouseEvent.MOUSE_DOWN, chipMCmove);
this["dotMC" + j].addEventListener(MouseEvent.MOUSE_UP, chipMCStop);

this["editMC" + j] = new edit();
this["dotMC" + j].addChild(this["editMC" + j]);
}

//▼▼▼▼▼▼▼ドラッグ可能にする
function chipMCmove(event:MouseEvent):void {
event.currentTarget.startDrag();
}

function chipMCStop(event:MouseEvent):void {
event.currentTarget.stopDrag();
}

//試し↓
this.dotMC3.x = 50;
this.dotMC3.y = 30;
this.editMC3.x = 10;
this.editMC3.y = 10;
-----------------------------
 

この回答への補足

よく分かりました。目から鱗です。
dotMC.name="dotMC"+j;で作ってもfor文の外で
dotMC3などの名前で代入や操作できるわけでもないのですね。
確かめたら確かにエラーがでました。

for文内では、this["dotMC" + j]で作成し
外からはthis.dotMC3.x = 50;で操作するということですね。

最後にひとつ教えて欲しいですが、操作する際にこのthis.を取って
dotMC3.x = 50;とするとエラーが出ます。
こういう複製方法だとfor文の外では常にthis.が必要なのでしょうが
この場合のthis.とはどういう意味でしょうか?

例えばthis["dotMC" + j]の中に作ったthis["editMC" + j]を操作するにも
普通は、親のインスタンス名.editMC3.x = -20;となると思われますが
this.editMC3.x = -20;だけで操作できるし。
階層が深くににあってもthis.だけで操作できるということか?

補足日時:2010/05/22 07:14
    • good
    • 0

#1&#2 です。



#2の補足で書かれていらっしゃる内容全般に関しては
「配列アクセス演算子」 と Google などで検索してみてください。
「配列アクセス演算子」 は ActionScript 1.0 ~3.0 まで共通です。

http://www.google.co.jp/search?hl=ja&source=hp&q …


> この場合のthis.とはどういう意味でしょうか?

ActionScript 3.0 の場合で フレームにスクリプトを書く場合は
ごく単純で 「this」=「そのスクリプトを書いたタイムライン」 です。
メインのタイムラインでしたら 「root [ MovieClip(root) ]」 です。
    • good
    • 0
この回答へのお礼

そのスクリプトを書いたタイムラインということは
まだ難しいですが色々資料を見て
自分なりに理解していけると思います。
お手数掛けましたと同時に勉強になりました。
ありがとうございました。

お礼日時:2010/05/25 19:30

まず 「おや?」 と思う箇所ですが,



> chipMC.addChild(editMC);

と書かれていらっしゃる行の
「chipMC」 が何のことやらわかりません。

これは

dotMC.addChild(editMC);

の書き間違いでしょうか?



=====================

もし chipMC が dotMC の書き間違いであるなら,
2つの function 内の event.target の部分を
event.currentTarget に書き替えれば良いと思います↓。

---------------------------------
//▼▼▼▼▼▼▼ドラッグ可能にする
function chipMCmove(event:MouseEvent):void {
event.currentTarget.startDrag();
}

function chipMCStop(event:MouseEvent):void {
event.currentTarget.stopDrag();
}
---------------------------------

これでご質問の点はクリアされると思います。



=====================

しかし... ですね。

その前が何とも「なっとらん!」状態だと思います。
ActionScript 3.0 では インスタンス名(nameプロパティ) など,
よっぽどそれをつかわなければならない事態に遭遇したときにしか使うものではありませんよ。
※私はそんな事態に遭遇したことはない。

次のページを参考にしてみてください。

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

↑すべてが重要ですが
中でも次の3箇所を引用させていただきます。

> インスタンスを参照する必要があるときには、
> つぎのフレームアクションのように
> DisplayObjectContainer.getChildByName()メソッドにより
> 文字列から参照を取得します。

> インスタンスを変数に格納して制御する方がよさそうです。
> インスタンス名は、他のインスタンスと区別して特定するための
> プロパティだと思われます。

> 変数によりインスタンスを参照するというのが、
> ActionScript 3.0の基本だといえます。

この回答への補足

早速のお答えありがとうございました。
chipMC が dotMC の書き間違いでしたがevent.currentTargetで
思い通りになりました。ありがとうございます。

そしてインスタンスを変数に格納して制御することですが
editMC.name="editMC"+j;
でeditMC+連番という変数に入れたら
ドラッグの際は、event.currentTargetでなく
DisplayObjectContainer.getChildByName()を
使えということでしょうか?
宜しくお願いします。

補足日時:2010/05/21 21:45
    • good
    • 0

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


人気Q&Aランキング