プロが教える店舗&オフィスのセキュリティ対策術

as3 SharedObjectクラスを使用したムービースキップ
一度訪問したユーザーには途中からムービーを流したいのですが、
sharedObjectを使用するというところまではわかったのですが、
as2のサンプルが多く、なかなかas3での記事が見つからなかったので、
ご質問させていただきました。

Flashを始めたのがas3からで環境はCS5になります。
as2のコードを流用して実装するスキルもなく困っております。

具体的に教えていただけると幸いです。
よろしくお願いいたします。

A 回答 (2件)

> 途中からムービーを流したいのですが



実際は SharedObject よりも
その 「"途中"までのロード待ちをする部分」 が作成すべきものの大部分を占めるように思いますが。。。
(NowLoading...みたいなものをどうするかです。以下ではそのロード待ち部分の説明は省略します。)



例えば
「初回閲覧者」には
メインタイムラインの フレーム1 から順次閲覧してもらい
「一度訪問した閲覧者」には
フレーム31 から閲覧してもらうスクリプトの簡易例↓。


<フレーム1に書く例>
-------------------
//このタイムラインの再生を停止
this.stop();

//一度訪問したユーザーに見せる途中フレームを設定
var show_frm:uint = 31;

//SharedObject「numberOfTimes」を参照する変数「my_so」を作成
var my_so:SharedObject = SharedObject.getLocal("numberOfTimes");

//(試しにmy_so.data.numを出力)
trace(my_so.data.num);

//「numberOfTimes」に変数「num」が保存されていれば
if (my_so.data.num != undefined) {
//変数「num」に1を加算
my_so.data.num++;
//関数「waitLoaded」を毎フレーム時間実行するリスナーを登録
this.addEventListener(Event.ENTER_FRAME,waitLoaded);
//「numberOfTimes」に変数「num」が保存されていなければ
} else {
//変数「num」に1を代入
my_so.data.num = 1;
//このタイムラインの再生を開始
this.play();
}

//関数「waitLoaded」を定義 (↓簡易例)
function waitLoaded(e:Event):void {
//このタイムラインのロードが設定したフレームに達すれば
if (this.framesLoaded >= show_frm) {
//設定した途中フレームから再生開始
this.gotoAndPlay(show_frm);
//関数「waitLoaded」を毎フレーム時間実行するリスナーを削除
this.removeEventListener(Event.ENTER_FRAME,waitLoaded);
}
}
-------------------


「制御」→「ムービープレビュー」で閲覧してもらうとわかりやすいと思います。



◎上記AS 動作検証上の注意

例えば上記のファイルを
任意のフォルダに「AAA.fla」として作成したとします。
その場合
「AAA.fla」と同じフォルダに「AAA.swf」がパブリッシュされると思いますが,
「そのフォルダのそのAAA.swf」専用のSOLファイル(共有オブジェクトファイル)がPC内に保存されます。

つまり
「そのフォルダのそのAAA.swf」を見る限り
当たり前ですが1回目しか「初回閲覧者」になれないのです。
↑『「初回閲覧者」はどのように見えるか』 を検証するのは1回しかできないということ。

『「初回閲覧者」はどのように見えるか』 を何度も検証したい場合は
検証する都度「AAA.fla」の名前を変えて保存し直すのが楽です。

例えば「AAA1.fla」で保存し直すと
「AAA1.swf」 がパブリッシュされるため
それ専用のSOLファイルがPC内に保存されるので
「初回閲覧者」の状態に戻れるということです。
「as3 SharedObjectクラスを」の回答画像1
    • good
    • 0
この回答へのお礼

すいません、ご回答が遅くなりました!
ずっと検証してましてやっとめどが立ちそうです!

今、数時間たつとまた最初から見れるようにしたいと思っており、
試行錯誤しているところです。

それはまた別スレでにしたいと思います!!

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

お礼日時:2010/08/07 19:13

#1 です。



> 数時間たつとまた最初から見れるようにしたいと思っており、
> 試行錯誤しているところです。


試行錯誤することが一番良いと思います。
以下は 「ちなみに(大きなお世話)」 の参考まで。



#1で書いたスクリプトをベースにする場合
私だと次のように変更すると思います。↓


<フレーム1に書く例>
-------------------------
//このタイムラインの再生を停止
this.stop();

//時間内に訪問したユーザーに見せる途中フレームを設定
var show_frm:uint = 31;

//最初から見れるようになる経過時間を設定(ミリ秒)
// ↓1分の場合例
var passed_ms:uint = 1 * 60 * 1000;
// (↓3日の場合例)
//var passed_ms:uint = 3*24*60*60*1000;

//今現在の時刻オブジェクトを作成
var now_date:Date = new Date();

//1971年1月1日からの経過時間(ミリ秒)を取得
var now_time:uint = now_date.getTime();

//(試しに現在の絶対時刻を出力)
trace("1971年から今現在まで→" + now_time + "ミリ秒");

//SharedObject「visitTime」を参照する変数「my_so」を作成
var my_so:SharedObject = SharedObject.getLocal("visitTime");

//(試しにmy_so.data.numを出力)
trace("1971年から前回閲覧まで→" + my_so.data.num + "ミリ秒");

//「visitTime」の「num」からの経過時間がpassed_ms未満であれば
if (now_time - my_so.data.num < passed_ms) {
//関数「waitLoaded」を毎フレーム時間実行するリスナーを登録
this.addEventListener(Event.ENTER_FRAME,waitLoaded);
//それ以外は
} else {
//このタイムラインの再生を開始
this.play();
}

//「visitTime」の変数「num」にnow_timeの値を代入
my_so.data.num = now_time;

//関数「waitLoaded」を定義 (↓簡易例)
function waitLoaded(e:Event):void {
//このタイムラインのロードが設定したフレームに達すれば
if (this.framesLoaded >= show_frm) {
//設定した途中フレームから再生開始
this.gotoAndPlay(show_frm);
//関数「waitLoaded」を毎フレーム時間実行するリスナーを削除
this.removeEventListener(Event.ENTER_FRAME,waitLoaded);
}
}
-------------------------



上記スクリプト中の

//「visitTime」の「num」からの経過時間がpassed_ms未満であれば
if (now_time - my_so.data.num < passed_ms) {

の部分については 【下の図↓】をご参考に。



ちなみに#1の回答を見た時点で気付かれたかもしれませんが
SharedObject は ActionScript 2.0 も 3.0 も大差ありません。
ほぼ同じように使えば良いのです。
ここで使ったDateクラスも ActionScript 2.0 と 3.0 とで大差はなくほぼ同じです。

それ以外のロード待ちの部分などで
ActionScript 2.0 と 3.0 にかなり違いが出てきます。



時間経過を棒グラフでイメージした図↓
「as3 SharedObjectクラスを」の回答画像2
    • good
    • 0
この回答へのお礼

ご連絡遅くなりまして申しわけありません!

時間も設定できるんですね!
ありがとうございました!

お礼日時:2010/08/16 16:29

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