重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

Flash初心者です。
ソフトは Flash MX 2004 をつかっています。

質問なんですが、
ボタンを作るとき、マウスがボタンの上にあるとき
一言コメントが出るようにしたいのですが、
そのコメントが何種類かあって、それをランダムで表示させたいです。

外部テキストで出来ると聞いたのですがやり方がまったくわかりません。

onClipEvent(load){
this.loadVariables("text.txt");
}

で文字は読み込めたのですが、全部読み込んでしまってどうやってランダムにしたらいいかがわかりません。
どうかお答えお願いします!

A 回答 (1件)

> 外部テキストで出来ると聞いたのですが


> やり方がまったくわかりません。

どなたから聞いたのでしょうか?
(と言っても,本気で質問しているわけではありませんよ。ボヤいてみただけです。)

好い加減なことを言われる方だと思います。
正確には,「外部テキスト "でも" できる。」です。
Flash 内部のデータ処理ができない方が,
外部からデータを読み込んでさらにそのデータをFlashで内部処理すると言うのは,
かなり踏むべき段階を超えすぎていると思います。


というわけで,
内部テキストデータでまず考えます。
その後それを外部テキストデータに当てはめて動作させる方法を回答します。


また,
ご質問に唐突に,

> onClipEvent(load){
> this.loadVariables("text.txt");
> }

という意味不明な onClipEvent(load) が出てきていますが,
なぜムービークリップに loadVariables を書かれているのか,
またどういう構造になっているのかがさっぱりわからないため,
この onClipEvent(load) は除いてシンプルな例を書きます。

簡単なできるところから,
1つ1つ確実に作成してください。
いきなり段階を超えても何も作成できませんし,
コピペでできたとしても理解できないと思います。



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

◎ 内部データ処理だけでランダムなメッセージを表示


Flash で新規ドキュメントを作成して,
ステージ上に「mytext」というインスタンス名(変数名ではありませんよ)の
ダイナミックテキストフィールドを用意します。
文字の色は背景色とは違う黒などの色を選んでおいてください。

そして,
タイムラインに新規レイヤーを追加して,
その新規レイヤーのフレーム1の空白キーフレームに次のスクリプトをコピペしてください。
データも適当に考えただけの無意味なものですから,
いちいち書くのではなくてコピペで良いです。

-----------------------------------
comment0 = "おや,お久しぶりぃ~!";
comment1 = "あら,今日は暇なの?";
comment2 = "最近どう?元気にしてる?";
comment3 = "ここ見る時間があったらメールしてよ!";
comment4 = "私のハートをクリックできるかしら?";
-----------------------------------

これは,
ActionScript というよりも,
comment0~4 の5つの変数に,
各メッセージデータを値として用意しているだけです。

変数名は半角アルファベットから始まっていて,
ActionScript の既存のことばとかぶらなければ何でも良いのですが,
ランダムに表示するという部分で使い勝手が良いように,
全て comment という共通の文字列と,連番の数をひっつけた変数名にしています。


そして,
「mytext」というインスタンス名のテキストフィールドを用意したレイヤーに,
適当にボタンになるような塗りの長方形を書いて,
その塗りを ボタンシンボル に変換してください。

そのボタンに次のように書いてください(コピペ可)。

-----------------------------------
// ボタンにロールオーバーしたとき
on (rollOver) {
// 変数 ransu に 0~4(5個) の整数の乱数を取得
ransu = Math.floor(Math.random()*5);
// mytext に comment? の値を表示
_root.mytext.text = _root["comment"+ransu];
}
// ボタンからロールアウトなどをしたとき
on (press, rollOut) {
// mytext の表示をなしにする
_root.mytext.text = "";
}
-----------------------------------


そして,
任意の場所にドキュメントを保存して,
パブリッシュもしくは,「制御」→「ムービープレビュー」してみてください。

ボタンのロールオーバーで,
「mytext」というインスタンス名のテキストフィールドに,
私の考えたろくでもないメッセージがランダムに表示されると思います。

これですよ。
これがスタートです。
上のボタンのスクリプトにある

 ransu = Math.floor(Math.random()*5);

についてですが,
内側から説明します。

 Math.random()

これで 0以上 1未満のランダムな小数が取得できます。

 Math.random()*5

これでその範囲が 5 倍に拡大されます。
つまり,
0以上 5未満の乱数が得られます。

 Math.floor()

は,少数以下切り捨てのメソッドです。
したがって,

 Math.floor(Math.random()*5);

で,0~4までの5つの何れかの整数が得られます。

そして次の行,

 _root.mytext.text = _root["comment"+ransu];

に行きます。
_root["comment"+ransu]; の [] は配列アクセス演算子と呼ばれる物で,
配列でなくても何かのオブジェクトに動的にアクセスする場合は非常に便利な演算子です。
[ ] で何かをくくると,[ ]内を1つの階層として扱ってくれます。

もし乱数に 2 が取得された場合,
上の式は次のようになります。

 _root.mytext.text = _root["comment"+2];

つまり,

 _root.mytext.text = _root["comment2"];

つまり,

 _root.mytext.text = _root["comment2"];

つまり,

 _root.mytext.text = _root.comment2;

というわけで,
取得される乱数の値が 2 であれば,

 comment2 = "最近どう?元気にしてる?";

の,「最近どう?元気にしてる?」が,mytext に表示されるのです。


ここまでを良く理解してください。
そして,
外部ファイルを読み込む必要がないと判断されたなら,
外部ファイルを読み込む方向ではなく,
内部データの次の発展にとりかかってください。



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

◎ 外部データをロードしてランダムなメッセージを表示


これは上の場合に,_root のフレームに用意した
comment0 ~ 4 の変数と値を,
外部のテキストファイルに持っていけば良いということになります。


ですから,
まず外部テキストデータの形が重要になります。

用意する外部テキストは,
ご質問にある通り,
パブリッシュされる SWF と同じフォルダに置いた,
「text.txt」 というテキストファイルに用意することにします。

その「text.txt」 というテキストファイルの中身ですが,
これは,上のことと同じように実現したい場合,
次のようなデータになります(コピペ可能)。


--「text.txt」内のデータ------------------------
comment0=おや,お久しぶりぃ~!&
&comment1=あら,今日は暇なの?&
&comment2=最近どう?元気にしてる?&
&comment3=ここ見る時間があったらメールしてよ!&
&comment4=私のハートをクリックできるかしら?
------------------------------------------


形のパターンはわかりますでしょうか?

基本的に1行は,

 変数=値

となっていて,それが複数行あるという形式です。
そして, 変数=値 の改行前と改行後に & がある形式です。

  変数=値&
 &変数=値&
 &変数=値&
 &変数=値&
  …  …

本当は,

 変数=値&変数=値&変数=値&…

という形が必要なのです。

この形は,
例えば Google で Flash と検索した場合,
http://www.google.co.jp/search?hl=ja&q=Flash&btn …
これの search? の後の引数↓の形と同じです。

hl=ja&q=Flash&btnG=Google+%E6%A4%9C%E7%B4%A2

しかし,これは人間にとっては見にくいので,
変数=値 を1セットとして,改行を入れる場合の形式が,
上のテキストのデータ形式になります。



そして,
Flash の方にはフレーム1に次のように書きます(コピペ可能)。

----------------------------------------
// テキストを 日本語コード Shift-Jis で読み込む
System.useCodepage = true;
// 外部テキストを読み込む
this.loadVariables("text.txt");
----------------------------------------

テキストフィールドの用意やインスタンス名,
ボタンの用意やボタンのスクリプトは,
上の 「◎ 内部データ処理だけでランダムなメッセージを表示」 と全く同じ物を使用してくださってかまいません。
フレーム1に用意していた,
comment0~4 とその値の部分を全て削除して,
上のように書き替えてくださると良いだけです。



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

本当は最近は,
loadVariables メソッドはあまり使われません。
LoadVars クラスのメソッドを使います。

loadVariables が使われなくなった理由は,
loadVariables 読み込んだら読み込みっぱなしで,
外部テキストを,
「読み込んだのか」,「読み込んでいないのか」,
「読み込みの途中なのか」,「読み込みに失敗したのか」…
こういうことががわからないからです。

今回のサンプルのように,
マウスがボタンにロールオーバーするような場合は,
読み込んで即処理ではなく,
読み込んだあと,しばらくして処理する場合は,
loadVariables でもかまわないと思います。

しかし,
Flash が表示されてすぐに,
外部テキストを読み込んで,
そして即,ランダムなメッセージを自動で表示させるような場合は,
LoadVars クラスのメソッドを使うようにしてください↓。

LoadVarsオブジェクトを使った外部テキストファイルの読込み
http://www.fumiononaka.com/TechNotes/Flash/FN030 …



しかしとにかく何より,
外部のファイルロードより,内部の処理ができることが大切ですよ。
内部処理ができてからこそ,
外部データの形式などが決まるのですから。
    • good
    • 0
この回答へのお礼

丁寧でわかりやすい回答ありがとうございます!!
内部処理でできましたw
本当にありがとうございました!!!

お礼日時:2007/02/08 01:19

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