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

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だけでこのようなことを実現するには
どうすればいいのでしょうか?

ダイナミックテキストのままでは、クリックもできないのでムービークリップに
変換しなければ無理かと考えております。

ちなみに、テキストエリアに表示された文字を変更すればダイナミックテキストにも
反映されるものにしたいのでダイナミックテキストは外せません^^;

A 回答 (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]);

のようにすれば良いです。
    • good
    • 0
この回答へのお礼

長文のご説明ありがとうございます。
ライブラリに登録してあるからこそのASなのですね^^;

ASで書かれているものは、ステージ上に見えるものがないケースが
多かったので、ASだけでどうにかなるものかと勘違いしておりました・・・

カーソルの件も思う通りになりました!本当にありがとうございます。

お礼日時:2012/01/30 04:53

> ダイナミックテキストのままでは、


> クリックもできないのでムービークリップに
> 変換しなければ無理かと考えております。

と書かれていらっしゃいますが
「ダイナミックテキストをムービークリップに変換する。」
というマニュアル操作の手順を
そのままスクリプト化しようとしていらっしゃるからできないのではないかと思います。

とにかくまずは『先にオブジェクトありき』です。

先にムービークリップ(またはスプライト)インスタンスというオブジェクトを作って
そのインスタンスの中にダイナミックテキストを作成すれば良いでしょう。



本体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○」に
イベントリスナー(マウス動作時のイベント動作関数)を登録して行く』
という内容です。

この回答への補足

もう1点すみません^^;
カーソルの設定がうまく効いていないようでした。

this["mc"+i].buttonMode = true;

できれば、指のマークにしたいのですが良い解決策はありますでしょうか?

補足日時:2012/01/29 17:45
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
まさにその通りで、マニュアルの(ステージに配置して作成する)手順で考えており
ずっと悩んでおりました。

わかりやすい説明でおかげさまで解決です!

もうひとつ不明な点があるのですが、宜しければ教えてください。

■症状
テキストエリアをステージに配置せずASだけで作成しプレビュー(Ctrl+Enter)すると
必ずエラーになります。

■解決策
ASはそのままで、ステージにテキストエリアを配置しこれを削除してからプレビューすると
問題なく表示されるのですが、これはなぜなのでしょうか?

お礼日時:2012/01/29 14:56

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