dポイントプレゼントキャンペーン実施中!

FLASH内に定義してあるGETURL内のリンクを外部テキストファイル
を使用して、FLASH内にあるリンクを、外部で簡単に書き換えられるようにする方法がいまいち分かりません。
どなたか教えていただけないでしょうか?

A 回答 (1件)

方法はたくさんありますが,


簡単に言うと,
外部テキストファイルに 「変数名=URL」 という形のテキストデータを用意しておいて,
loadVariables関数 または LoadVarsクラス のメソッドで外部テキストデータを Flash 内にロードして
そのロードした変数の値を,getURL() の () 内で参照する方法が一般的だと思います。


以下は具体的な方法例です。
また,ご使用の Flash のバージョンがわかりませんが,
こちらで勝手に Flash MX 以上(MX,MX2004,8)をお持ちだと言うことで回答します。
Flash 5 以下のバージョンでは,下で回答する方法を使うことはできません。



まず,
任意のフォルダ内にテキストファイルを用意しますが,
そのファイル名を 「data.txt」 ということにしておきます。
このファイル名は別に何でもかまいませんが,
この説明では 「data.txt」 というファイル名として説明を続けますという意味です。

「data.txt」 の中身ですが,
getURL() するリンク先が 勝手に 5つあるものとして次のように書きます。

---テキストデータ例---------------
&url0=Http://Www.google.co.jp/&
&url1=Http://Www.yahoo.co.jp/&
&url2=Http://Www.live.com/&
&url3=Http://ask.jp/&
&url4=Http://Www.marsflag.com/&
-----------------------------

※すみません。
本当は,Http ではなく http ,Www ではなく www なのですが,
ここのコミュニティでは,そういうものがあると,
&url0=http://www.google.co.jp/&
のように,勝手にリンクが挿入されてしまいます。
それにともなって,
見えない文字が入ってしまいますので,
コピペする場合は誤動作したり全く動かなくなることが考えられるため,
わざと,全角大文字 の H と W を使用しています。
したがって,
上の「テキストデータ例」をコピペする場合は,
お手数ですが,H を h,W を w に置換または手動で変更してください。

形はわかりますか。
「変数名=URL」が1つのかたまりで,
その改行の前後に & を入れてあるものです。
「&変数名=URL&」 です。
getURL する URL が1つだけしかない場合は,
特に & を使う必要はありません。

url0=Http://Www.google.co.jp/

のような形で良いです。



次に Flash 本体の作成です。

Flash で新規ドキュメントを作成して,
「data.txt」 と同じフォルダに適当な名前を付けて保存します。

そして,
ステージ上に1つの ボタン(ボタンシンボルのインスタンス) を作成してください。
そしてそのボタンをコピペで4つ増やして5つにします。

この時点で,
ボタンが5つ並んだ レイヤー が1つあるだけのはずですから,
新規でレイヤーを挿入し,
そのレイヤーを ActionScript 専用レイヤー と決めておきます。

その新規で作成した レイヤー の フレーム1 の空白キーフレームに,
次のように書きます(コピペ可能)。

------------------------------------
// LoadVarsクラスのインスタンス myLV を作成
myLV = new LoadVars();
// myLV に外部テキスト「data.txt」をロード
myLV.load("data.txt");
------------------------------------


これで,
LoadVarsクラスのインスタンスオブジェクト myLV 内に,
「data.txt」 内の全てのデータが読み込まれます。

ですからあとは,
各ボタンから,
myLV 内の各変数を指定してやればOKということになります。

5つあるうちの1つのボタンには次のように書きます。

--------------------------
on (release) {
getURL(_root.myLV.url0);
}
--------------------------

getURL の () 内に,
myLV 内の変数名を入れてやるのです。

1つわかれば全てわかると思いますが,
他のボタンには,

--------------------------
on (release) {
getURL(_root.myLV.url1);
}
--------------------------
   ~ 省略 ~
--------------------------
on (release) {
getURL(_root.myLV.url4);
}
--------------------------

と書きます。

そして,パブリッシュしてもらえば,
Google や YAHOO! などにジャンプするボタンができます。

本題は以上です。



====================

本題は上記のみで済んでいますが,
上の物はシンプルに原理だけを説明したもので,
ひょっとしたら何か不都合が生じる可能性もあります。
(全く不都合を生じないかもしれませんが。)

結局ほとんど同じ物ができるのですが,
もう1種類のスクリプトサンプルを書いておきます。



まず,
上で作った5つのボタンにインスタンス名を付けます。
どれがどれでも良いのですが,
5つのボタンに
「mybtn0」,「mybtn1」,「mybtn2」,「mybtn3」,「mybtn4」
という感じで,「文字列+連番数字」のインスタンス名を付けておきます。

そして,

レイヤー の フレーム1 の空白キーフレームに書いたスクリプトを,
次のように書きかえます(コピペ可能)。

------------------------------------
// 「mybtn0」~「mybtn4」のボタン機能を無効にする
for (i=0; i<=4; i++) {
_root["mybtn"+i].enabled = false;
}
// LoadVarsクラスのインスタンス myLV を作成
myLV = new LoadVars();
//
// LoadVars.onLoad 関数の定義
myLV.onLoad = function(Seikou) {
// ロードに成功したら
if (Seikou) {
// 「mybtn0」~「mybtn4」のボタン機能を有効にする
for (i=0; i<=4; i++) {
_root["mybtn"+i].enabled = true;
}
}
};
//
// キャッシュ参照防止策
// 今現在の時刻オブジェクト myDT を作成
myDT = new Date();
// 1970年1月1日(世界時) からのミリ秒を取得
myTM = myDT.getTime();
//
// myLV に外部テキスト「data.txt」をロード
myLV.load("data.txt"+"?time="+myTM);
------------------------------------


これで,パブリッシュすれば良いのですが,
パブリッシュした SWF を直接開いてみたり,
「制御」→「ムービープレビュー」してみても,
外部テキストがロードされないので正常に動かないと思います。
しかし,
同時にパブリッシュした HTML をブラウザで開くと無事に動作するのではないかと思います。
少なくともアップすれば大丈夫だと思います。


こうなってくると何が本題なのか,
さっぱり見えにくくなりますが,結局できるものはほとんど同じ物です。
何をしているのかと言うと,
エラーや不具合に対する対処をしているのです。


スクリプトの上の方では何をやっているのかというとロード待ち処理を入れてあるのです。

Flash はネットで使用することが大半です。
ローカルPCだと,外部テキストのロードは瞬時に行われますから,
まず不具合がおきることはないのですが,
ネットの場合,それも外部テキストの容量がもっと増えた場合,
その外部テキストのロードにある程度時間がかかります。
コンマ数秒 ~ 場合によっては十数秒くらいかかるかもしれません。

もし,まだ外部テキストがロードされていないうちに,
ボタンをクリックされてしまったら,
どこにもジャンプしないとは思いますが,
ひょっとしたら予期しない URL にジャンプしてしまったり,
予期しない動作をしてしまう可能性がないとは言いきれません。

それで,
外部テキストがロードされるまで,
enabled = false;
で,ボタンのボタン機能を無効にしておいて,
外部テキストがロードされ次第,
enabled = true;
で,ボタンのボタン機能を有効にしています。



スクリプトの下の方では何をやっているのかというと,キャッシュ参照防止策をとっているのです。

SWF や TXT がネット上にあってそれをブラウザでみた場合,
Flash からロードされたテキストファイル(「data.txt」)もブラウザのキャッシュ(一時ファイル)に残ります。
ブラウザは,リクエストされた URL があると,
まずそのキャッシュを見に行きます。
そして,リクエストされた URL が過去にリクエストされたものと同じであれば,
キャッシュデータの方を表示(この場合ロード)させることがあります。

普通は,
リクエストされた URL が過去にリクエストされたものと同じであっても,
キャッシュデータと本物のデータを比べて,
差分があれば本物のデータを表示させるような計算をブラウザがしてくれるのですが,
Flash からロードしたテキストファイルは,
なぜか差分があってもキャッシュを表示(ロード)してしまうことが多いようです。

ですから,
「data.txt」と,リクエストするのではなく,
「data.txt?time=1177562306765」
のように,本物のURLのあとに,いつも変わる適当な変数と値を引っ付けてリクエストしているのです。
すると,本当は同じ「data.txt」であっても,
URLが変わるので,ブラウザが過去のキャッシュを参照しなくなります。
本当は,「1970年からのミリ秒」なんていう数字を入れる必要はなく,
Math.random() などを使ってアクセスする度に違う数値を入れても良いですし何でも良いのですが,
この回答では,「1970年からのミリ秒」を入れてみる方法をとりました。

> 外部で簡単に書き換えられるようにする方法

と書かれているので,
頻繁に更新させる可能性があると思い,
キャッシュ参照防止策を入れたものを書かせていただいたわけです。



この回答の前半(===より上)は簡単でしょう。
とりあえず前半の方のスクリプトでも大丈夫だと思いますよ。

このご質問とはあまり関係がないことですが,
色々な状況を想定したり,実験検証すると,
本題とは全く関係のないエラー処理のようなものが増えて行くのです。

最初から自分で考えて作ると,
簡単なエラー処理を入れているだけに過ぎませんが。
後に書いた方のスクリプトを先に見ると,
「何じゃコレ~!?」
「ボタン機能を無効にして有効にするのだったら最初から何もしなくて良いじゃん?」
「なんで1970年が登場するの??」
「わっけわからん,脳みそバーン!」みたいな状態になりますよね。


こう言った処理が多くなるので,
他人が書いたプログラムはなかなかわからないものです。
「他人のプログラムを解析するより自分で作った方が早い!」ということにもなります。

このご質問とは関係なく色々な場合についてですが,
ヘルプや解説書から,
なるべくシンプルなサンプルを見つけて,
1単語1単語を理解して使っていくのが早道だと思います。
    • good
    • 0

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