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

はじめまして。
現在、指定の日にちがきたら画像の表示が変わるFLASHを作成しているのですが、思ったように動いてくれなくて困っています。

内容としては、
12日(日)がイベント日なので、13日以降は画像を変更したいのです。そこで、以下のように記述したのですが思ったように動いてくれません。

表示はされるのですが、日付変更スクリプトが動いていないようで、PCの日付を13日以降にして確認しても、2フレーム目の画像が表示されてしまいます。

━━━1フレーム目内容━━━

mytoday = new Date();
dayCount = mytoday.getDate();

if(dayCount<13){
gotoAndPlay("2");
}

if(dayCount>=13){
gotoAndPlay("3");
}

━━━━━━━━━━━━━

※2フレーム目に12日まで表示させる画像、3フレーム目に13日以降に表示させる画像を配置してあります。
また、2、3フレーム目には、それぞれstop();を記述してあります。

間に合うならば、今週末から使用したいので早めに回答をいただけると助かります。
どうぞよろしくお願い致します。

A 回答 (2件)

ネットで公開する場合は特に、画像を配置したムービーは読み込みに時間がかかります。


Flash はムービー全てが読み込まれていなくても、読み込みの済んだフレームから順次再生される特徴があります。
フレーム1のスクリプトでフレーム2または3に移動したいなら、この時点でフレーム2以降が全て読み込まれていなければなりません。
しかし、画像を配置したフレームはフレームごとの容量が大きくなるため、フレーム1が読み込まれ、スクリプトが実行された時点では、フレーム2以降の読み込みがまだ済んでいない可能性があります。
移動先のフレームや表示する画像が読み込まれていないと、スクリプトに誤りはなくても、フレームの移動や画像の表示は失敗してしまいます。
「ムービープレビュー」ではフレームや画像のデータが全て読み込まれている状態になっていますので、読み込み未完了によるトラブルは発見しにくいです。


一般的な対策として、ムービー全体の読み込みが済むまで待ち、読み込みが済んだ後でムービーを再生する方法があります。
ネットで公開されている Flash ムービーでは、最初に「 Now Loading 」とか「読み込み中 ○%」という表示が出てくることがあります。
これは、ムービー全体が読み込まれるまではこの表示を出しておき、読み込みが完了したらムービーの本編を再生させるという手法です。

----------------------------------------------

よくある完了率の凝った表示はさておき、Now Loading の簡単な作り方をご紹介しましょう。


まず、ムービーの最初にフレームを2つ追加します。
描画用のレイヤーとは別にスクリプト専用のレイヤーを作っておくと、管理がしやすくなります。
描画用レイヤーのフレーム1にキーフレームを作って、「 Now Loading ... 」といった文字など、読み込み中に表示したい絵を描き、これをフレーム2まで表示します。

スクリプト専用のレイヤーのフレーム1と2に空のキーフレームを作り、フレーム2に、次のようなスクリプトを書きます。

(↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)


 //読み込み完了率の算出
 loaded = _root.getBytesLoaded();
 total = _root.getBytesTotal();
 per = Math.floor( loaded / total * 100 );

 //100%になったら、日付に応じてフレームを移動
 if( per >= 100 )
 {
  //日付を取得
  mytoday = new Date();
  dayCount = mytoday.getDate();

  //13日より前ならフレーム3を表示
  if( dayCount < 13 )
  {
   gotoAndStop( 3 );
  }
  //13日以降はフレーム4を表示
  else
  {
   gotoAndStop( 4 );
  }
 }
 //読み込みが終わらないうちは終了を待つ
 else
 {
  gotoAndPlay( 1 );
 }


フレームに設定したスクリプトは、再生ヘッドがそのフレームに来た時に1度しか実行されません。
しかし、ムービーの読み込みがフレーム1から2に移動する間に完了することは、まずありえません。フレーム2に書いたスクリプトは、読み込みが終わるまで何度も実行させる必要があります。
再生ヘッドを何度もフレームにセットし直せば、フレームに書かれたスクリプトは実行されるのですが、Flash の仕様上、同じフレームに連続して再生ヘッドをセットすることはできないようになっています。
そこで、読み込みが終わるまではフレーム1とフレーム2の間をループさせ、フレーム2のスクリプトを繰り返し実行できるようにします。
一旦別のフレームに移動してフレーム2に戻ってくるのなら、再生ヘッドがフレーム2にセットし直され、その都度スクリプトも実行されるというわけです。


ムービーの読み込みが済んだかどうかを知るには、_framesloaded と _totalframes という情報(プロパティといいます)から、全フレーム数のうちどのフレームまで読み込まれたかを把握する方法と、ムービーの総容量(バイト数)と読み込まれた容量を把握して割合を出す方法があります。
どちらでもいいのですが、画像を配置しているなど容量の大きなフレームがあるムービーの時は、フレーム数よりも容量を把握する方がオススメです。
フレーム数で完了率を出すと、容量の大きなフレームを読み込んでいる時には完了率がなかなか更新されず、見ている人に、読み込みが失敗しているのでは・・・と思われてしまうかもしれません。
容量を把握していれば、どのフレームを読み込んでいても完了率が細かく変化し、読み込みの進捗状況が分かりやすくなります。

上記の例では、容量を把握する方法で読み込み完了を検出しています。
getBytesTotal でムービーの総容量、getBytesLoaded で読み込まれた容量を取得し、完了率を算出しています。Math.floor というアクションは、小数点以下を切り捨てて整数にするものです。
完了率が 100 %になったら、ムービー全体が読み込まれたということです。100 %に達した時点で、日付を取得して画像のあるフレームに移動し、達していなければフレーム1と2の間をループして読み込みの終了を待ちます。

なお、変数 per には完了率が%で入っています。
この値を使って、だんだん伸びていくプログレスバーを描画したり、ダイナミックテキストで表示して「読み込み中 ○%」といった表示を作ることができます。
表示の作り方は、今回は割愛させていただきます。
有名な手法ですので、あちこちの Flash 講座のサイトも取り上げられていますし、この OKweb ・教えて!goo でも何度か話題になっています。
興味がありましたら調べてみてください。


Now Loading の表示のためにフレームを2つ追加しましたので、画像のフレームは3と4に移動しています。
ムービーの制作中にフレームの番号が変わることは、よくあります。
gotoAndPlay や gotoAndStop の移動先をフレームの番号で指定すると、このような場合はスクリプトも直さなければなりません。
こんな時に便利なのが、#1でもちょっと書きました、フレームラベルという機能です。
フレームを選択した状態で、「プロパティ」パネルを見てください。左上の方に、<フレームラベル>と書かれた項目があるかと思います。
ここに何か名前を入力すると、そのフレームに名前が付きます。この名前のことをフレームラベルといいます。
フレームが移動した時も、フレームラベルはフレームとともに移動します。
フレームラベルは、gotoAndPlay や gotoAndStop の移動先として利用できます。フレームラベルで移動先を指定しておくと、フレームが移動した場合でもスクリプトを変更しなくても済みます。


ついでに、if 文のことですが。
if 文は、条件が不成立だった時に実行される else という句を付けることができます。
今回は、13 日より前だった時はフレーム3を、そうではない(つまり、13 日以降)の時はフレーム4を表示すればいいので、if を2つ並べずに else を使うこともできます。


長くなってすみませんでした。
不明な点がありましたら、補足してください。
    • good
    • 0
この回答へのお礼

とても親切な上、素早い回答ありがとうございます。

まさに、読み込む前に飛ばしていたのが原因だったみたいで、きちんと思った通りに動くようになりました。
FLASHがそういう性質だったとは知りませんでした。

お話もすべて参考になる物ばかりですごく為になりました。フレームラベル等もぜひ使ってみたいと思います。
あと、ローディング画面の%表示はできたので、今後プログレスバーにもチャレンジしてみようと思います。

本当に今回は助かりました。どうもありがとうございました!

お礼日時:2005/06/10 20:07

指定の番号のフレームに移動したい時は、



 gotoAndPlay( 2 );

このように、番号を " " でくくらずに指定します。
" " でくくった時は、指定のフレームラベルが付いたフレームに移動するという意味になります。


番号に付いている、" " を削除してみてください。これで、直ると思います。
移動先のフレーム番号やフレームラベルが付いたフレームが見付からない時は、gotoAndPlay は正常に実行されません。
今回は” 2 ”や” 3 ”というラベルが付いたフレームはないため、gotoAndPlay での移動が失敗していて、dayCount の値に関係なく単に次のフレームに移動していただけ、ということです。


なお、要するに指定のフレームに移動して止まればいいのであれば、gotoAndPlay と stop ではなく、この2つのスクリプトの機能を併せ持つ gotoAndStop の方がオススメです。
稀に、移動先のフレームに stop が書いてあっても、gotoAndPlay で移動してきた時に勝手に先に進んでしまうこともあるようです。
スクリプトとしても、「指定のフレームに移動して、そこで止まる」という意味の gotoAndStop の方が、他人が見ても分かりやすいスクリプトになります。
    • good
    • 0
この回答へのお礼

さっそくのお返事ありがとうございます。
ご指摘の通り「" "」を削除する事で、無事スクリプトは動きました。

gotoAndStopも参考になりました。
今後はこちらを使いたいと思います。


ところが、ここで新たな問題が発生してしまいました。
書き出したswfファイルを実行すると正常に動くのですが、一緒に書き出されたhtmlの方で実行すると、何も表示されないのです。

そこで、試しに1フレーム目に四角い図を描いて配置し書き出してみたところ、
htmlで見ると、その四角い画像のみが表示される状態になります。
という事は、htmlから見るとスクリプトが正常に処理されていないという事になると思います。

これで、四角い図すら表示されないなら、ファイル名の指定間違い等考えられるのですが、そういう訳ではないらしく原因がさっぱりつかめません。

下記のスクリプトで、まだ何処かおかしな所があるのでしょうか。
よろしければご返答お願い致します。


━━━1フレーム目内容━━━

mytoday = new Date();
dayCount = mytoday.getDate();

if(dayCount<13){
gotoAndStop(2);
}

if(dayCount>=13){
gotoAndStop(3);
}

━━━━━━━━━━━━━

※2、3フレーム目に配置してあった「stop();」は1フレーム目を「gotoAndStop」にした為、削除しました。

どうぞよろしくお願いします。

OS:Windows2000
Ver:FlashMXPro2004

お礼日時:2005/06/10 13:48

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