• ベストアンサー

【ノベル】テキスト表示

こちらのサイトのような メッセージが左から右、 段落などを意識した文字の流し方が いまひとつ判りません。 【http://novel2.hakoniwa.net/】 おそらく画面でテキスト部分に マウスカーソルをあてると ダイナミックテキストっぽいのですが コピー&ペーストできないように 作られていて、どうすればその機能も 設定できるのでしょうか? 参考になるサイトもしくは 解説宜しくお願いします。

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

  • ベストアンサー
noname#35109
noname#35109
回答No.3

#2です。 > 段落などを意識した文字の流し方 についてです。 #2の前半のモーショントゥイーンの回答はそのままで良いとして, 後半の2つ目のスクリプトが, 「段落などを意識した文字の流し方」を誤解したスクリプトかもしれないと思ったので, 追加補足させていただきます。 「段落などを意識した文字の流し方」の「段落」とは, 一通りの文章が表示されたあとの段落という意味でしょうか? もしそうだとすると, #2の後半の2つ目のスクリプトは間違っています。 つまり,  一通りの文章が表示される     ↓段落   ボタンクリック     ↓  次の文章が表示される     ↓段落   ボタンクリック     ↓  次の文章が表示される     ↓段落   ボタンクリック     ↓     … 繰り返し という意味でしたら次のようになります。 まず用意するものは, インスタンス名「myField」とした複数行設定のダイナミックテキストフィールドと, インスタンス名「myButton」としたボタンシンボルのインスタンスで, この両者とも _root のステージ上に配置したものとします。 オブジェクトの階層構造を図示すると, 次のようになります。  _root   ├ myField (ダイナミックテキスト(複数行))   └ myButton (ボタンシンボルのインスタンス) そして, _root のフレームに次のように書けば,  一通りの文章が表示される→段落→ボタンクリック→… ができます。 -------------------------------------------- // 表示させる文字列データ群 配列myData の作成 var myData = new Array(); // 表示させる文字列データ群要素 の準備(可変) myData[0] = "あいうえお\nかきくけこ\nさしすせそ"; myData[1] = "たちつてと\nなにぬねの"; myData[2] = "はひふへほ"; myData[3] = "まみむめも\nやゆよ\nらりるれろ"; myData[4] = "わ\nん"; // // 文字を出す速さの設定(ミリ秒 (可変)) var spd = 80; // // 配列の要素番号用変数 n の初期化 var n = 0; // カウンタ用変数 cnt の初期化 var cnt = 0; // ボタン myButton を非表示にする myButton._visible = false; // // 順次表示するユーザ定義関数 myFunc の定義 function myFunc() { // カウンタの値を 1 加算 cnt++; // myField に myData を指定文字数表示 myField.text = myData[n].substr(0, cnt); // 即更新 updateAfterEvent(); // もし カウンタの値が文字数以上になれば if (cnt>=myData[n].length) { // ボタン myButton を表示 myButton._visible = true; // setInterval を解除 clearInterval(myID); } } // // 指定時間(ミリ秒)ごとに myFunc を実行(初回) myID = setInterval(myFunc, spd); // // ボタン myButton の動作定義 myButton.onRelease = function() { if (n<myData.length-1) { n++; } else { n = 0; } cnt = 0; // 指定時間(ミリ秒)ごとに myFunc を実行 myID = setInterval(myFunc, spd); // このボタン myButton を非表示にする myButton._visible = false; }; --------------------------------------------- #2のままで良かったのかもしれませんが, 「段落とは何だろう???」 と考えていると,だんだん段落が何なのかわからなくなったので補足させていただきました。

dizzdive
質問者

お礼

文字のスクロールに関しては バッチリです。 #2も実際に動かしてみて 「おぉ!」ってなりました。 今日だした質問なので 締め切るのはまだ早いかな?って 思いまして、解決しちゃってるのですが お礼ポイントは後日振らせて貰います。

その他の回答 (2)

noname#35109
noname#35109
回答No.2

「箱庭ノベルズ」ですか。 面白い物を開発されている方がいらっしゃるのですね。 勉強になりました。 本題ですが, Flash では,文字を徐々に出すには, 普通はモーショントゥイーンを使うと思いますよ↓。 フェードインする文字 FLASHRAVE - FLASH 講座 - http://flashrave.org/anima/fade_in/index.html すごく単純技法というか, Flash を始めて3日目くらいの方がされる方法というか, ごく普通に考えれば,そうなると思います。 上記URLでは, 静止テキストにマスクをかけて, マスクをモーショントゥイーンさせています。 埋め込みフォントを使わないダイナミックテキストだと, 静止テキストとは違って,手動で設置したマスクはかからないので, 逆に,もっと単純にマスクなど使わず, 背景色と同じ塗りをムービークリップ(MC)に変換して, ダイナミックテキストの上に重ねて, 重ねたムービークリップをモーショントゥイーンで動かします。  ~例~   ↓背景色と同じ塗りの色のMC  □□□□□□□□   ↓ダイナミックテキスト  あいうえお   ↓重ねて  □□□□□□□□   ↓モーショントゥイーン  □□□□□□□□  あ□□□□□□□□ →  あい□□□□□□□□ →  あいう□□□□□□□□ →  あいうえ□□□□□□□□ →  あいうえお□□□□□□□□ → 右横にMCを動かすスペースが無い場合は, MCを縮めるモーショントゥイーンをしても良いです。   ↓モーショントゥイーン  □□□□□□□□  あ□□□□□□□  あい□□□□□□  あいう□□□□□  あいうえ□□□□  あいうえお□□□ もちろん, 段落を意識してモーショントゥイーンさせても良いでしょう。 たいていは, マスクを使うか,上記のようにマスクを使わずにもっと単純にモーショントゥイーンさせるかでしょうね。 単純&簡単です。 ====================== そうではなくて, ActionScript で文字を1文字ずつ出したい場合は, 普通に1文字ずつダイナミックテキストに表示させるようにスクリプトを組めば良いと思います。  ~簡単な例~ 新規ドキュメントを作成して, ステージ上に, 「myField」 というインスタンス名のダイナミックテキストフィールド(複数行設定)を用意しておいたとします。 そして, _root のフレーム1に次のように書きます。 ---------------------------------------------- // 表示させる文字列データ myData の用意(可変) var myData = "あいうえお\nかきくけこ\nさしすせそ"; // // カウンタ用変数 cnt の初期化 var cnt = 0; // 文字列データの文字数の取得 var dataLen = myData.length; // // 順次表示するユーザ定義関数 myFunc の定義 function myFunc() { // カウンタの値を 1 加算 cnt++; // myField に myData を指定文字数表示 myField.text = myData.substr(0, cnt); // 即更新 updateAfterEvent(); // もし カウンタの値が文字数以上になれば if (cnt>=dataLen) { // setInterval を解除 clearInterval(myID); } } // // 指定時間(ミリ秒)ごとに myFunc を実行 myID = setInterval(myFunc, 100); --------------------------------------------- これで,  あいうえお  かきくけこ  さしすせそ という文字列が, myField. というインスタンス名のダイナミックテキストに, 100ミリ秒(0.1秒)間隔で順次表示されます。 "あいうえお\nかきくけこ\nさしすせそ"の \n は改行コードです。 ただし, 上記の場合,文字の表示は一定間隔です。 > 段落などを意識した文字の流し方 これが最大の難関ですね。 コンピュータは人間ではありませんから, 文章も理解できませんし,段落も理解できません。 したがって,なんとか人間が考えて段落を待たせる処理をほどこさないとならないでしょう。 他にも方法はあると思いますが, 以下は私が勝手に考えた1つの方法例です。 例として,文章自体は上記のままで, 次のような段落を考えてみます。 ↓を段落とします。  あいう↓  えお\n↓  かきくけ↓  こ\nさしすせ 上記のような場合,  3文字出して段落,  5文字出して段落,  10文字出して段落。 となります。 \n は1文字としてカウントされます。 上記の状態を言いかえると,  4文字目を出すのを少し待つ,  6文字目を出すのを少し待つ,  11文字目を出すのを少し待つ。 となります。 これをプログラムすると次のようになります。 ------------------------------------------------ // 表示させる文字列データ myData の用意(可変) var myData = "あいうえお\nかきくけこ\nさしすせそ"; // // カウンタ用変数 cnt の初期化 var cnt = 0; // 待つ時間(間隔)の設定 var slpTime = 4; // 待つカウントの初期化 var slpCnt = 0; // 文字列データの文字数の取得 var dataLen = myData.length; // // 順次表示するユーザ定義関数 myFunc の定義 function myFunc() { // カウンタの値を 1 加算 cnt++; // cnt が 4 or 6 or 11 で 待つ時間以下のとき if ((cnt == 4 || cnt == 6 || cnt == 11) && slpCnt<=slpTime) { // カウンタを戻す cnt--; // 待つカウントを加算する slpCnt++; } else { // それ以外は 待つカウント を 0 に slpCnt = 0; } // myField に myData を指定文字数表示 myField.text = myData.substr(0, cnt); // 即更新 updateAfterEvent(); // もし カウンタの値が文字数以上になれば if (cnt>=dataLen) { // setInterval を解除 clearInterval(myID); } } // // 指定時間(ミリ秒)ごとに myFunc を実行 myID = setInterval(myFunc, 100); ------------------------------------------------ 1つの方法例ですが, 一応はこれでできますね。

dizzdive
質問者

お礼

基礎から教えていただき ありがとうございます!!

  • suzuko
  • ベストアンサー率38% (1112/2922)
回答No.1

カテ違いではないでしょうか? URLにはswfはありませんし、「箱庭ノベル」自体はFLASHでは制作されていません。ぽいですけどね。^^;

dizzdive
質問者

お礼

質問修正して 回答が得ることができました。 どうもありがとうございます。

dizzdive
質問者

補足

私の質問に不足ありました。 大変申し訳ございません。 箱庭ノベルのような、「メッセージスクロール」を 「ActionScript」をつかって Flashで表現できる方法を知りたかったのです。 ダイナミックテキストの属性?について 自己解決しました。 プロパティのボタンで 文字をコピー&ペーストできるなど 選べました。