(BACK)

共有オブジェクト

07/3/23 加筆,修正
Flashを見た側のハードディスクにデータを保存させるには、共有オブジェクト(Shared Object:シェアードオブジェクト)を利用する。
いわゆるセーブ機能である。

1.共有オブジェクトの作成
まず、共有オブジェクトを作成する。
共有オブジェクト名 = SharedObject.getLocal(識別名の文字列);

例)
so = SharedObject.getLocal("data");
これにより、指定した名前で共有オブジェクトを作成する。
すでに同じ内容の共有オブジェクトで保存された内容がハードディスクに有る場合は、それを読めるようにする。
これはあくまで準備であり、この段階では何も起こらない。

識別名とは、ハードディスクに保存する際につける名前のようなものである。
そのFlashの名前のようなものをつけておけばよい。

スプライトなどと同じく、共有オブジェクトも、作った場所に作成される。
_rootで作成したのであれば、正しくは _root.so という共有オブジェクト名になる。スプライトの中から使う場合には注意する必要がある。

実行したswfファイルのアドレス(フルパス)と、識別名がそれぞれ完全に同じである場合のみ、以前に保存した内容を使うことが出来る。
http://〜/black.swfというファイルから、dataという識別名で
共有オブジェクトを作成した。

この内容を次の機会に再び使うには、同様に

http://〜/black.swfというファイルから、dataという識別名で
共有オブジェクトを作成する必要がある。
swfファイルのファイル名を変えたり、場所を変えたり、識別名を変えたりすると、以前保存した内容は使えなくなる。(これは解決できる…後述)

2.共有オブジェクトの操作
共有オブジェクトを作成すると、以下のような変数を使うことが出来るようになる。
共有オブジェクト名.data.変数名
この形式の全ての変数の内容が、自動的に保存される

変数名は、普通の変数のように自由に名前をつけて使うことが出来る。
例えば、
so = SharedObject.getLocal("yeah");

so.data.count = 1; 
so.data.name = "Nagisa";
このような感じで、共有オブジェクトの中のcountという変数に1を代入し、nameという変数に"Nagisa"を代入する。
この内容は、以後、同じ名前のswfファイルから同じ識別名"yeah"で共有オブジェクトを作れば読み出すことが出来る。

他の場所(ターゲット)に作った共有オブジェクトを使う場合は、スプライトなどと同じように、ターゲットをつけて書く。
so.data.hensu //この共有オブジェクトは_rootに作ったので
_root.so.data.hensu //厳密にはこの名前になる

実際に共有オブジェクトの内容がハードディスクに保存されるのは、主にFlashの再生が終了した時である。
自動的に行われ、滅多に失敗するような事でもないが、確実に保存させたい場合は、flushという命令を使う。
//共有オブジェクトの内容を今すぐに保存する
共有オブジェクト名.flush();



さて、初めて共有オブジェクトを作った場合、その中には何も変数が存在しない。
この事は一番最初に共有オブジェクトの中の変数を扱う時に重要である。

例えば「再生回数」という意味でcountという変数を扱うとする。
so = SharedObject.getLocal("yeah");

count = so.data.count;
count++;
so.data.count = count;

txt = count + "回目";
共有オブジェクトの中から数を取り出して、1を足して、再び共有オブジェクトに戻している。
とりあえずこれは正しく動くのだが、初回の動作ではso.data.countが存在しないので、countには何も入らない。
しかし次に1を足すという事は数値変数であると解釈され、countは0になってから1が足されることになる。

この動作が何となく気持ち悪い場合は、変数が存在するかを調べればよい。
これにはundefined(アンデファインド)という言葉を利用する。
これは文字列ではなく、trueやfalseと同様に意味を持つ言葉であり、「存在しない」という意味を持つ。

これを利用して、まだ変数が存在しない場合は、まず1を代入するという仕組みを作る。
so = SharedObject.getLocal("yeah");

if (so.data.count == undefined){
	so.data.count = 1;
	count = 1;
} else {
	count = so.data.count;
	count++;
	so.data.count = count;
}
txt = count + "回目";

これは、共有オブジェクトの中の変数が最初に持っているべき値が、0や""(空の文字列)でない場合には必要な処理である。

3.共有オブジェクトの消去
共有オブジェクトの中の、1つの変数を消したい場合は、以下のようにする。
ハードディスクに保存された内容に反映されるのは、次に共有オブジェクトが保存された時である。
delete 共有オブジェクト名.data.変数名;

共有オブジェクトをまとめて消したい場合は、以下のようにする。
ハードディスクに保存された内容に反映されるのは、次に共有オブジェクトが保存された時である。
共有オブジェクト名.clear();

4.共有オブジェクトの共有
先述した通り、以前に保存した内容を使うには、swfファイルのアドレスが同じであり、識別名が同じである必要がある。

複数のswfファイルで同じ内容を使いたいなど、保存した内容を共有するには以下のように定義する。
共有オブジェクト名 = SharedObject.getLocal(識別名の文字列,"/");

例)
so = SharedObject.getLocal("data","/");
(もっと細かい設定も可能だが割愛する)
これにより、swfファイルのドメインが同じであり、識別名が同じである限り、どのswfファイルからでも同じ共有オブジェクトの内容を使うことが出来る。
全く違うswfファイル同士でも共有出来てしまうので、識別名が重複しないように充分に注意する必要がある。
//以下はドメイン(青字部分)が同じなので、
//識別名が同じであれば、どのFlashからでも同じ共有オブジェクトを扱える
http://black.and.white.com/top.swf
http://black.and.white.com/flash/marble.swf
http://black.and.white.com/flash/rainbow.swf
http://black.and.white.com/game/punch.swf
http://black.and.white.com/game/kick.swf

//ドメインが変わってしまうと駄目
http://white.and.black.com/top.swf

5.共有オブジェクトの保存場所
共有オブジェクトは、恐らくハードディスクの以下の場所に保存されている。
自発的に消去したい場合は、フォルダごと消せばよい。
XP/2000の場合
\Documents and Settings\ユーザー名\Application Data\Macromedia\Flash Player
95/98の場合
\WINDOWS\Application Data\Macromedia\Flash Player
Macの場合
Macintosh HD/Users/ユーザー名/Library/Preferences/Macromedia/FlashPlayer

6.練習問題
再生した回数を「n回目の表示です」と表示するFlashを作れ。
ただし、初回の場合は「初めての表示です」と表示する。

↑が簡単すぎる場合は、さらに「前回表示した時間」もあらかじめ保存しておき、表示せよ。

by D4U