AS3.0でのダイナミックテキストのクリックと移動方法について

このQ&Aのポイント
  • AS3.0でのダイナミックテキストをクリックするとテキストエリアに表示される方法について、またダイナミックテキストをムービークリップに変換する方法について説明します。
  • ダイナミックテキストをクリックしてテキストエリアに表示させるには、クリックイベントを利用してテキストエリアのtextプロパティにダイナミックテキストの内容を代入します。
  • ダイナミックテキストをムービークリップに変換するには、テキストフィールドをムービークリップに変換する方法を使います。変換した後は、ムービークリップのプロパティやメソッドを利用してテキストの表示や移動を行うことができます。
回答を見る
  • ベストアンサー

ムービークリップ変換について質問です。

AS3.0でCS5です。 やや略しますがこのような感じでASでダイナミックテキストを表示させています。 package { public class test extends MovieClip { public function test() { var textInput:TextArea = new TextArea(); var textOutput01:TextField = new TextField(); var textOutput02:TextField = new TextField(); var textOutput03:TextField = new TextField(); textOutput01.text = 'あああ'; textOutput02.text = 'いいい'; textOutput03.text = 'ううう'; addChild(textInput); addChild(textOutput01); addChild(textOutput02); addChild(textOutput03); } } } 実現したいことは、 1:ダイナミックテキストをクリックすると文字がテキストエリアに表示 2:ダイナミックテキストの移動(ドラッグ&ドロップ) ステージに配置する場合であれば、 1:ステージにダイナミックテキストを配置 2:ダイナミックテキストをムービークリップに変換 これでいいと思うのですが、ASだけでこのようなことを実現するには どうすればいいのでしょうか? ダイナミックテキストのままでは、クリックもできないのでムービークリップに 変換しなければ無理かと考えております。 ちなみに、テキストエリアに表示された文字を変更すればダイナミックテキストにも 反映されるものにしたいのでダイナミックテキストは外せません^^;

  • dcx147
  • お礼率33% (214/636)
  • Flash
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1です。 > ■症状 > テキストエリアをステージに配置せずASだけで作成し > プレビュー(Ctrl+Enter)すると > 必ずエラーになります。 > > ■解決策 > ASはそのままで、ステージにテキストエリアを配置しこれを削除してからプレビューすると > 問題なく表示されるのですが、これはなぜなのでしょうか? 一体全体何を書かれているのでしょうか? テキストエリアをステージに配置するようにしなけれなならない状況にしているのは 私ではなく質問者さん自身ですよ。 ご質問のスクリプトで > var textInput:TextArea = new TextArea(); と書かれていますよね? こう書かれている以上, TextArea をライブラリに登録しておく必要があるのでしょう? 質問する際にそういう状況だったからこそ,そのスクリプトが書けたのでしょう?? 本来,そのようにしておくことに関しては 質問者の方が 「テキストエリアをライブラリに登録してある状態でスクリプトを実行しています」 などと書くべきことです。 質問者が書くべきその事項を書かれていないので 私が後にこのページを見た方が混乱しないよに 質問者に代弁して #1 で, 「本体FLAドキュメントのライブラリには TextAreaコンポーネントがすでに登録されているものとします。」 と書いているのです。 (なお,ステージ上に配置しただけでもライブラリに自動登録されるので使えます。) そもそも TextArea というのは Adobe の人がコンポーネントとして作ったムービークリップです。 わかりますでしょうか? 一般的な テキストフィールド など 元の Flash に内包されているものとは違って TextAreaコンポーネントは ムービークリップの中にテキストフィールド などを入れて Adobe の人が ユーザ にとって使いやすいように ActionScript もろとも その構造を "Flashで" 作ったムービークリップです。 少なくともそういう構造をしたムービークリップを ライブラリに登録しておかなければ そのムービークリップを new で呼び出して使えないでしょう? そういうことですよ。 とにかく。 #1で 「本体FLAドキュメントのライブラリには TextAreaコンポーネントがすでに登録されているものとします。」 と書かせる状況を作ったのは私ではありません。 なぜ質問者が勝手に作った状況を 回答者である私が説明にないとならないのか,,, 全くもって疑問ですし,本末が転倒しています。。。     ============================ > this["mc"+i].buttonMode = true; > > できれば、指のマークにしたいのですが > 良い解決策はありますでしょうか? そうすれば テキストフィールド内にマウスでアクセスできなくなりますが良いのですよね? これも, くれぐれも誤解のないように書いて置きますが そのような状況(テキストフィールド にアクセスできなくなる状況)にしようとしているのは 質問者さんですよ(つまり回答者である私ではありませんよ。) 親であるムービークリップの mouseChildren を false にすれば良いです。 具体的には for (var i:int = 1; i<=3; i++) { //ムービークリップ「mc1~3」を作成 this["mc" + i] = new MovieClip(); //「mc○」のプロパティを適当に決める this["mc"+i].x=10; this["mc"+i].y=30+(i*30); this["mc"+i].buttonMode=true; //メインタイムラインに「mc○」を配置 addChild(this["mc"+i]); の部分を for (var i:int = 1; i<=3; i++) { //ムービークリップ「mc1~3」を作成 this["mc" + i] = new MovieClip(); //「mc○」のプロパティを適当に決める this["mc"+i].x=10; this["mc"+i].y=30+(i*30); this["mc"+i].buttonMode=true; //★↓付け加え this["mc"+i].mouseChildren = false; //メインタイムラインに「mc○」を配置 addChild(this["mc"+i]); のようにすれば良いです。

dcx147
質問者

お礼

長文のご説明ありがとうございます。 ライブラリに登録してあるからこそのASなのですね^^; ASで書かれているものは、ステージ上に見えるものがないケースが 多かったので、ASだけでどうにかなるものかと勘違いしておりました・・・ カーソルの件も思う通りになりました!本当にありがとうございます。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

> ダイナミックテキストのままでは、 > クリックもできないのでムービークリップに > 変換しなければ無理かと考えております。 と書かれていらっしゃいますが 「ダイナミックテキストをムービークリップに変換する。」 というマニュアル操作の手順を そのままスクリプト化しようとしていらっしゃるからできないのではないかと思います。 とにかくまずは『先にオブジェクトありき』です。 先にムービークリップ(またはスプライト)インスタンスというオブジェクトを作って そのインスタンスの中にダイナミックテキストを作成すれば良いでしょう。 本体FLAドキュメントのライブラリには TextAreaコンポーネントがすでに登録されているものとします。 その場合の ドキュメントクラスファイル「test.as」のスクリプト例です。 //-------------------------------------------------- package { //使用クラスのインポート import fl.controls.TextArea; import flash.display.MovieClip; import flash.text.TextField; import flash.events.MouseEvent; //「test」クラス public class test extends MovieClip { //使用変数の宣言 var textInput:TextArea; var mc1:MovieClip; var mc2:MovieClip; var mc3:MovieClip; var textOutput01:TextField; var textOutput02:TextField; var textOutput03:TextField; //ドラッグ中のMCを登録する変数 var targetMC:MovieClip; //コンストラクタ public function test() { //テキストエリア「textInput」を作成 textInput = new TextArea(); //「textInput」のプロパティを適当に決める textInput.x=10; textInput.y=20; textInput.width=100; textInput.height=25; //メインタイムラインに「textInput」を配置 addChild(textInput); for (var i:int = 1; i<=3; i++) { //ムービークリップ「mc1~3」を作成 this["mc" + i] = new MovieClip(); //「mc○」のプロパティを適当に決める this["mc"+i].x=10; this["mc"+i].y=30+(i*30); this["mc"+i].buttonMode=true; //メインタイムラインに「mc○」を配置 addChild(this["mc"+i]); // //ダイナミックテキスト「textOutput01~03」を作成 this["textOutput0"+i] = new TextField(); //「textOutput0○」のプロパティを適当に決める this["textOutput0"+i].border=true; this["textOutput0"+i].width=100; this["textOutput0"+i].height=25; //「mc○」内に「textOutput0○」を配置 this["mc"+i].addChild(this["textOutput0"+i]); //; //「textOutput0○」をクリックしたときに関数「showText」を実行; this["textOutput0"+i].addEventListener(MouseEvent.CLICK,showText); //; //「mc○」をプレスしたときに関数「dragMC」を実行; this["mc"+i].addEventListener(MouseEvent.MOUSE_DOWN,dragMC); } //ダイナミックテキスト「textOutput01~03」に文字を表示; textOutput01.text="あああ"; textOutput02.text="いいい"; textOutput03.text="ううう"; } //関数「showText」の定義 private function showText(evt:MouseEvent):void { //テキストエリア「textInput」に //クリックしたダイナミックテキストの文字を表示 textInput.text=evt.currentTarget.text; } //関数「dragMC」の定義 private function dragMC(evt:MouseEvent):void { //プレスしたMCを変数に登録 targetMC=MovieClip(evt.currentTarget); //プレスしたMCをドラッグ開始 targetMC.startDrag(); //ステージ上でマウスアップ時に関数「dropMC」を実行; stage.addEventListener(MouseEvent.MOUSE_UP,dropMC); } //関数「dropMC」の定義 private function dropMC(evt:MouseEvent):void { //ドラッグ中のMCのドラッグを終了 targetMC.stopDrag(); //マウスアップ時に関数「dropMC」を実行するのを解除; stage.removeEventListener(MouseEvent.MOUSE_UP,dropMC); } } } //-------------------------------------------------- 『まずは「mc○」を作成してメインタイムラインに配置して 次に「textOutput0○」を作成して「mc○」内に配置して 配置した「textOutput0○」や「mc○」に イベントリスナー(マウス動作時のイベント動作関数)を登録して行く』 という内容です。

dcx147
質問者

お礼

お返事ありがとうございます。 まさにその通りで、マニュアルの(ステージに配置して作成する)手順で考えており ずっと悩んでおりました。 わかりやすい説明でおかげさまで解決です! もうひとつ不明な点があるのですが、宜しければ教えてください。 ■症状 テキストエリアをステージに配置せずASだけで作成しプレビュー(Ctrl+Enter)すると 必ずエラーになります。 ■解決策 ASはそのままで、ステージにテキストエリアを配置しこれを削除してからプレビューすると 問題なく表示されるのですが、これはなぜなのでしょうか?

dcx147
質問者

補足

もう1点すみません^^; カーソルの設定がうまく効いていないようでした。 this["mc"+i].buttonMode = true; できれば、指のマークにしたいのですが良い解決策はありますでしょうか?

関連するQ&A

  • テキストフィールドかの色情報からムービークリップの色が変わるようにした

    テキストフィールドかの色情報からムービークリップの色が変わるようにしたいです。ActionScript3.0です。 ●colBox2というテキストフィールドがあり、bmpData(BitmapData型)という場所で取得したRGB色情報が表示されるようになっています。(例えば赤ならFF0000というように)。 var colBox2:TextField = new TextField(); colBox.x = 450; addChild(colBox2); ●bmpData上でマウスを上げたらその場所の色情報がcolBox2上に表示されて、colBox2上のテキストを読み取って、boardというムービークリップの色が変わるようにしたいのですが、エラーこそ出ないですが、boardの色は変わらないです。どうずれば変更できるのでしょうか?宜しくお願いします。 var colorTrans:ColorTransform = new ColorTransform(); var trans:Transform = new Transform(board); trans.colorTransform = colorTrans; copy.addEventListener(MouseEvent.MOUSE_UP,mouseUp) function mouseUp(evt:MouseEvent){ var pixelValue:uint = bmpData.getPixel(evt.stageX,evt.stageY); colBox2.text = pixelValue.toString(16);//取得したカラーを代入 colorTrans.color = "0x" + colBox2.text as uint; trans.colorTransform = colorTrans; }

    • ベストアンサー
    • Flash
  • (AS3)ムービークリップからメインタイムラインにある関数を呼び出したい

    質問はタイトルの通りです。 実は以前同じ質問(http://oshiete1.goo.ne.jp/qa3811855.html)をしましたところ、次のような回答をいただきました。 「 [メインタイムライン] function aaa(){ trace("ok") } [testMC] this.addEventListener(MouseEvent.CLICK , onClick) var rootObj:MovieClip = this.root as MovieClip; function onClic(event:MouseEvent):void{ rootObj.aaa(); } 」 たしかに、この方法はムービークリップ(testMC)をステージに手動で配置したときには有効でしたが、stage.addChild()を使って配置したときには関数を呼び出すことができませんでした。 ちなみに、呼び出そうとすると次のようなエラーがでます。 「 ReferenceError: Error #1069: flash.display.Stage にプロパティ aaa が見つからず、デフォルト値もありません。 」 stage.addChild()で配置したムービークリップから、メインタイムラインの関数を呼び出すにはどうすればよいのでしょうか? 困っています。どうか力を貸してください。

    • ベストアンサー
    • Flash
  • ActionScript3.0のfor文の処理について質問させてくださ

    ActionScript3.0のfor文の処理について質問させてください。 画面に9つのTextFieldを作って、テキストを表示させています。 そして、ステージをクリックしたら、そのテキストが消えるという流れにしたいのです。 どうすればできるのでしょうか? あれよこれよと色々試して書いたスクリプトが var b:int = 0; for(b; b<10; ++b) { var introA:TextField = new TextField(); var introB:TextField = new TextField(); introA.name = "introA"+b; introB.name = "introB"+b; addChild(introA); addChild(introB); introA.htmlText = "aaa"+b; introB.text = "bbb"+b; introA.x= 30; introB.x= 130; introA.y= 30*b; introB.y= 30*b; } stage.addEventListener(MouseEvent.CLICK, cont); function cont(ev:MouseEvent):void{ introA.htmlText = ""; introB.text = ""; } -------- これだと、最後のひとつしか消えてくれません。 どうすれば全部のテキストが消えるのか、どなたかご指導よろしくお願いします。

    • ベストアンサー
    • Flash
  • AS3リンケージ設定したムービークリップの中で、フレーム移動がしたいです。

    初心者です。 AS3で、 リンケージ設定したムービークリップを addChildで呼び出し、 呼び出したムービークリップの中の、 指定したフレームに移動するにはどうしたら宜しいでしょうか。 ステージに配置した場合、インスタンス名を付けて インスタンス名.gotoAndPlay("フレームラベル"); で移動しますが、 リンケージ設定したムービークリップの場合はインスタンス名の代わりに リンケージ名で呼び出せないのですか。

    • ベストアンサー
    • Flash
  • 【AS3】ムービークリップからステージへアクセスできません

    はじめまして。FlashでAction Script3.0を勉強し始めたばかりの初心者です。 実は、AS3でどうしても不明な部分があり この度問い合わせさせていただいております。 AS2では_rootでステージにあるムービークリップにアクセスできたかと思うのですがAS3では代わりのものはあるのでしょうか。 現在ステージ上にいくつかムービークリップを置いて、 それぞれのムービークリップ最後のタイムラインに、 「root.gotoandPlay("scene1")」というように記述して、 ステージにもどり、そのフレーム名から始めたいのですが(この場合、scene1というステージ上のフレームから再生させたい) 「未定義である可能性のgotoAndPlayメソッドを静的型flash.display:DisplayObjectContainerの参照を使用して呼び出しました」というエラーになってしまいます。 外部クラスなどは使用しておらず、 ライブラリに格納してあるムービークリップをステージに配置し、 初めのムービークリップを再生したら、次のムービークリップを再生、、というふうに順々に表示させていきたいのですが・・ アドバイスをいただけると大変助かります!! よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • addChildで描画した絵(シンボル:ムービークリップ)を消したい。

    addChildで描画した絵(シンボル:ムービークリップ)を消したい。 お世話になります。 adobe Flash pro ActionScript 3.0 で作成しております。 左クリックを押したら、 var mc:pen=new pen; addChild(mc); mc.x=mouseX; mc.y=mouseY; でpenというムービークリップを表示させるようにしております。 そこで、作成したmcを消す方法はどのようにしたらよいでしょうか? (1)直前に書いたmcを削除する方法 (2)今までに書いた全てのmcを削除する で教えて頂ければと思いますのでよろしくお願いします。

    • ベストアンサー
    • Flash
  • AS3:ステージリサイズするとムービークリップをすべて削除して何秒か後

    AS3:ステージリサイズするとムービークリップをすべて削除して何秒か後にまた、ムービークリップを設置。 ステージ横一杯にムービークリップ(以下MC)を縦2列で並べてステージをリサイズするたび、 MCをすべて削除してまた横一杯にMCを2列で並べるというものを作成中なのですが、リサイズの仕方によってはMCが何個か残ってしまいMCを再配置できないという現象がおきます。 以下のようにコーディングしているのですがどこが問題なのでしょう? 環境:AS3、Flash CS4、MC:W:80xH:100 Set(); stage.align=StageAlign.TOP_LEFT; stage.scaleMode=StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE,AddMC); function AddMC(eventObject:Event):void { var delate:uint=mc.numChildren; for (var k:uint=0; k<delate; k++) { mc.removeChildAt(k); } if (delate<=0) { var SetTimer:Timer=new Timer(500,1); SetTimer.addEventListener(TimerEvent.TIMER,ReAdd); SetTimer.start(); function ReAdd(eventObject:TimerEvent):void { Set(); } } } // function Set():void { var yoko:uint=Math.ceil(stage.stageWidth/80); for (var i:uint=0; i<yoko; i++) { for (var j:uint=0; j<2; j++) { var BX:MovieClip=new box(); mc.addChild(BX); BX.x=40+80*i; BX.y=50+100*j; } } } よろしくお願いします。

    • ベストアンサー
    • Flash
  • ムービークリップとインスタンス

    「ライブラリ内にあるのがムービークリップで、それをステージに配置したものがインスタンスである。」このように理解しているのですが、これは間違いでしょうか? 1、「MCを一つ作成し、それをステージ上に3カ所に配置し、各"MC"に01、02,03とインスタンス名を付けた。」 2、「MCを一つ作成し、それをステージ上に3カ所に配置し、各"インスタンス"に01、02,03とインスタンス名を付けた。」 上記の場合どちらが正しいのでしょうか? ムービークリップとインスタンスについてご教授ください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • ムービークリップ内のムービークリップ制御について

    誠に不勉強の段お許しください。 Flashでサイトを製作しているのですが、どうしても分からず投稿させていただきました。 仮に -rootにボタンとAムービークリップ配置しました。 また、Aムービークリップ内の10フレー目にBムービークリップを配置し、Bムービークリップ内にボタンを配置しています。 _rootのボタンからAムービークリップを制御して10フレーム目のBムービークリップを表示はできるのですが、-root上でAムービークリップのBムービークリップ内のボタンでBムービークリップを制御するのにはどうすればよろしいのでしょうか。 なにとぞご教授いただけましたら幸に存じます。

  • クリックするたびにテキストを1個ずつ表示させる

    マウスクリックをしてテキストを1個ずつ表示させたいです。 stage.addEventListener(MouseEvent.CLICK, mc); function mc(event:MouseEvent):void{ var text1 : TextField = new TextField(); text1.text = "Hello World"; this.addChild(text1); } を実行すると、クリックするたびテキストが1つずつ増えていきます。 これを前回のを消去して新たに表示というような形で1つずつ表示させることはできないでしょうか?

    • ベストアンサー
    • Flash