D0211111 外部テキストをタイプライター文字みたいに・・・
Name Jone
Date 2002年11月11日 (月) 13時05分
Message こんにちは憲ちゃんさん。このまえは「年末ジャンボの円盤」でお世話になりありがとうございました。
さぁさんの記事のタイプライターのサンプルFLAファイルをDLして研究しましたが、どうもよくわかりません(汗)
>ボタンの値に「文章の中身の文字」そのものを入れて送信
と書いておられますがそれらしいものはなく、私が何か見落としているのでしょうか?
どうか教えてください。
それから、外部テキストに文章を書いたものを読み込んで、それをタイプライターのように表示するというようなことはできないでしょうか?
よろしくお願いします。
Response 01
2002年11月11日 (月) 22時42分> 憲ちゃん 
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段構えで処理をすると解消できるかと思います。

実際の使用例は以下の過去記事を参照してください!
■外部テキストをスクロール表示(行単位)
■外部テキスト内の変数の数が変わる場合・・・
Response 02
2002年11月13日 (水) 11時35分> Jone 
やっとできました((((^^; 
憲ちゃんさん、こんなに詳しくいつもありがとうございます!!!!!
おかげでアクションの苦手な私でも理解できました。
ほんとにほんとにありがとうございました。
これからもよろしくお願いします。

このページの先頭へ