ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Flashコミュの【質問】外部ファイルの更新 WinXP/Flash8

  • mixiチェック
  • このエントリーをはてなブックマークに追加
質問です。
外部ファイルの変数を読み込んでくるものを作っています。
しかし、外部ファイルの値が更新されても、
Flashで表示されるのは、更新前の状態になります。

外部ファイルを手動で更新して、
(ブラウザからtxtファイルを表示させて更新)
Flash内でもういちど読み込みをさせるとうまくいきます。

なので、外部ファイルを読み込む際に、
一度更新してから、読み込みをさせたいと考えていますが、
どうすればよいでしょうか?

もしくは、単に特定の外部ファイルを更新する方法など
ありますでしょうか?

よろしくお願いします。

コメント(31)

それはキャッシュの問題なので、外部ファイルを読み込む際にMath.random()で適当な乱数をクエリとしてファイル名にわたしてあげればよいです。

var file:String = "任意のファイル名.txt?rnd="+Math.floor(Math.random()*100);
MovieClip.loadMovie(file);
読み込むファイルのURLに、乱数のクエリーストリングを付与してあげればイけると思いますがいかがでしょうか。

hoge.txt?rnd=乱数
早速の書き込みありがとうございます。

+++++++++++++++++++++++++++++++++++++++++++++++++++++

stop();
roadload = new LoadVars();
roadload.onLoad = roadFunction;
function roadFunction(bSuccess) {
if (bSuccess) {
_root.rtxt1.text = this.r1;
if (rtxt1.text == 1) {
gotoAndPlay(68);
} else if (rtxt1.text == 2) {
gotoAndPlay(71);
} else if (rtxt1.text == 3) {
gotoAndPlay(74);
} else if (rtxt1.text == 4){
gotoAndPlay(75);
} else {
gotoAndPlay(67);
}
} else {
gotoAndPlay(64);
}
};
var file:String = "data/data2.txt?rnd="+Math.floor(Math.random()*100);
MovieClip.loadMovie(file);
roadload.load("data/data2.txt");

++++++++++++++++++++++++++++++++++++++++++++++++++++++

こんな感じでやってみたのですが、うまくいきませんでした。

こういうことではないのでしょうか?
すいません、よろしくお願いします。
この書き方なら
MovieClip.loadMovie(file);
はいらないです。

var file:String = "data/data2.txt?rnd="+Math.floor(Math.random()*100);
roadload.load(file);

でどうでしょう。
テツさん

ありがとうございます。
変更してやってみたのですが、
結果としては、読み込みがサクセスしないという
結果になってしまいました。

選択したフレームに一瞬だけ飛んで、
そのあとに、読み込みがサクセスしなかった場合の
フレームに戻ってしまいました。

ご助言お願いします。
gotoAndPlay と gotoAndStop の違いは理解されていますか?
ひろゆきさん

一応理解はしています。
PlayをStopに変えてやってみたのですが、
結果は同じでした。

なぜか読み込みエラーになってしまいます。
読み込みが出来て、一瞬飛ぶですが、ダメになってします。

なにか別な問題なのでしょうか?
サーバに上げてテストしていますか?
ひろゆきさん

はい。サーバにあげて、やっています。
今一度、なさったことを整理された方がよろしいのでは?

どのフレームに、何を配置し、
どこに、どのようなスクリプトを記述したのか。
ひろゆきさん

確認してみましたが、
なぜ飛んだ先から、戻ってくるのかがわかりません。
飛んだ先のフレームのスクリプトには、stopしかないので。

var file:String = "data/data2.txt?rnd="+Math.floor(Math.random()*100);
roadload.load(file);
このスクリプトでは、乱数を発生させているということですが、
data/data2.txtに乱数が書き込まれるということなのでしょうか?

みなさんに教えていただいた、このスクリプトがいまいちよくわかっていないもので。。
ともすけさんの最初のスクリプトでは、data2.txtがキャッシュに記憶されます。キャッシュに記憶されたものは優先的に読み込まれる仕組みになっているので、それを防ぐにはファイル名を毎回変えてあげる必要があります(とはいえdata2.txtをdata3.txtなど根本的にかえることは無理なので、ここでクエリ文字を使います)。
そのために、クエリ文字(?以降の文字)を適当に与えてあげてファイル名を変えてあげているようにブラウザに錯覚させています。
実際ファイル名はdata/data2.txt?rnd=0〜100までのランダムな整数となり、毎回この整数が異なるので違うファイルとして扱われます。

ですので、フレームの挙動とは全く関係ありませんよ。
と、とび先のフレームは基本stopのようなので、念のためgotoAndPlayをgotoAndStop(任意のフレーム番号)にしてみてはいかがでしょうか?

あと怪しいのは、フレームに毎回67フレームに飛んでStopしきれずに1フレームに戻ってはいるような気がします。data2.txtから拾ってきた変数の型(数値なのか文字列なのかオブジェクトなのか)があってなくてif文が毎回elseになっているのかもしれません(検証してないのでわかりませんが)。
各フレームにtraceで今どこのフレームにいるのか出力して動きを追ってみてみてはいかがでしょう?
Wpeeeeさん

ありがとうございます。
教えていただいたスクリプトの内容については理解できました。

あと、怪しいとおっしゃっていた部分ですが、
教えていただいたスクリプトを入れなければ、ちゃんと動作はしています。
#更新されたデータを読み込めずに同じ表示なってしまいますが。
なので、変数の型が合っていないということはないかなと思っています。

あと、traceはどのように使えばよいのでしょうか?

教えていただくばかりで、恐縮です。
traceは各フレームで

trace('現在のフレーム番号です:: '+this._currentframe);

といれてあげれば出力パネルに、

現在のフレーム番号です:: 1
現在のフレーム番号です:: 64
現在のフレーム番号です:: 1
      ・
      ・
      ・
みたくでると思います。67の次のフレームにもstop()をいれずにtraceをいれておいて、67→68→1とかになればelseの結果になってさらにstopがきいてないと判断できます。
Wpeeeeさん

ありがとうございます。

traceを使ってみました。
わかったことは、data2.txtを読み込む前に
乱数が働いてしまって読み込むファイルが見つけられないみたいです。

なので、
roadload.load("data2.txt");
var file:String = "data2.txt?rnd="+Math.floor(Math.random()*100);
roadload.load(file);
としてみたのですが、ダメでした。
別のフレームに乱数を発生させるやつを書いてやらないとダメなのでしょうか?
もう一度読み込みを行うボタンに書くとかでしょうか?
ともすけさん

>traceを使ってみました。
>わかったことは、data2.txtを読み込む前に
>乱数が働いてしまって読み込むファイルが見つけられないみたいです。

これの意味合いがちよっとわからないんですが、
var file:String = "data2.txt?rnd="+Math.floor(Math.random()*100);
trace(file);
roadload.load(file);
として動かしてみてください。

出力パネルに
data2.txt?rnd=51
とかっていう出力がされますでしょうか?(51という数字は乱数なので0から100までのどれかの数値が出ると思います。)
ファイルのパスとしては
data2.txt?rnd=51

data2.txt
というのは基本的には、同じもので、
data2.txt
で読み込めるなら
data2.txt?rnd=51
でも読み込めるはずです。

ちなみにファイルがパス違いで読み込めない場合は出力パネルに
「Error opening URL ファイルのパス」
というエラーが表示されるはずですが、表示されますでしょうか?

それとdata.txtへのぱすが、最初は
data/data2.txt
となっていましたが、
今回は
data2.txt
となっていますよね?その辺は大丈夫でしょうか?

それとファイルが読み込めないのが原因なのか、とび先のフレームのスクリプトの不具合かを切り分けるために、
if (bSuccess) {
 trace("read success");
} else {
 trace("read false");
};

と記載して、どちらが出力されるかを検証してみてください。
テツさん

>var file:String = "data2.txt?rnd="+Math.floor(Math.random()*100);
>trace(file);
>roadload.load(file);
>として動かしてみてください。

やってみました。
出力パネルには、「Error opening URL ファイルのパス」が出ています。
乱数のスクリプトを抜くと、このエラーは出ません。

data/data2.txtがdata2.txtになっているのは
こちらがいじったからです。ややこしくしてしまってすいません。
問題はないです。

if (bSuccess) {
 trace("read success");
} else {
 trace("read false");
};
このスクリプトを書くと、trace("read false"); の所で、シンタックスエラーが出てしまいます。。
これは一連のスクリプトの続きで書くのでよいのでしょうか?
あっ、クエリーストリングってローカルじゃ読み込まない気がしました(汗)
すみません、もといで、データをサーバーにアップしていただき、
下記の部分
**************
if (bSuccess) {
_root.rtxt1.text = this.r1;
if (rtxt1.text == 1) {
gotoAndPlay(68);
} else if (rtxt1.text == 2) {
gotoAndPlay(71);
} else if (rtxt1.text == 3) {
gotoAndPlay(74);
} else if (rtxt1.text == 4){
gotoAndPlay(75);
} else {
gotoAndPlay(67);
}
} else {
gotoAndPlay(64);
}
};
**************

**************
if (bSuccess) {
gotoAndStop(68);
} else {
gotoAndStop(64);
};
**************
と書き換えて動かすとどうですか?

68フレーム目にいきますか?
64フレーム目にいきますか?
(上記のどちらのフレームにもスクリプトは記載しない、もしくはstop();のみ記載)
テツさん

68フレーム目に行きました。
という事はテキストファイルの読み込み、変数分析は成功しているという事なんで、下記のスクリプト、もしくは飛び先のフレームのスクリプトに問題があるように思います。

**************
if (bSuccess) {
_root.rtxt1.text = this.r1;
if (rtxt1.text == 1) {
gotoAndPlay(68);
} else if (rtxt1.text == 2) {
gotoAndPlay(71);
} else if (rtxt1.text == 3) {
gotoAndPlay(74);
} else if (rtxt1.text == 4){
gotoAndPlay(75);
} else {
gotoAndPlay(67);
}
} else {
gotoAndPlay(64);
}
};
**************

if文の
rtxt1.text == 1

rtxt1.text == "1"
と文字列として比較しても駄目ですかね?
テツさん

遅くなりました。
やってみましたが、やはり結果は同じでした。

このままだとうまくいくのですが、
乱数のスクリプトを入れるとおかしくなります。
飛んだ先には、ストップしかないですし。。


組み合わせとか相性とかあるんでしょうか?

> 乱数のスクリプトを入れるとおかしくなります。

AS2.0書き出しになっていますか?
ひろゆきさん

あっ、すいません。
1.0になっていました。。

2.0に直してやってみたところ、
乱数のスクリプトがあっても、
飛んだ先のフレームから戻ってくることはなくなりました。
しかし、更新されたデータを読み込めず、同じ表示になってしまいます。

最初に質問させていただいた時と同じ状態です。。

乱数のスクリプトがうまく動いていないのでしょうか?
もう一度状況を整理したいと思います。
#自分のためにも

外部ファイルを読み込んで、そこにある変数によって
if文で特定のフレームに飛ばします。

飛んだ先から、また読み込みを行うひとつ前のフレームに戻っています。
そこで外部ファイルを更新して、再度読み込みを行います。
すると、前回と同じフレームに飛んでしまいます。

そこでみなさんに教えていただいた、乱数を使って、ファイル名を変える方法をとっています。

しかし、乱数のスクリプトがうまくうごいていないのか、
結果は変わらず、更新前のフレームに飛んでしまいます。

というのが、現状です。
> 飛んだ先から、また読み込みを行うひとつ前のフレームに戻っています。
> そこで外部ファイルを更新して、再度読み込みを行います。

これが問題だと思います。

また、全く整理されていないように思います。
少なくとも、第三者が見て、再現できるような説明が必要ではないでしょうか?

どのようなフレーム構成になっているのか、
何をどのフレームに配置しているのか、
どのフレームに、具体的にどのようなスクリプトを記述しているのか、
明確にされた方がよいのではないでしょうか?
ひろゆきさん

ご指摘ありがとうございます。

構成ですが、
65フレーム目:フレームアクション stopのみ
       ボタン gotoAndPlay(67);
66フレーム目:stopのみ
67フレーム目:外部ファイルを読み込むスクリプト
       乱数のスクリプト
******************************

stop();
roadload = new LoadVars();
roadload.onLoad = roadFunction;
function roadFunction(bSuccess) {
if (bSuccess) {
_root.rtxt1.text = this.r1;
if (rtxt1.text == 1) {
gotoAndStop(68);
} else if (rtxt1.text == 2) {
gotoAndStop(71);
} else if (rtxt1.text == 3) {
gotoAndStop(74);
} else if (rtxt1.text == 4){
gotoAndStop(75);
} else {
gotoAndStop(64);
}
} else {
gotoAndStop(65);
}
};
var file:String = "data/data2.txt?rnd="+Math.floor(Math.random()*100);
roadload.load(file);
roadload.load("data/data2.txt");

**************************************
68フレーム目:飛ぶ先1
       フレームアクション stopのみ
       ボタン gotoAndPlay(65);
71フレーム目:飛ぶ先2
       フレームアクション stopのみ
       ボタン gotoAndPlay(65);
74フレーム目:飛ぶ先3
       フレームアクション stopのみ
       ボタン gotoAndPlay(65);
75フレーム目:飛ぶ先4
       フレームアクション stopのみ
       ボタン gotoAndPlay(65);

これが問題となっている部分です。


外部ファイルの読み込みとif文で、飛ぶ先1〜4のいづれかに飛びます。
飛んだ先のフレームには、ボタンがあり、65フレーム目に戻るようになっています。
外部ファイルは、cgiで作ったアンケートのようなものの結果の出力ファイルです。
形式はテキスト形式です。
65フレーム目に戻ったら、外部ファイルのデータを更新します。
#もう一度アンケートに答える形になります。
そこで出力されたデータを、67フレーム目でまた読み込んで
新しくなった方の飛ぶ先へ行きたいのですが、
前のデータの所に行ってしまいます。

このような感じになっています。
うまく伝えられていないかもしれませんが。
roadload.load(file);
roadload.load("data/data2.txt");

これでは、結局、クエリのついていない
data2.txt を読み込んでしまいますから、
前のデータを参照していることになります。

roadload.load(file);
だけにしてみてください。
ひろゆきさん

ありがとうございます。
出来ました!!
データが更新されても、無事に新しいところに飛べました。

他にもご協力くださったみなさんに、感謝いたします。

ありがとうございました。

ログインすると、残り1件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Flash 更新情報

Flashのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング