• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ActionScriptの基本的な部分で困っています。)

ActionScriptで日付によって画像を変更する方法

このQ&Aのポイント
  • ActionScriptを使用して指定の日付によって画像を変更する方法を教えてください。
  • 作成したFLASHの中で、日付が12日以前の場合は2フレーム目の画像を表示し、13日以降の場合は3フレーム目の画像を表示させたいです。
  • 現在、日付変更のスクリプトを記述したのですが、うまく動作していません。早めに回答いただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.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 を使うこともできます。 長くなってすみませんでした。 不明な点がありましたら、補足してください。

mikumari
質問者

お礼

とても親切な上、素早い回答ありがとうございます。 まさに、読み込む前に飛ばしていたのが原因だったみたいで、きちんと思った通りに動くようになりました。 FLASHがそういう性質だったとは知りませんでした。 お話もすべて参考になる物ばかりですごく為になりました。フレームラベル等もぜひ使ってみたいと思います。 あと、ローディング画面の%表示はできたので、今後プログレスバーにもチャレンジしてみようと思います。 本当に今回は助かりました。どうもありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

指定の番号のフレームに移動したい時は、  gotoAndPlay( 2 ); このように、番号を " " でくくらずに指定します。 " " でくくった時は、指定のフレームラベルが付いたフレームに移動するという意味になります。 番号に付いている、" " を削除してみてください。これで、直ると思います。 移動先のフレーム番号やフレームラベルが付いたフレームが見付からない時は、gotoAndPlay は正常に実行されません。 今回は” 2 ”や” 3 ”というラベルが付いたフレームはないため、gotoAndPlay での移動が失敗していて、dayCount の値に関係なく単に次のフレームに移動していただけ、ということです。 なお、要するに指定のフレームに移動して止まればいいのであれば、gotoAndPlay と stop ではなく、この2つのスクリプトの機能を併せ持つ gotoAndStop の方がオススメです。 稀に、移動先のフレームに stop が書いてあっても、gotoAndPlay で移動してきた時に勝手に先に進んでしまうこともあるようです。 スクリプトとしても、「指定のフレームに移動して、そこで止まる」という意味の gotoAndStop の方が、他人が見ても分かりやすいスクリプトになります。

mikumari
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • シーンに関してふたつ質問があります。

    はじめまして。 現在ActionScriptを勉強中なのですが、ここの掲示板を見てもわからない部分があった為質問させてください。 1、シーンの結合 一連の流れをわかりやすくするため、いくつかのシーンをわけて作業していました。 これらのシーンをひとつのフレームに繋げる事はできるのでしょうか? 例)「シーン1」の最終フレームの続きに「シーン2」、「シーン2」の最終フレームの続きに「シーン3」を繋げる。 いくつか試してみたのですが、多数のフレームを一度にコピペは出来ない上に、ひとつのフレームだけコピペしても1フレーム目から配置されてしまい最終フレームの後に持っていくのですべてやろうとすると手間がかかりすぎでした。 2、ActionScriptでのシーンの指定方法 ボタンで飛ばす方法の質問はあったので、それを見つつ試したのですができませんでした。 私がやろうとしている事は、ボタンが押されたら飛ばすのではなく、ActionScriptでイベント開催日からの残り日数を計算し、その残り日数に応じて指定したシーンに飛ばす。というものです。 同じタイムライン上の指定したフレームに飛ばす事はできたのですが、別のシーンに飛ばそうとすると止まってしまいます。 ボタンでないとシーンを指定して飛ばす事は出来ないのでしょうか? シーン1の最終フレームに以下のActionScriptを記述してあります。 ※main2などは、それぞれのシーンの1フレーム目にフレームラベルとして同一の物を書いてあります。 this.stop(); dtObj=new Date(); dd=dtObj.getDate(); eventDay=31; dayCount=eventDay-dd; if(dayCount>3){ gotoAndPlay( "シーン2".main2); } if(dayCount=3){ gotoAndPlay( "シーン3".main3); } if(dayCount=2){ gotoAndPlay( "シーン4".main4); } if(dayCount=1){ gotoAndPlay( "シーン5".main5); } よろしくお願いします。

    • ベストアンサー
    • Flash
  • FLASHのActionScriptについて

    すみません。どなたか教えてください。  風景の画像が時間が来たら、次の風景が移る様にしたいのです。 静止している様に見える"2"のフレームを2フレームにして、2フレーム目に gotoAndPlay("シーン 1", "02") を入れてループさせています。120秒後に"03"フレームに移動させるよう、隠しオブジェクトに以下のスクリプトを記入しました。 onClipEvent (load) { beforeTime = getTimer(); n = 0; } onClipEvent (enterFrame) { nowTime = getTimer(); n = n+nowTime-beforeTime; beforeTime = nowTime; if (n>120000) { gotoAndPlay("シーン 1", "03"); n = 0; } } しかし、初めのgotoが無視されたように、書き出してしまいます。ここを Stop() にするとずーととまったままです。何か方法はないのでしょうか?

  • ActionScript3.0 gotoAndPlay(currentFrame-1)が遅いのは何故?

    フレームを2つ用意し、2フレーム目に gotoAndPlay(currentFrame-1) と書くことで 1フレーム目をループさせる手法についてです。 ActionScript2.0では問題なく使えるのですが ActionScript3.0だと、1フレーム目が実行される速度が2.0の半分になってしまいました。 fpsを1にすると、1フレーム目に書いたtrace文が2秒に1回しか表示されません。 通常のフレーム移動はfps通りの速度が出ています。 gotoAndPlay(currentFrame-1) を gotoAndPlay(1) と書いても同じです。 これは3.0の仕様変更によるものなのでしょうか? 原因のわかる方おられましたら、ご教授お願いします。 WindowsXP(32ビット) FlashCS3

    • ベストアンサー
    • Flash
  • actionscript3.0について教えてください。

    actionscript3.0について教えてください。 Flash CS4で、マウスオーバーすると画像が表示するものを制作しました。 (全レイヤー、1フレーム目のみで制作していました) そして最近その以前制作したものの直前に別のムービーを入れることになり、 画像のように1フレーム目から4フレーム目まであけました。 そしてもともとあったフレームをすべて5フレーム目に移動しました。 すると、エラーが出るようになりました。 5フレーム目に移動するとエラーが出るようになってしまったので、 試しに2フレーム目、3フレーム目など試しましたが同じくエラーが出ました。 エラーの内容は TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 at test_fla::MainTimeline/frame5() です。 下記のスクリプトを上から二つ目のレイヤーに記述しています。 一番上のレイヤーには、stop();と記述しています。 超初心者のため説明不十分かもしれませんが、宜しくお願いいたします。 /*ボタン1 */ nav1txt_mc.visible = false; nav1_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover); function onMouseover(e:MouseEvent):void{ nav1txt_mc.visible = true; nav1txt_mc.gotoAndPlay("nav1txt_mc"); } nav1_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay); function nondisplay(e:MouseEvent):void{ nav1txt_mc.visible = false; } /*ボタン2*/ nav2txt_mc.visible = false; nav2_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover2); function onMouseover2(e:MouseEvent):void{ nav2txt_mc.visible = true; nav2txt_mc.gotoAndPlay("nav2txt_mc"); } nav2_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay2); function nondisplay2(e:MouseEvent):void{ nav2txt_mc.visible = false; } /*ボタン3*/ nav3txt_mc.visible = false; nav3_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover3); function onMouseover3(e:MouseEvent):void{ nav3txt_mc.visible = true; nav3txt_mc.gotoAndPlay("nav3txt_mc"); } nav3_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay3); function nondisplay3(e:MouseEvent):void{ nav3txt_mc.visible = false; } /*ボタン4*/ nav4txt_mc.visible = false; nav4_btn.addEventListener(MouseEvent.MOUSE_OVER,onMouseover4); function onMouseover4(e:MouseEvent):void{ nav4txt_mc.visible = true; nav4txt_mc.gotoAndPlay("nav4txt_mc"); } nav4_btn.addEventListener(MouseEvent.MOUSE_OUT,nondisplay4); function nondisplay4(e:MouseEvent):void{ nav4txt_mc.visible = false; } 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • FLASH での基本的なアクションについて教えてください

    ご教授お願いします。 Flash CS3を使用しております。 1フレーム目で停止し、そこで表示されているボタン(b1というインスタンス名)をクリックすると2フレーム以降が再生されるファイルを 作成しようとしていますが、うまくアクションさせることができません。ボタンはちゃんと機能していると思います。 現在、私が1フレーム目に入力しているアクションは下記のとおりです。 this.stop() function gotoAndPlay(2); b1.addEventListener(MouseEvent.CLICK,gotoAndPlay); どのあたりが不適切なのでしょうか? 以前にFlash5を使用したことがあり、その際はボタンへのアクションも選択するだけで簡単にできたのですが、CS3はやはり高機能だけにやや難解です。 詳しい方には、あまりに基本的な質問かもしれませんが 格闘すること数時間、先に進まず困っております。 どなたかご教授いただけますと、大変ありがたいのですが・・・。

  • suzukaのスクリプトで

    suzukaでFlashを制作しております。 プログラムはさっぱりなので検索して出てきたactionscriptを切り貼りして試している状況です。 その1.フレームアクションにおいて、キーを押したら特定のフレームまで移動するスクリプトを入れたいので20フレーム目に以下のスクリプトを入れたのですが、どちらも使えませんでした。具体的な解決策はありますでしょうか。 ●[parse error]とエラーが出る this.stop(); on(keyPress ("a")){ _root.gotoAndPlay(21); } ●キーを押しても何も起こらない this.stop(); if(Key.isDown(Key.RIGHT)){ _root.gotoAndPlay(21); } else if(Key.isDown(Key.LEFT)){ _root.gotoAndPlay(31); } その2.フレームアクションの10フレーム目に this.stop(); buttonA.onPress=function(){ _root.gotoAndPlay(11); }; とボタンのスクリプトを入れると、 どこのフレームまで移動しようが 同じボタンへの命令で上書きするまで このボタンへの効果が持続されてしまうのですが、 押した瞬間に後に命令を引き継がせないスクリプトの記述はありますか?

    • ベストアンサー
    • Flash
  • FLASHで日数カウントダウンの後、本日開催の画像を出したい。

    FLASH上で10月4日開催のイベントに向けて日数カウントダウンをし、当日になったときに「本日開催」の画像を出したいです。 //カウントダウン// this.stop(); dtObj=new Date(); mm=dtObj.getMonth()+1; dd=dtObj.getDate(); month7=31; month8=31; month9=30; eventDay=4; if(mm==7){ totalDay=eventDay+month7+month8+month9; } else if(mm==8){ totalDay=eventDay+month8+month9; } else if(mm==9){ totalDay=eventDay+month9; } else{ totalDay=eventDay; } _root.dayCount=totalDay-dd; //カウントが0になったら// if(_root.dayCount==0){ _root.gotoAndStop(_currentframe+1); } これなのですが、//カウントが0になったら//の部分がうまく動作しません。2フレーム目にテキストなどを直接入力すると上手く動作するのですが、画像を挿入すると動作しません。どなたかお詳しい方ご存知でしたらアドバイスいただけますでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • FLASH CS5でnow loadingでランダム再生を読み込みたい

    FLASH CS5でnow loadingでランダム再生を読み込みたい FLASH CS5で10枚の画像(表示されいるのは1枚で、左右に隣の画像が少し見える感じ)があり、その下に右、左のボタンがありを押していくと、画像が切り替わっていくアニメなのですが 開始のフレームをアクセスする度に変わるランダムにしたいです。(開始の画像が入るたびに変わる) そのためにnow loadingですべてを読み込ませてからスタートさせないとなのですが、 1フレーム目に以下のタグを入れました。 このやり方だと、エラーがでます。 //再生停止 stop(); //イベントリスナーを登録 //(毎フレーム時間で実行,実行関数 goRnandom) this.addEventListener(Event.ENTER_FRAME,goRnandom); //関数 goRnandom の定義 function goRnandom(evt:Event):void { //変数 per にロードされたパーセントを取得 var per:Number = this.loaderInfo.bytesLoaded / this.loaderInfo.bytesTotal * 100; // //もしロードパーセンテージが 100 に達すれば if (per >= 100) { //登録したイベントリスナーを削除 this.removeEventListener(Event.ENTER_FRAME, goRnandom); //変数 rnd_num に 0以上1未満 のランダムな数を代入 var rnd_num:Number = Math.random(); if (rnd_num < 10 / 100) { gotoAndPlay(2); } else if (rnd_num < 10/100) { gotoAndPlay(8); } else if (rnd_num < 10/100) { gotoAndPlay(14); } else if (rnd_num < 10/100) { gotoAndPlay(20); } else if (rnd_num < 10/100) { gotoAndPlay(26); } else if (rnd_num < 10/100) { gotoAndPlay(32); } else if (rnd_num < 10/100) { gotoAndPlay(38); } else if (rnd_num < 10/100) { gotoAndPlay(44); } else if (rnd_num < 10/100) { gotoAndPlay(50); } else { gotoAndPlay(57); } } } どこか間違っている箇所はあるのでしょうか? 教えてください。

    • ベストアンサー
    • Flash
  • 指定したフレームから再生できない(フラッシュ)

    あるフレームになって時点で指定したフレームに飛び、そこからフレームを再生させようとおもっています。 指定したフレームへ飛ぶ事ができるのですがそこからストップしてしまいます。 どうか打開策を教えて頂けないでしょうか? お願します。 あるクリプトに下記の内容のスクリプトが埋め込まれていてそこで指定したフレームに飛ぶようにしています。 onClipEvent(enterFrame){ _x -= 5; if(_x <= 10){ _root.gotoAndPlay("bbb",11); } if(_x <= -600){ _x = 600; } }

  • gotoAndPlayされないです

    はじめてFlashを作ります。 "ATTACK1"と"ATTACK2"のフレームを0.2秒の間隔で10回交互に表示したあと、 "ATTACK3"と"ATTACK4"のフレームをenterが押されるまで交互に表示する というプログラムを作りたいのですが、 "ATTACK1"と"ATTACK2"のフレームを交互にずっと表示されるだけで、 ATTACK3へ移動しません。 "ATTACK1"というラベルのフレームに以下のように書きました。 ActionScript2.0でやっています。 どこが悪いのか教えてください。お願いします。 ATTACK1フレームのActionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; if( count >= 10 ){ gotoAndPlay("ATTACK3"); count=0; delete this.onEnterFrame(); } gotoAndPlay("ATTACK2"); count=count+1; delete this.onEnterFrame(); } } }; ATTACK2フレームのAcctionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; gotoAndPlay("ATTACK1"); delete this.onEnterFrame(); } } };

    • ベストアンサー
    • Flash