Joneさん、こんにちは(^^;
あはは、すみませんm(_ _)m(*^-^*)下のサンプルは、イメージを確認するために即席で作りました。
ボタンからのデータではなく、ムービークリップの中に「画像情報」で、タイプライターというよりは
ワープロのイメージとして仕上げてみました(;^_^Aアセアセ・・・
※デバイスフォントと線画像を併用していますので、もしかしたらMacで見た場合、
位置がずれる可能性も考えられますが・・・どうでしょうかね?
実際に文字データとしての「文字列」を使う場合は応用範囲が大幅に広がりますが、
仕組みが少し複雑で、文字列を直接アクションスクリプトでコントロールすることになります。
タイプライターのようにもできますし、ワープロのように変換動作を挿入するようにもできますが、
仕組みを理解するには、シンプルなタイプライター方式のほうがわかりやすいので、
以下はそれで説明しています(*^-^*)
◎テキストフィールドの設置と変数の定義
まず「ダイナミックテキスト」については、ある程度ご理解いただけていることとして、
ステージに文字を表示するフィールドをドラッグして確保し、「変数」を仮に「mesDText」とします。

※サンプル例は「複数行」「ワードラップ」にチェック、「文字」フォントは「_等幅」「14」です。
◎ボタンに対応する変数の定義
「A」「B」「C」3つのボタンでそれぞれ3種類の文章を表示するものとして、
「A」ボタンに対応する変数を「mesA」、「B」ボタンのそれを「mesB」、
「C」ボタンのそれを「mesC」と仮にします。
レイヤーを追加して名前を「アクション」とし、その1フレームに・・・
mesA = "ハンドルネームは”憲ちゃん”・・・妻と2人暮らし。";
mesB = "丑年の2月7日生まれ。・・・性格を判断してください(笑)";
mesC = "趣味は、賭け事以外はオールマイティ!・・・・・云々";
例は、トップの憲ちゃんのプロフィールの一部ですが(^^; ””の中に適当に文章を書いてください。
これで、それぞれの変数に任意の文字データが格納されました(^^g/~~
◎ボタン操作による、変数「mesDText(テキストフィールド)」へのデータの代入
それぞれのボタンに次の「ボタンアクション」を記載します。(「A」ボタンの場合)
on (release) { ←ボタンがクリックされたら、
mesDText = mesA; ←変数「mesDText」に変数「mesA」の値(文字列)を代入しなさい
}
テキストフィールドは当初、空っぽだったので何も表示されていませんが・・・
「A」ボタンをクリックした瞬間、そこに「mesA」の文字列が入るため、
それがテキストフィールドに表示される仕組みです(*^-^*)
以下「B」は「mesB」、「C」は「mesC」です。
「Delete」ボタンの場合は、
on (release) { ←ボタンがクリックされたら、
mesDText = ""; ←変数「mesDText」を「””(=空っぽ)」にしなさい。
}
画面から文字列が消えてしまいます!
ここまでで、ムービープレビューで確認してください。
ボタンをクリックすると文字列が一気に表示されますよね!
■ここからが本番です(笑)
これを1文字づつ表示するということは・・・「A」の場合、
最初「mesDText」の値は「ハ」のみ、しばらく時間差をおいて、「mesDText」の値を「ハン」として、
順々に中身を一文字づつ増やしていけば良いことはわかりますね!
@そこで、ボタンアクションでいきなり「mesDText = mesA」と代入せずに・・・
仲介役として例えば「mesSub」という名前の変数を新たに設け、
一旦そこに、それぞれ「mesA」〜「mesC」の値を代入することにします。
上の<ボタンアクションを変更>して・・・
on (release) { ←「A」ボタンがクリックされたら、
mesSub = mesA; ←変数「mesSub」に変数「mesA」の文字列を代入しなさい。
}
A変数「mesSub」に該当するボタンの文字列が格納されたところで、
次に、そこから順番に任意の数だけ文字列を取り出す方法ですが、
「Stringオブジェクト」の「substr(開始位置,文字数)」というメソッドを活用します。
例えば・・・
変数A=変数B.substr(3,4);
と書いて、変数Bの値が”私は、憲ちゃんです。”であったとしたなら・・・
文字列の左端を0番目として右に1,2・・と数えて開始位置「3番目」の”憲”から「4つ」文字を
取り出して、変数Aに代入しなさいの意味になります!!
結果、変数Aの値は”憲ちゃん”となります(^^)
これを、テキストフィールド(mesDText)に適用すると・・・
mesDText = mesSub.substr(0,1);
※変数mesSubの文字列の左端(0番目)から「1文字」だけ取り出し、
テキストフィールドの変数「mesDText」に代入。
テキストフィールドに表示されるのは、「A」の例だと「ハ」の1字だけということになります。
以降、「文字数」を1つづつ増やして・・・
mesDText = mesSub.substr(0,2); ←「ハン」
mesDText = mesSub.substr(0,3); ←「ハンド」
mesDText = mesSub.substr(0,4); ←「ハンドル」
…
mesDText = mesSub.substr(0,n); ←「ハンドルネームは、憲ちゃん・・・妻と2人暮らし。」
※「n」は「A」の文字列全体の文字数です。
具体の方法はあとで説明しますが、考え方としては・・・開始位置はすべて左端(0)で、
「文字列全体の文字数」になるまで、文字を1つづつ増やしながら、表示していけばいい訳です!
Bこの「文字列全体の文字数」を数えるには・・・
「length」というプロパティがあります。Aの変数Bの例で・・
変数C=変数B.length;
と書けば、変数Bの文字数を数えて、変数Cに代入しなさいの意味になりますから、
結果、変数Cの値は”10”となります!
これを「mesSub」に適用し、文字数を格納する変数を「Max」としたとして、
Max = mesSub.length; ←変数mesSubの文字列の文字数を、変数Maxに代入。
■必要な変数が揃ったところで、「アクションレイヤー」に実際にアクションを設定します(^^g/~~
まずはフレーム数を全体に、とりあえず5フレームまで増やしてください。
今まで1フレームしかなかったので、タイムラインの動きは関係なかったのですが、
増やすことで勝手に動かれては困るので・・(笑)
@1フレームの「mesA」〜「mesC」を定義している最後に「stop();」を入れて、
まずタイムラインを停止させます。
A2フレームを「空白キーフレーム」にして、次のように変数の定義と初期設定を行います。
Max = mesSub.length; ←上記のとおり、文字列全体の文字数。
num = 0; ←文字をカウントする変数「num」を定義して初期値を「0」にする。
B3フレームを「空白キーフレーム」にして、次のアクションを記載します。
num++; ←カウント用変数「num」に1を加えて
if (num <= Max) { ←それが全体の文字数より小さいか、等しい場合は、
mesDText = mesSub.substr(0,num);←テキストフィールドに、最初から「num」番目まで表示。
} else { ←そうでない(全体文字数を超えた)なら、
stop (); ←そのまま、そこでタイムラインを停止。
}
※条件を満たして文字を表示したあと、特に命令がないのでそのまま次のフレームに移動します。
C5フレーム・・・ループ
gotoAndPlay (3); ←3フレームに戻ってやり直し。
※ループのたびに、「num」の値が1つづつ大きくなり、表示される文字も1文字づつ増えます。
※文字が順に表示されていく速度は、このループアクションを置くフレームを後ろにする程遅く、
4フレームに置くと最速になります。
■ボタンアクションのさらなる変更!!
1フレームに新たに「stop();」を設定したので、上記のままでは2フレームに移動しません(^^;
on (release) {
mesSub = mesA;
gotoAndPlay (2); ←”2フレームに移動して実行”を追加します!
}
ただし、「Delete」ボタンについては、
on (release) {
mesDText = ""; ←テキストフィールドを空っぽにして
gotoAndStop (1); ←”1フレームに戻って停止”を追加します。
}
以上で、タイプライター的、文字表示の完成です♪
typewriter1.fla
ワープロ的文字表示の方法は、結構複雑ですのでいずれ時間をみて考えてみます(^^g/~~
---------------------------------------------------------------------------
●外部テキストから変数「mesA」〜「mesC」を読み込んで表示する場合は・・・
まず、外部テキスト、仮にファイル名を「abcd.txt」として、そこに、
&mesA=ハンドルネームは”憲ちゃん”・・・妻と2人暮らし。&
&mesB=丑年の2月7日生まれ。・・・性格を判断してください(笑)&
&mesC=趣味は、賭け事以外はオールマイティ!・・・・・・・&
このようの「&(半角英数)」で区切りながら「変数=値」の書式で書き込み、
swfと同じフォルダに保存します。
そのうえで・・・
○最も簡単には、1フレームのアクションを次のように書き換えます。
loadVariablesNum ("abcd.txt", 0);←「abcd.txt」のデータを「レベル0」に読み込む
stop (); ←タイムラインを停止
※データ量が少ない場合や、オフラインでの再生では問題ありませんが、
ネット回線を通じて読み込む場合で、遅い回線やデータ量が多いなどのときは、
ずべてのデータを読み込み終わるのに一定のタイムラグが生じ、
ボタンをクリックしても即文字が表示されない可能性もあります。
それを防止するには・・・・
テキストフィールドまたは全体をムービークリップにして、クリップアクションで、
onClipEvent (load) { ←インスタンス(自分)が最初に読み込まれたとき、
loadVariables ("abcd.txt", ""); ←外部テキストデータの読み込み開始。
stop(); ←とりあえずタイムラインを止める。
}
onClipEvent (data) { ←データの読み込みが完了したとき、
gotoAndPlay(**); ←タイムラインを動かして具体の作業を行う
}
このような、2段構えで処理をすると解消できるかと思います。
実際の使用例は以下の過去記事を参照してください!
■外部テキストをスクロール表示(行単位)
■外部テキスト内の変数の数が変わる場合・・・
|