• ベストアンサー

外部テキスト読み込み、横スクロールで流れる文字

外部テキストファイルを読み込んで、横スクロールで文字が永遠とループで流れるものをFLASHで表示したいのです。 外部テキストの文字数なども読み込んで もし文字が多くても対応できるようにしたいのです。 私はFLASH8を使用しております。 なんとか宜しくお願いします><

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

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

#1です。 ActionScript で marquee(マーキー) とはちょっとずれてきた質問のような… >> 関係ない話ですけど^^なんかもう雲の上の人で。憧れます。 sassakun もおだてれば木に登るかもしれませんが, 木に登ったところでわからないものはわかりません。 ---以下,気に障ったら無視してください。--------------- 決して怒っているわけではありません,逆に楽しんでいるのですが, 何か気になるのですよね,上の「なんかもう雲の上」 の 「もう」 が。 それと,前回のご質問のお礼でも 「いつも色々な方に丁寧に教えていただいて、本当に感謝いたします。。」 う~ん… ??? なんか変。 質問者の方は,たいてい(90%以上の方が)言葉足らずなので, 回答するときはいつも言葉足らずの部分を想像や妄想で補って回答しています。 でないと何も回答できません。 その習慣がついていて,想像や妄想が渦巻いて,どうもムズムズします。 「あなた,誰?」ってね。 いや,yui0909 さんであることはわかっているのですが, なんかどうも以前から知っている方のような気が… いや,全て変な妄想です。気にしないでください。 それに,素性を明かすことはここでは御法度になっていますから,答える必要もありません。 ---以上,気に障ったら無視してくださいでした。------- >> 2フレームのMCの位置を変えてみたところ、 >> 画像は表示されるのですが、 >> 何故か1フレームのMCの場所に表示されてしまうのです。 へー,本当ですね。 なぜかそんな現象がおこりますね。 おそらく loadMovie と this._width = 300; this._height = 200; が合わさって, MC自身の _x と _y がクリアされてしまうのだと思います。 でも,そんなに困ることはなく,スクリプトで座標を指定すればどうにでもなりますね。 また,各フレームに適当に基準となる MC を作って, そのxy座標に読み込むムービークリップを移動させても良いのではないでしょうか。 例えば,フレーム2 で読み込むMCを移動させたい場所に 空(から)のMCでも作って,インスタンス名を付けて, (この説明では 「criterionMC」 というインスタンス名にしておきます。) 読み込むMCには, ------------------------------------ onClipEvent (load) { this._x = _root.criterionMC._x; this._y = _root.criterionMC._y; this._width = 300; this._height = 200; } ------------------------------------ のように書けば良いのではないかと思います。 >> onClipEvent (enterFrame)を置きまくってたら、 >> なんか色々バグが出てきてしまって。 >> もしかしたら、onClipEvent (enterFrame)は >>適切な対処法ではなかったのでしょうか?? どんな対処をされているのかわからないので, 適切か適切でないかはわかりません。 でも, onClipEvent (enterFrame) や onEnterFrame = function() {}; は特別なものですから,ここぞというときにしか使いませんね。 enterFrame は 1フレーム進む時間ごとに毎回実行です。 フレームレートが 12fps だったら,1秒間に12回も実行されます。 そんなものが山ほどあったら,Flash は異常をきたします。 ムービークリップがたくさんあっても, 集団で同じ方向に移動するなどの場合は, 個々のムービークリップに onClipEvent (enterFrame) を使うのではなく, まとめて1つのムービークリップにしてしまって, 1つの onClipEvent (enterFrame) にすればずっと動きはスムーズになります。 また, onClipEvent (enterFrame) は,何があってもずっと実行され続けますから, 他のもので代用できるなら代用した方が良いと思います。 例えば,on(mouseMove) とかです。 http://livedocs.macromedia.com/flash/8_jp/main/00003960.html setInterval も場合によっては有効かもしれません。 http://livedocs.macromedia.com/flash/8_jp/main/00001766.html >> sassakunさんも 失敗とかあったのでしょうか。 当然,毎日失敗の連続です。 だいたい, loadVars なんて小難しいものを使うのも, 昔からある簡単で便利な loadVariable では失敗をすることが多いからです。 http://servees.com/flash/session4.html loadVariable で失敗しなければ loadVars なんて使いません。 実は,#1の回答も2種類あったのです。 失敗の方をお目にかけましょう。 #1で作ったものよりずっと簡単です。 オブジェクトとして用意する物は,「marquee」というインスタンス名のボーダー付きダイナミックテキストだけです。 ~~~ 失敗例 ~~~~~~~~~~~~ ◎ 外部テキストの準備 一応サンプルとして 「data.txt」 という外部ファイルを用意。 「data.txt」 の中身は,例として mydata=あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやいゆえよらりるれろわいうえをん (#1と同じ。) ◎ Flashの作成 新規でドキュメントを作成し,2レイヤーに, 上のレイヤーの各フレームを空白キーフレームにします。  □ レイヤー 筆・・|○|○| ←スクリプト用レイヤー  □ レイヤー 筆・・|○ []| ←オブジェクト用レイヤー 一応,上のレイヤーをスクリプト用レイヤー, 下のレイヤーをオブジェクト用レイヤーと頭の中で決めておきます。 そして, フレーム1 の 上レイヤー(スクリプト用レイヤー)に次のようなスクリプトを書くきます(コピペ可能)。 ------------------------------------------- // とりあえずストップ stop(); // Shift_JISコードのテキストを使用 System.useCodepage = true; // ------読み込み待ち処理------// // LoadVarsクラスのインスタンスを作成 myLoadVars = new LoadVars(); // LoadVars.onLoadを定義 myLoadVars.onLoad = function(Success) { // 読み込みが成功したら if (Success) { // myLoadVars のデータを _root に送る _root.mydata = this.mydata; // フレーム2 へ _root.gotoAndStop(2); } }; // myLoadVars に data.txt をロード myLoadVars.load("data.txt"); ------------------------------------------- フレーム2 の準備。 まず,フレーム2 の 下レイヤー(オブジェクト用レイヤー)を選択して, ステージ上に ダイナミックテキスト を作成してください。 とりあえず大きさは適当で良いです。 文字の色は背景色以外を選択してください。できれば黒が良いと思います。 また,周りのボーダーは入れてください。 そのダイナミックテキストを選択した状態で, 下のプロパティインスペクタ(パネル)で,"インスタンス名" を付けます(変数名ではありません)。 この説明では 「marquee」 というインスタンス名にしておきます。 そして, フレーム2 の 上レイヤー(スクリプト用レイヤー)に次のようなスクリプトを書くきます(コピペ可能)。 ------------------------------------------- // 表示する文字数の設定(※可変) show_len = 20; // スペースの作成 space = " "; for (i=1; i<show_len; i++) { space += " "; } // 文字データの前にスペースの挿入 mydata = space+mydata; // 文字データの文字数を取得 mydata_len = _root.mydata.length; // 変数 i の初期値を0にする i = 0; // 一定時間間隔で function を実行 IDscroll = setInterval(function () { // scroll.text に mydata の文字を表示 marquee.text = _root.mydata.substr(i, show_len); // 開始文字を加算 if (i<mydata_len) { i++; } else { i = 0; } // 180ミリ秒ごとに(※可変) }, 180); ------------------------------------------- ~~~ 以上,失敗例でした。 ~~~~~~~~~~ 多分,質問者さまが,最初に考えていたと思われる, 「外部テキストを読み込み,全体の字数を取得して,動かす。」 というものに近いのではないかと思います。 もし上記サンプルを作っていだだければわかると思いますが,ダメダメです。 1文字単位でしか横スライドできないのでガクガク。 私の Flash を作る上でのモットーは,「勤勉・優雅・英知」 です。 つまり, 「良く動き・優雅で・知性的」な物 を表現し追求できるのが Flash です。 上のものだと 「勤勉」 で 「英知」 はあるのかもしれませんが, 「優雅」がまるっきり無い。 カクカクです。 つまり,「失敗。却下ーーー!」 です。 「勤勉でない」=「動かない」 → Flashの意味無し! 「優雅でない」=「ギクシャクする」 → 他の方法を考えるべし。 「英知がない」=「品がないまたは下品」 → 無視! (注:このモットーはたった今決めたのです。だから説得力はなしです。) しかし,何か作るときは,だいだい失敗しますよ。 そんなものです。 でも車の運転と一緒で, 失敗したらすぐに元に戻ってやりなおすことが早道だと思います。 車に例えれば, 内輪差で壁にちょっとこすってしまったとき, または, 土地勘のない場所で曲がるべき道で曲がり損ねたとき, そのまま進むのではなく,すぐに止まってバックです。 その場を切り抜けようと前に進んでも傷を深めるだけか,道に迷うだけ。 たいてい良いことはありません。 と,そんな感じです。

yui0909
質問者

お礼

深い意味は全然ありません^^ 以前からsasakunさんが色々質問に答えてるのを見て すごいなぁ というのと、丁寧に教えてる人間性に感激してただけです^^ 特に深い意味はございませんので。 不快な思いさせて申し訳ございません。 おっしゃるとおり onClipEvent (load) { this._x = _root.criterionMC._x; this._y = _root.criterionMC._y; this._width = 300; this._height = 200; } こちらで出来ました! FLASHってたまに不可解な現象が起きるので いつもこういうバグ?と戦ってます>< バグというか単なる知識不足だけなのですがw 色々ありがとうございます~

その他の回答 (1)

noname#35109
noname#35109
回答No.1

書かれているようなものを, HTML では marquee(マーキー)と言いますが, そう言えば Flash ではあまりお目にかかりませんね。 参考になりそうなサンプルも見つかりませんでした。 ちょっと構造的に作るものもありますし,スクリプトも複雑ですから, ややこしいと思いますが,一応,考えてみた物の作り方の説明とスクリプト例を書いてみます。 ◎ 外部テキストの準備 一応サンプルとして 「data.txt」 という外部ファイルを用意します。 「data.txt」 の中身は,例として mydata=あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやいゆえよらりるれろわいうえをん というものにしておきます。 mydata が変数名で あいう…わん がその値です。 当然,値の文字は後でいくらでも変えられます。 一応,文字コードはメモ帳などでデフォルトの Shift_JIS を想定しています。 ◎ Flashの作成 新規でドキュメントを作成し,2フレーム2レイヤーにしてください。 そしてそれぞれのレイヤーのフレームを空白キーフレームにしてください。  □ レイヤー 筆・・|○|○| ←スクリプト用レイヤー  □ レイヤー 筆・・|○|○| ←オブジェクト用レイヤー 一応,上のレイヤーをスクリプト用レイヤー, 下のレイヤーをオブジェクト用レイヤーと頭の中で決めておきます。 フレーム1 の 上レイヤー(スクリプト用レイヤー)に次のようなスクリプトを書きます(コピペ可能)。 ---------------------------------------- // とりあえずストップ stop(); // Shift_JISコードのテキストを使用 System.useCodepage = true; //------読み込み待ち処理------// // LoadVarsクラスのインスタンスを作成 myLoadVars = new LoadVars(); // LoadVars.onLoadを定義 myLoadVars.onLoad = function(Success) { //読み込みが成功したら if (Success) { // フレーム2 へ _root.gotoAndStop(2); } }; //------読み込み------// // myLoadVars に data.txt をロード myLoadVars.load("data.txt"); --------------------------------------- 読み込み待ち処理を入れて,外部「data.txt」をFlash内のmyLoadVarsインスタンスに読み込むスクリプトです。 読み込みが完了すれば フレーム2 へ行きます。 フレーム2 の準備をします。 まず,フレーム2 の 下レイヤー(オブジェクト用レイヤー)を選択して, ステージ上に ダイナミックテキスト を作成してください。 とりあえず大きさは適当で良いです。 文字の色は背景色以外を選択してください。できれば黒が良いと思います。 また,周りのボーダーははずして置いた方が良いです。 これも当然後に変更可能です。 そのダイナミックテキストを選択した状態で, 下のプロパティインスペクタ(パネル)で,"インスタンス名" を付けます(変数名ではありません)。 この説明では 「marquee」 というインスタンス名にしておきます。 そしてそのダイナミックテキスト「marquee」を選択して, 右クリック→「シンボルに変換」より,ムービークリップシンボルにしてください。 ムービークリップにするのですが,このときの基準点の設定は, 前回ご質問のときと同様,左上にしてください。 (基準点の左上の □ をにチェックを入れて,■ にしてください。) なぜこうするかと言うと,ダイナミックテキストの基準点は自動的に左上になっていますから, これと合わせると言う意味もありますし,伸縮するダイナミックテキストを考えると, 左上を基準にしたほうが計算しやすいからです。 また,なぜわざわざムービークリップの中にダイナミックテキストを入れるかというと, マスクをセットするためです。 setMask でマスクをかけるのですが,setMask は MovieClipクラスのメソッドなので, ダイナミックテキスト には直接マスクをかけられないからです。 このムービークリップにもインスタンス名を付けてください。 この説明では,「marqMC」 というインスタンス名にしておきます。 次に上で少し触れたマスク用のムービークリップを作成します。 ステージ上に何色でも良いので,塗りで長方形を描いてください。 横幅はスクリプトで指定しますから,てきとうで良いです。 塗りの高さを,ダイナミックテキスト の高さより高めにして長方形を描いてください。 大きすぎてもかまいません。 その塗りを選択して,ムービークリップにします。 そのときの基準点はやはり左上を基準点にしてください。 この塗りのムービークリップにもインスタンス名を付けます。 この説明では 「marqMask」 というインスタンス名にしておきます。 このマスクはステージ外でもどこでも良いので適当な場所に置いてください。 スクリプトで位置を決めます。 そして,フレーム2 の上レイヤーを選択して, 次のようなスクリプトを書いてください(コピペ可能)。 --------------------------------------- // marqMC の初期座標の保存 marqX = _root.marqMC._x; marqY = _root.marqMC._y; // marquee の初期横幅の保存 marqW1 = _root.marqMC._width; // marqMC に マスクmarqMask をかける _root.marqMC.setMask(_root.marqMask); // マスクmarqMask をmarqMC の初期座標にセット _root.marqMask._x = marqX; _root.marqMask._y = marqY; // マスクmarqMask の横幅を marqMC と等しくする _root.marqMask._width = marqW1; // marqMC を出発座標に移動 _root.marqMC._x += marqW1; // myLoadVars のデータを marquee.text に代入 _root.marqMC.marquee.text = _root.myLoadVars.mydata; // marquee のサイズを代入された文字長に合わせる _root.marqMC.marquee.autoSize = true; // marqMC の新しい横幅を変数化 marqW2 = _root.marqMC._width; //------marquee の移動 ------// // 1フレーム進む時間ごとに1回 { } 内を実行 _root.onEnterFrame = function() { if (_root.marqMC._x+marqW2>=marqX) { //※ここの部分↓でスピード変更 _root.marqMC._x -= 3; } else { _root.marqMC._x = marqX+marqW1; } }; --------------------------------------- このスクリプトの冒頭にありますように, 全ては「marqMC」の場所や横幅を基準に動作させています。 だから,ダイナミックテキスト の大きさを変えれば自動的に,文字が見える範囲も変わり, 「marqMC」の場所を変えれば自動的に表示位置も変わるようにしています。 ややこしいスクリプトは触る必要なく,ダイナミックテキストの横幅や位置は主観で変更できるようにしています。 テキストエリアの幅を変えたいときは,「marqMC」ではなく,その中の「marquee」の幅を変えてください。 また,外部テキストの長さも適当で良いです。 長さに応じてマーキーが流れるようにしてあります。 唯一スクリプトでカスタマイズ場所が,スクリプトの最後の方 //※ここの部分↓でスピード変更 _root.marqMC._x -= 3; の部分です。 この 3 を変えるとスピードが変わります。 作り方の説明ばかりで, 原理の説明はほとんど省略しています。 と言ってもそう難しいスクリプトは使っていませんね。 ちょっと見慣れないのが LoadVars と setMask ぐらいだと思います。 LoadVars に関してはこちらが↓参考になると思います。 「LoadVarsオブジェクトを使った外部テキストファイルの読込み」 http://www.fumiononaka.com/TechNotes/Flash/FN0303007.html setMask に関してはこちらが↓参考になると思います。 「MCをマスクにする(FlashMX以降)」 http://hakuhin.hp.infoseek.co.jp/main/as/movieclip.html#MOVIECLIP_05 なぜ,普通のマスクではなく,setMask を使うかというと, ダイナミックテキストに普通のマスクがかからないからです。 マスクがかからないと,長い長いテキストが全部丸見えになってしまします。 他の何かで,上のレイヤーを塗れば長い長いテキストは見えませんが, 作るのがやっかいなので,setMask にしました。 構想はご質問を見てすぐに出来ていたのですが, なるべく作りやすくなるべく便利なように使えることと, 上の作り方の説明を書くのに時間がかかってしまい,回答がおそくなりました。 上記スクリプトの動作確認ですが, かなり長い文字列では実験していませんが少々なら大丈夫だと思います。 また, Flash Player 6 ちょうどではうまく動作しませんが(setMask関係), Flash Player 6.0r40 以降は動作するようです。 一応,Flash Player 7 以上であれば大丈夫です。 Flash 作成ツールでは当然 Flash 8 で作成したもので確認しています。

yui0909
質問者

お礼

出来ました・・・すごすぎです・・ 本屋さんで立ち読みしたり、ネットサーフィンしても なかなか書いてなくて 半分諦めてました。 テキスト自体をMCで動かしてもいいのですが、 テキストに書いた値が多くなったらどうしよう。。とか考えていたら、もう無理だなぁ。。と 思っておりました。 本当に助かりました! でも、スクリプト一行一行説明を書いてくださっているので、理解は出来ますが、一から書くことなんて私には不可能です>< おしえて!アクションスクリプトを何回も読み返してるのに。。 あのsassakunさんにご質問があるのですが 前回教えてもらった http://oshiete1.goo.ne.jp/kotaeru.php3?q=2068524 このスクリプトについてですが、 例えば、 1フレームに置いたMCに外部画像ファイルを読み込んで表示させて、2フレームで同じMCに違う外部画像ファイルを読み込んでみたところ、正常に表示されたのですが、2フレームのMCの位置を変えてみたところ、画像は表示されるのですが、何故か1フレームのMCの場所に表示されてしまうのです。 onClipEvent (enterFrame)を書いて 一応ちゃんと配置されたりはするのですが、 onClipEvent (enterFrame)を置きまくってたら、なんか色々バグが出てきてしまって。 もしかしたら、onClipEvent (enterFrame)は適切な対処法ではなかったのでしょうか?? いつも簡単そうな事なのに躓いて。。>< あってるはずのASでも動かなかったり。 意地でも頑張ってみようと思います。 sassakunさんも 失敗とかあったのでしょうか。 関係ない話ですけど^^なんかもう雲の上の人で。憧れます。

関連するQ&A

専門家に質問してみよう