
FLASH初心者です。わかりにくい説明かもしれませんが、よろしくお願いいたします。
http://oshiete1.goo.ne.jp/qa1192628.html
こちらのページを参考にさせていただき、FLASHでカウンターを作成しました。
2010年1月16日をイベント日として、残り日数を表示させたいのですが、自分が作成したカウンターに表示される日数が正確なものではないようです。
自分でいろいろ試してみたのですが、2009年4月30日までは、正確に表示されるのですが、5月1日以降になると残日数がいきなり増えてしまいます。
下記に自分が作りました、カウンターのスクリプトを記しますので、間違いがありましたらご教示いただけますようお願いいたします。
//現在の日付および時刻を取得
yy = date_obj.getFullYear();
mm = date_obj.getMonth();
dd = date_obj.getDate();
hour = date_obj.getHours();
min = date_obj.getMinutes();
sec = date_obj.getSeconds();
//1970年1月1日からイベントまでの時間をミリ秒で取得
eventUTC = Date.UTC( 2009 , 1 - 1 , 16 , 17 , 30 , 0 );
//1970年1月1日から今日までの時間をミリ秒で取得
todayUTC = Date.UTC( yy , mm , dd , hour , min , sec );
//画像で数字を表示できるようにする
with( _root.display_clip )
{
/*日数を2桁で表示*/
//100の位の算出と表示
temp = Math.floor( _root.display_clip.event_date / 100 );
ddd.gotoAndStop( temp + 1 );
//10の位の算出と表示
temp = Math.floor( _root.display_clip.event_date / 10 );
dd.gotoAndStop( temp + 1 );
//1の位の算出と表示
d.gotoAndStop( ( _root.display_clip.event_date % 10 ) + 1 );
必要部分かと思う箇所だけ掲載しました。自分で修正した部分は、イベント日や日数を3桁表示にするという部分などです。
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
絶対時刻(ミリ秒)の取得方法が少々回りくどいですが,
それはそれとして良しとするなら間違いはないと思います。
問題なく取得できると思います。
> 2009年4月30日までは、正確に表示されるのですが、
> 5月1日以降になると残日数がいきなり増えてしまいます。
それは約 100 日を超えるからでしょう。
3桁表示に突入するということです。
つまり時刻取得部分ではなく,
ムービークリップのすすめ方に問題があるのでしょう。
_root.display_clip.event_date には残り日数のみがちゃんと取得できているものとして,
そこにたまたま入った値が仮に 245 (整数)であったとします。
----------------------------------------------
//100の位の算出と表示
temp = Math.floor( 245 / 100 ); //→temp = 2
ddd.gotoAndStop( temp + 1 ); //→ddd.gotoAndStop(3)
//10の位の算出と表示
temp = Math.floor( 245 / 10 ); //→temp = 24
dd.gotoAndStop( temp + 1 ); //→ddd.gotoAndStop(25)
//1の位の算出と表示
d.gotoAndStop( ( 245 % 10 ) + 1 ); //→ddd.gotoAndStop(6)
----------------------------------------------
「10の位の算出と表示」がおかしいですね。
仮に残り日数が 245 (整数)であったとして,
この 245 から, 2 だけ 4 だけ 5 だけを取りだすのに数学(というかややこしい算数)を使う方法もありまが,
ここは,数 ではなく 文字列 として取りだすと簡単になると思います。
"245" を文字列だと思って,
一番右の文字を取りだして,2番目の文字を取りだして,3番目の文字を取りだす。
ということです。
具体的に書くと,
ムービークリップのフレームを進める部分のスクリプトは次のようにすると良いと思います。
(ただし _root.display_clip.event_date には整数が入っていること。)
-----------------------------------------------
//100の位の算出と表示
temp = ("00"+_root.display_clip.event_date).substr(-3, 1);
ddd.gotoAndStop(Number(temp)+1);
//10の位の算出と表示
temp = ("00"+_root.display_clip.event_date).substr(-2, 1);
dd.gotoAndStop(Number(temp)+1);
//1の位の算出と表示
temp = ("00"+_root.display_clip.event_date).substr(-1, 1);
d.gotoAndStop(Number(temp)+1);
-----------------------------------------------
"00" を付けているのは,たとえば
_root.display_clip.event_dateが 5 であった場合()内を "005",
_root.display_clip.event_dateが 69 であった場合()内を "0069"
などにするためです。
こうしておいて,
.substr(-3, 1); では その文字列の右から3文字目から1文字を取得します。
.substr(-2, 1); では その文字列の右から2文字目から1文字を取得します。
.substr(-1, 1); では その文字列の右から1文字目から1文字を取得します。
_root.display_clip.event_dateが 5 であった場合は,
()内は "005" になるのですから,
.substr(-3, 1); では "005" 右から3文字目から1文字→ "0"
.substr(-2, 1); では "005" 右から2文字目から1文字→ "0"
.substr(-1, 1); では "005" 右から1文字目から1文字→ "5"
がそれぞれ取得できます。
_root.display_clip.event_dateが 69 であった場合は,
()内は "0069" になるのですから,
.substr(-3, 1); では "0069" 右から3文字目から1文字→ "0"
.substr(-2, 1); では "0069" 右から2文字目から1文字→ "6"
.substr(-1, 1); では "0069" 右から1文字目から1文字→ "9"
がそれぞれ取得できます。
_root.display_clip.event_dateが 245 であった場合は,
()内は "000245" になるのですから,
.substr(-3, 1); では "000245" 右から3文字目から1文字→ "2"
.substr(-2, 1); では "000245" 右から2文字目から1文字→ "4"
.substr(-1, 1); では "000245" 右から1文字目から1文字→ "5"
がそれぞれ取得できます。
丁寧に詳しくご説明くださり有難うございました。
BlurFiltan様の書いてくださったスクリプトをコピペさせていただき、書き換えましたところ、正確に日数を表示させることができました。
まだFLASHをはじめたばかり。まして独学なので、詳しい方の真似からはじめ、少しずつ勉強させていただいている状態です。
詳しくご説明していただけたことに、大変感謝いたします。
このスクリプトを参考にさせていただいて、今後も勉強に励みたいと思います。
また質問をさせていただくと思いますが、その時はどうぞよろしくお願いいたします。
No.4
- 回答日時:
No1です。
書いた答えは的外れでした。大変失礼を・・。BlurFiltanさんが動作を修正して下さっていますので、置き換える部分だけ示しますね。
---------------------(以下、ソースの置換部分)----------
//Date オブジェクトを生成
date_obj = new Date();
(中略)
//1970年1月1日から今日までの時間をミリ秒で取得
todayUTC = Date.UTC( yy , mm , dd , hour , min , sec );
私の説明不足で申し訳ありませんでした。
「Date.UTCは推奨されていません」と教えていただき、大変参考になりました。簡単なことかもしれませんが、このようなこともまだわからないので、とても勉強になりました。
有難うございました。
ソースの置換部分を修正しましたが、下記エラーがでてしまいました。
----------------------------------------------------
**エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 9:演算子 '=' は、オペランドの前に来る必要があります。
String[] ids = TimeZone.getAvailableIDs(9 * 60 * 60 * 1000);
**エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 15:シンタックスエラー
SimpleTimeZone pdt = new SimpleTimeZone(9 * 60 * 60 * 1000, ids[0]);
**エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 18:シンタックスエラー
Calendar calendarE = new GregorianCalendar(pdt);
ActionScript エラー数 :3 報告済みエラー :3
----------------------------------------------------
エラーの意味もわかっていないので、置換前のままにしてありますが、まずは自分でがんばって調べてみようと思います。
自力ではカウントダウンの表示方法を直すことができず、こちらに投稿させていただきましたが、本当に助かりました。
「どうしてこんなエラーがでるの」と伺いたいのですが、そこまでお世話になれないと思うので、ここで質問を締め切らせていただきます。
また質問させていただくと思いますが、どうぞよろしくお願いいたします。
No.2
- 回答日時:
おもいきり蛇足ですが・・Date.UTCは推奨されていません、と怒られましたので、手直ししてみました。
// get the supported ids for GMT+09:00 (Japanese Standard Time)
String[] ids = TimeZone.getAvailableIDs(9 * 60 * 60 * 1000);
// if no ids were returned, something is wrong. get out.
if (ids.length == 0){
System.exit(0);
}
// create a Pacific Standard Time time zone
SimpleTimeZone pdt = new SimpleTimeZone(9 * 60 * 60 * 1000, ids[0]);
// create a GregorianCalendar with the Pacific Daylight time zone
// and the current date and time
Calendar calendarE = new GregorianCalendar(pdt);
todayUTC = calendarE.getTime().getTime();
calendarE.set( 2010 , 1 - 1 , 16 , 17 , 30 , 0 );
eventUTC = calendarE.getTime().getTime();
この回答への補足
先ほどの続きなのですが、自分が今回作成したカウンターで、使わせていただいたスクリプトを記します。
//ダミーのムービークリップを作る
_root.createEmptyMovieClip( "date_cnt" , 0 );
//イベントまでの日数を秒単位で計算
date_cnt.onEnterFrame = function()
{
//Date オブジェクトを生成
date_obj = new Date();
//現在の日付および時刻を取得
yy = date_obj.getFullYear();
mm = date_obj.getMonth();
dd = date_obj.getDate();
hour = date_obj.getHours();
min = date_obj.getMinutes();
sec = date_obj.getSeconds();
//1970年1月1日からイベントまでの時間をミリ秒で取得
eventUTC = Date.UTC( 2009 , 5 - 1 , 2 , 9 , 30 , 0 );
//1970年1月1日から今日までの時間をミリ秒で取得
todayUTC = Date.UTC( yy , mm , dd , hour , min , sec );
//画像で数字を表示できるようにする
with( _root.display_clip )
{
/*日数を2桁で表示*/
//100の位の算出と表示
temp = Math.floor( _root.display_clip.event_date / 100 );
ddd.gotoAndStop( temp + 1 );
//10の位の算出と表示
temp = Math.floor( _root.display_clip.event_date / 10 );
dd.gotoAndStop( temp + 1 );
//1の位の算出と表示
d.gotoAndStop( ( _root.display_clip.event_date % 10 ) + 1 );
/*時間を2桁で表示*/
//10の位の算出と表示
temp = Math.floor( _root.display_clip.event_hour / 10 );
hh.gotoAndStop( temp + 1 );
//1の位の算出と表示
h.gotoAndStop( ( _root.display_clip.event_hour % 10 ) + 1 );
/*分を2桁で表示*/
//10の位の算出と表示
temp = Math.floor( _root.display_clip.event_min / 10 );
mm.gotoAndStop( temp + 1 );
//1の位の算出と表示
m.gotoAndStop( ( _root.display_clip.event_min % 10 ) + 1 );
/*秒を2桁で表示*/
//10の位の算出と表示
temp = Math.floor( _root.display_clip.event_sec / 10 );
ss.gotoAndStop( temp + 1 );
//1の位の算出と表示
s.gotoAndStop( ( _root.display_clip.event_sec % 10 ) + 1 );
}
//イベント当日または終了のチェック
if( ( eventUTC - todayUTC ) <= 0 )
{
//「終了のお知らせ」を表示し、日数カウント用のムービークリップを削除する
_root.display_clip.gotoAndStop( 2 );
removeMovieClip( _root.date_cnt );
}
//イベントまでの時間を秒単位に直す
remain = eventUTC - todayUTC;
_root.display_clip.event_date = Math.floor( remain / 86400 / 1000 );
remain -= _root.display_clip.event_date * 86400 * 1000;
_root.display_clip.event_hour = Math.floor( remain / 3600 / 1000 );
remain -= _root.display_clip.event_hour * 3600 * 1000;
_root.display_clip.event_min = Math.floor( remain / 60 / 1000 );
_root.display_clip.event_sec = Math.floor(( remain - _root.display_clip.event_min * 60 * 1000 ) / 1000 );
};
手直しをしてくださり、お手間をかけて申し訳ありませんでした。
ありがとうございます。
このカウンターが初めてFLASHで作成したもので、他の方のご質問のご回答を参考にさせていただいていました。
せっかく手直しをしてくださったのに、どこにこのスクリプトを入れてよいのかわからなく、申し訳なく思っております。
以下、長くなってしまいますので、内容をわけさせていただきます。
No.1
- 回答日時:
>eventUTC = Date.UTC( 2009 , 1 - 1 , 16 , 17 , 30 , 0 );
イベント日は2010年では?
eventUTC = Date.UTC( 2010 , 1 - 1 , 16 , 17 , 30 , 0 );
が正しくありませんか?
2010/1/16 17:30までだとこんな計算結果になるのですが。
2009/4/29 0:0:0 = 22699800000remain 262日17時間30分0秒
2009/4/30 0:0:0 = 22613400000remain 261日17時間30分0秒
2009/5/1 0:0:0 = 22527000000remain 260日17時間30分0秒
2009/5/2 0:0:0 = 22440600000remain 259日17時間30分0秒
2009/5/3 0:0:0 = 22354200000remain 258日17時間30分0秒
2009/5/4 0:0:0 = 22267800000remain 257日17時間30分0秒
この回答への補足
大変申し訳ありません。
ご回答くださいました「回答番号:No.2」のお礼の続きになります。
今回自分が使用させていただきました、スクリプトの参考ページには、日数の表示が2桁になっており、3桁表示をさせようと自分でかまってしまいました。
これが間違っていたようで、
eventUTC = Date.UTC( 2009 , 5 - 1 , 1 , 17 , 30 , 0 );
イベント日を2009年5月1日にすると、残99日になるのですが、
5月2日にすると、残190日になってしまい、2桁目の0が表示されていないようです。
そのために、正確な残日数が表示できていないのかと思ったのですが、上記のスクリプト内で、どこを修正してよいのかわかっていません。
勉強不足を十分感じております。
お手間をおかけしますが、再度ご教示いただけますようお願いいたします。
ご指摘ありがとうございました。
自分でいろいろかまっている内に、
>eventUTC = Date.UTC( 2009 , 1 - 1 , 16 , 17 , 30 , 0 );
この部分を直すことを忘れてしまっていました。
ご回答くださった内容を参考にし、もう一度試してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
potplayerについて質問です
-
chrome flash
-
FLASHの再生はできないのでしょ...
-
uwscでExcelに自動記入
-
PHPの変数をAS3に渡す方法
-
FLASHでゲームを作っていた人は...
-
この曲はなんでしょう?
-
laptop go2からの買い替え、lap...
-
スクリップト
-
私のコンピューター上のファイ...
-
arduino プログラムについて
-
フラッシュゲームアーカイブ2
-
ウェブサイトで Flash が事実上...
-
Flashコンテンツを使ったWebサイト
-
Flash Playerのサポートが終了
-
Form内のselectを連動させるに...
-
Flashをブロックしないで
-
ダウンロードしたデジブックはa...
-
ad or script について
-
Flashplayerの運用について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XMLの&が&に変換されない
-
ランダムに4桁の数字を表示する...
-
ver8 でのsuccess
-
AS3 時計のコロンの点滅を0.5s...
-
VBAユーザーホームテキストボッ...
-
変数に256文字以上のテキストを...
-
VB6.0で、フォームから、別のフ...
-
四乗根を英語で言うと・・・
-
photoshopで書いた四角の枠の中...
-
python ボタンを押すと複数の関...
-
テキストボックスの中身をリセ...
-
【VB.NET】別Formのボタンが押...
-
マウス自体の移動量の取得
-
VBAで改行の入ったデータの正規...
-
UWSCのBTN関数について。
-
テキストボックスにセルの値を...
-
FLASHで脱出ゲームを作る時の、...
-
テキストエリア内の文字列にリ...
-
VBScriptでMsgBoxのYesNoボック...
-
arduino プログラムについて
おすすめ情報