プロが教えるわが家の防犯対策術!

actionscript3.0についての質問です。

イラストレーターのテキストツールのように
任意の文字オブジェクトを複数生成し、生成された任意の文字オブジェクト
をドラッグで移動する処理をactionScriptで実行したいと考えています。

現在actionscript3.0で行いたいと考えている一連の流れは以下の通りです。

1.ステージに配置したテキストフィールに任意の文字列を入力

2.入力された文字列を参照してムービークリップ内のダイナミックテキストに出力。

3.ステージにボタンを配置し、それを押すことでステージに1.2の手順によって作成されたムービークリップが生成。

4.生成されたムービークリップをドラッグすると動かすことができる。

1から3までの内容を下記のようなスクリプトで行いました。


//ダイナミックテキストを内包するためのムービークリップを定義
//埋め込みアセットクラスmcからインスタンスを生成
var word_mc:MovieClip = new mc( );

//ボタンクリックイベントを登録
create_btn.addEventListener( MouseEvent.Click, creClick );

//ボタンクリック時の処理
function creClick( evt:MouseEvent ):void {

//テキストフィールドinputWordに入力されたテキストを変数inputに格納
var input:String = inputWord.text;

//word_mc内に配置したダイナミックテキストoutputWordに入力テキスト内容を出力
word_mc.outputword.text = input;

//word_mcを画面に表示
addChild( word_mc );

}

//word_mcをドラッグで移動させるためのスクリプト
word_mc.addEventListener( MouseEvent.MOUSE_OVER, wordMO );

function wordMO( evt:MouseEvent ):void {
word_mc.addEventListener( MouseEvent.MOUSE_DOWN, wordMD );
word_mc.addEventListener( MouseEvent.MOUSE_UP, wordMU );
}

function wordMD( evt:MouseEvent ):void {
word_mc.startDrag( );
}

function wordMU( evt:MouseEvent ):void {
word_mc.stopDrag( );
}

ひとつのオブジェクトを生成するだけならこれで問題ないのですが、
このスクリプトでは、、"車"、"自転車"、"飛行機"という文字列をそれぞれ内包した変数名もしくはクラス名の違うオブジェクトを生成することが
できません。

埋め込みアセットクラスをあらかじめ複数作っておいて、クラス名を
連番で名づけ、クラス名から動的にオブジェクトを生成すれば
内容の異なるオブジェクトを生成することは可能ですが、
単語を追加するたびに埋め込みアセットクラスを作成しなければ
ならない上、変数名は同じなため、個々のオブジェクトをマウスドラッグすることができません。

イラストレーターのテキストツールのように
任意の文字列を生成した後、個々にマウスドラッグできようにするには
どうしたら良いのでしょうか。

どうかご指導のほど、よろしくお願い致します。

A 回答 (1件)

イベントターゲットをstartDrag()、stopDrag()


するようにすればいいと思います

function wordMD( evt:MouseEvent ):void {
word_mc.startDrag( );
}

function wordMU( evt:MouseEvent ):void {
word_mc.stopDrag( );
}



function wordMD( evt:MouseEvent ):void {
evt.target.startDrag( );
}

function wordMU( evt:MouseEvent ):void {
evt.target.stopDrag( );
}


複数インスタンスを生成できないという所は
var word_mc:MovieClip = new mc( ); を
creClick関数内でやってやればいいだけだと思います

ついでにMOUSE_OVERでやってる
リスナー登録もcreClickの時にしておけば
いいと思いますよ

別にそのリスナー登録は
MOUSE_OVERの度にやらなくても
一回やれば済むような事ですから
    • good
    • 0
この回答へのお礼

迅速かつ丁寧にご指導いただき、本当にありがとうございます。
関数内でインスタンスの生成を行えばいいんですね。
それにしても、ライブラリからオブジェクトをドラッグ
で作成したムービークリップインスタンスなどは、
下層の内容を変更すると全てのインスタンスの表示が
変更されるのに対して、newコンストラクタで生成した場合には、
同じ変数名、同じクラス名なのに生成するごとに異なる
オブジェクトを内包できることが未だ理解できません。
僕の感覚では、2つ目のインスタンスを生成した瞬間に
1つ目のインスタンスの表示も2つ目と同期してしまうように
思えてならないのですが。
もっと勉強して理解を深めなければいけませんね。

リスナー登録のタイミングも「なるほどー」という思いでした。
なんていうか、僕の中ではリスナー登録と関数呼び出しが
同じ処理のような感覚があって、登録することがすなわち
処理を行うという意識のもと、冗長なスクリプトになってしまい
がちです。
リスナー登録はあくまでも登録ということを
あらためて理解することができました。

重ねて御礼申し上げます。
ありがとうございました。

お礼日時:2010/04/12 11:42

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