- ベストアンサー
as3 SharedObjectクラスを使用したムービースキップ
as3 SharedObjectクラスを使用したムービースキップ 一度訪問したユーザーには途中からムービーを流したいのですが、 sharedObjectを使用するというところまではわかったのですが、 as2のサンプルが多く、なかなかas3での記事が見つからなかったので、 ご質問させていただきました。 Flashを始めたのがas3からで環境はCS5になります。 as2のコードを流用して実装するスキルもなく困っております。 具体的に教えていただけると幸いです。 よろしくお願いいたします。
- みんなの回答 (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内に保存されるので 「初回閲覧者」の状態に戻れるということです。
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#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 にかなり違いが出てきます。 時間経過を棒グラフでイメージした図↓
お礼
ご連絡遅くなりまして申しわけありません! 時間も設定できるんですね! ありがとうございました!
お礼
すいません、ご回答が遅くなりました! ずっと検証してましてやっとめどが立ちそうです! 今、数時間たつとまた最初から見れるようにしたいと思っており、 試行錯誤しているところです。 それはまた別スレでにしたいと思います!! ありがとうございました!