限定しりとり

Flashのアクションスクリプトを使い、外部のテキストを読み込ませ、さらにそのテキストをmarqueeタグのように、左から右へ流れるように表示させ、それを繰り返したいです。

以下のページを参考にし、外部テキストを表示するところまでは問題なく出来ました。
http://www.mdn.co.jp/content/view/4566/111/

marqueeのようなスクロールは、ダイナミックテキストをモーショントウィーンでやりました。

ただし、読み込ませる外部テキストの文字数が毎回違います。
それにより、文字数が
1、読み込ませるテキストの文字数が毎回違うため、文字の長さによっては、文字が隠れて表示されない。
2、読み込ませるテキストの文字数が毎回違うため、文字の長さによってモーショントウィーンではうまく繰り返しのタイミングが掴めない。
ということです。

1、はダイナミックテキストで文字数がいなかる場合でもちょうどぴったりテキスト枠のサイズが指定できる方法はないでしょうか?

2、ちょうど読み込んだテキストの最後が消えた時点で、また頭から繰り返すにはどうすればよいでしょうか?

環境は、
Windows Vista
Flash Pro 8

よろしくお願いいたします。

A 回答 (3件)

cnkozoさん、


外部data.textは、今までのを使うとします。
以下で、左にメッセージが隠れたら、次のメッセージに変わり、ループします。
順番は、ロード時に、毎回変化しますが、一度ロードされた後は、変化しません。

//ここから
var max:Number;//メッセージの数
mc._txt.text = "";//インスタンス名 _txtをMovieClip化し、ステージ上でのインスタンス名を、mcとする。ロード時は、ブランク
mc._x = 20;//ステージより、少し、右寄りに配置
var n:Number = 0;//mess_array[n]、即ち、配列要素番号をnとし、初期値は、0とする
var mess_array:Array = new Array();//配列定義
//System.useCodepage = true;//data.txtのコードが、UTF-8で記載されてない場合は、これが必要
var lv:LoadVars = new LoadVars();
lv.onLoad = function():Void {
max = Number(this.kazu);//文字列の数値化
for (var i:Number = 0; i<max; i++) {
mess_array[i] = this["mess"+i];
}
Shuffle(mess_array);//下のカスタム関数 Shuffle()を動かし、mess_arrayをShuffle
trace(mess_array);
Move(mc);//mcを引数として、下のカスタム関数 Move(targt_mc)を始動させる

};
lv.load("data.txt");
//lv.load("data.txt?"+getTimer());//サーバーアップ時は、ブラウザーのキャッシュ対策として、こちらを使用する。ローカルでは、エラー発生

//左に動かす関数を、カスタム関数化し、引数を、target_mcとする
function Move(target_mc:MovieClip) {
target_mc._txt.text = mess_array[n];//最初は、n=0が入り、左に隠れたら、n=1,2,3,4,0,1,2,3,4,0・・・・・となる
target_mc._txt.autoSize = "left";
w_txt.text = "_txtサイズ="+target_mc._txt.textWidth;
var speed:Number = 3;
target_mc.onEnterFrame = function():Void {
this._x -= speed;//左へ移動
if (this._x<(-this._width)) {//mcがステージの左に完全に隠れたら、
n++;//カウントアップし、
if (n>=max) {//max以上になったなら、
n = 0;//カウンターを元に、戻す
}

Move(this);//カスタム関数を、ここで、実行させる
this._x = Stage.width;//ステージの幅に、mcの基準点を戻す
}
};
trace("n= "+n);
}

//配列を、Shuffleする関数を、カスタマ関数化して、見易くしておく
function Shuffle(_array:Array) {
var num:Number = _array.length;
for (var i:Number = 0; i<num; i++) {
var r:Number = Math.floor(Math.random()*num);// ランダムなindexを取得
// i とランダムなindexの中身を入れ替え
var t:Number = _array[r];
_array[r] = _array[i];
_array[i] = t;
}
}
//ここまで
となります。

この回答への補足

joy_28様
お礼が遅くなり、失礼いたしました。
本職の方とお見受けしました。本当に最後まで手取り足取りありがとうございました。

私にできるのはお礼をここで申し上げることくらいしか出来ません。
本当にお会いして直接お礼を申し上げたいところです。

私も詳しくなったら他の人に教えられるようになりたいです。

本当にお世話になりました。

補足日時:2009/11/25 23:35
    • good
    • 0

cnkozoさん、


mc._txt.text = "";//インスタンス名 _txtをMovieClip化し、ステージ上でのインスタンス名を、mcとする。ロード時は、ブランク

ここが、出来てないからだと、推測します。
インスタン名 _txtをステージに配置しただけでは、動きませんから、これを、MovieClip化します。
その上で、ステージ上での、インスタンス名をmcと名付けてください。
結果、mcの中に、_txtが内包される形になりますから、_txtへのパスは、
ドット演算子を使って、
mc._txt.textというようになります。
この作業を省略すると、動きませんので、再チェック下さい。

この回答への補足

何度もありがとうございます。

読解力がなくて申し訳ございませんでした。
今回おっしゃるように設定し、無事成功しました。
本当にありがとうございました。

ここまで来てお礼したいのですが、もう一つだけわがままをお許し下さい。
今の場合だと、文字の切り替えは更新した場合になりますが、可能なら、文字が左に行って、消えたら、次に右から出てくる文字を毎回ランダムに切り替えるようにしたいです。

本当にすみません。なにとぞよろしくお願いいたします。

補足日時:2009/11/23 01:41
    • good
    • 0

cnkozoさん、


AS2.0の例です。
・外部data.txt:其々、長さを変化させる
&mess0=1番目のmess&
&mess1=2番目のメッセージです&
&mess2=3番目のメッセージと意見です。&
&mess3=4番目&
&mess4=5番目のMessageと意見とその事例です&
&kazu=5&

・FLA側
//ここから
var max:Number;//メッセージの数
mc._txt.text = "";//インスタンス名 _txtをMovieClip化し、ステージ上でのインスタンス名を、mcとする。ロード時は、ブランク
var mess_array:Array = new Array();//配列定義
System.useCodepage = true;//data.txtのコードが、UTF-8で記載されてない場合は、これが必要
var lv:LoadVars = new LoadVars();
lv.onLoad = function():Void {
max=Number(this.kazu);//文字列の数値化
for (var i:Number = 0; i<max; i++) {
mess_array[i] = this["mess"+i];
}
var r:Number = Math.floor(Math.random()*max);//0から4までの乱数発生
trace(r);
mc._txt.text = mess_array[r];//r番目の配列要素を取り出して、mcに入れ子になった、ダイナミックテキスト _txtに代入
mc._txt.autoSize="left";//左基準で、サイズの自動調整を行い、
w_txt.text=mc._txt.textWidth;//その時の_txtサイズ、すなわち、mcの幅を取得し、参考に、w_txt.textに表示、必須ではない
Move(mc);//カスタム関数を、mcを引数に実施
};
lv.load("data.txt");
//lv.load("data.txt?"+getTimer());//サーバーアップ時は、ブラウザーのキャッシュ対策として、こちらを使用する。ローカルでは、エラー発生

function Move(target_mc:MovieClip){//ごちゃごちゃするので、外出しで、カスタム関数化し、引数を、target_mcとする
var speed:Number=3;
target_mc.onEnterFrame=function():Void{
this._x-=speed;//左へ移動
if(this._x < -this._width) {//mcがステージの左に完全に隠れたら、
this._x = Stage.width;//ステージの幅に、mcの基準点を戻す
}
}
}
//ここまで

となります。

この回答への補足

http://okwave.jp/qa5449549.html
で質問した者です。
こちらにもご回答頂き、ありがとうございました。
また、返事が遅くなり、すみませんでした。

http://okwave.jp/qa5449549.html
ではうまくいったのですが、今回のはうまくいきませんでした。
swfを書き出し、swfを開くと何も表示されません。
ダイナミックテキストを置いた場所にカーソルを持って行くと、テキスト選択になるので、何んらかのミス?があったのだと思います。
ダイナミックテキストのインスタンス名は「_txt」としました。
再度アドバイス頂けましたら幸いです。

補足日時:2009/11/22 14:41
    • good
    • 0

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