• ベストアンサー

デジタル時計のプログラムについて

はじめまして。 FLASH初心者で、参考書片手に勉強しております。 デジタル時計をホームページに載せたいと思いまして、作ってみたのですが、プレビューで確認しても実際サーバーにアップロードしてみても文字が表示されなく困っております。 dispTimeというダイナミックテキストに時刻を表示させたく、アクションのレイヤーに以下を記述してみました。 _root.dispTime.onEnterFrame = function(){ now_date = new Date(); h = now_date.getHours(); m = now_date.getMinutes(); s = now_date.getSeconds(); _root.dispTime = h + ":" + m+ ":" +s; }; 環境は、WinXP home SP2、FLASH8です。間違っていそうな箇所がありましたら、ご教授宜しく御願い致します。

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.6

○○.onEnterFrame = function(){ }; は,ムービークリップクラス(ムービークリップオブジェクトに対する)イベントハンドラメソッドです。 したがって ○○ はムービークリップであるべきです。 _root も 広義の ムービークリップなので,他のものとかぶりさえしなければ, _root.onEnterFrame = function(){ }; でも this.onEnterFrame = function(){ }; でもかまいません。 次に _root.dispTime の dispTime が何者であるかが問題です。 dispTime がダイナミックテキストに付けた "インスタンス名" であるとするならば, その dispTime の text プロパティに何か値を代入するという意味で, _root.dispTime.text = h + ":" + m+ ":" +s; にしなければなりません。 インスタンスは様々なプロパティのかたまりですから, _root.dispTime = ○○; のように書いても, その dispTimeインスタンス の何を ○○ にするのかわかりません。 dispTimeインスタンスの x座標プロパティ を ○○ にしたいのであれば, _root.dispTime._x = ○○; dispTimeインスタンスの 横幅プロパティ を ○○ にしたいのであれば, _root.dispTime._width = ○○; などなど,何かプロパティを指示する必要があります。 つまり, dispTimeインスタンスの 表示テキストプロパティ を ○○ にしたいのであれば, _root.dispTime.text = ○○; とする必要がありますということです。 全文を通すと次のようになります。 _root.onEnterFrame = function(){ now_date = new Date(); h = now_date.getHours(); m = now_date.getMinutes(); s = now_date.getSeconds(); _root.dispTime.text = h + ":" + m+ ":" +s; }; あと, 厳密な話で,話がややこしくなるため,あまり書きたくはないのですが, onEnterFrame はそれを定義したフレームでは実行されません。 onEnterFrame を定義した次のフレームに入るとき(フレームにエンターするとき)以降にずっと実行されます。 パッと見た瞬間から実行させたい場合は, 次のようにする必要があります。 _root.onEnterFrame = function() { now_date = new Date(); h = now_date.getHours(); m = now_date.getMinutes(); s = now_date.getSeconds(); _root.dispTime.text = h+":"+m+":"+s; }; // _root.onEnterFrame をこのフレームでも即実行 _root.onEnterFrame(); 気にならないようでしたら, 今ここ↑で書いた 即実行 の件はあまり考えなくて良いと思います。 ========================= なお, テキストフィールドに変数名を付けることはできますが, Flash MX 以上 で,FlashPlayer6 以上用の SWF をパブリッシュする際は非推奨事項になっています。 「テキストフィールドのインスタンス名と変数名について」 http://livedocs.adobe.com/flash/8_jp/main/00001418.html つまり簡単に言えば, テキストフィールドに変数名を付けるのは Flash 5 までの古い方法で, 一般的に今現在,ギリギリ現存する使用しなければならない状況で言えば, FlashLite1.0 もしくは 1.1 用の SWF(FlashPlayer4レベル)をパブリッシュするときくらいです。 紛らわしいので使わない方が良いです。 さらになお, FlashPlayer7以上用の SWF をパブリッシュするときは, 大文字小文字の区別が厳格にされます。 たとえば This と this は別物として扱われますので要注意です。

cory1379
質問者

お礼

ご回答ありがとうございます。 アドバイス通りのアクションスクリプトで無事デジタル時計が機能し、文字もしっかり見えました!! ご指摘の >dispTimeインスタンスの 表示テキストプロパティ を ○○ にしたいのであれば, >_root.dispTime.text = ○○; >とする必要がありますということです。 この箇所が自分の中でよく分からないままでいました。 確かに、インスタンスの何をどうするのかを明確に指示すべきであると改めて感じました。 後半の「テキストフィールドに変数名を付ける」が非推奨は、参考のサイトを読んでみましたが、正しく意図を理解できたかはちょっと不安でした。 今回でいう所の _root.dispTime.text = h+":"+m+":"+s; をvarから始まる形に変えるべきなのでしょうか。 とりあえず、本題の疑問は解消できましたので、満足しております。 どうもありがとうございました。

その他の回答 (6)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.7

#6 です。 > _root.dispTime.text = h+":"+m+":"+s; > をvarから始まる形に変えるべきなのでしょうか。 それはしようにもできないでしょう。 var はその階層内で変数やオブジェクトを宣言するときに使う物です。 あえてするとするなら,あまり意味はありませんが, var dispTime:TextField; のようにテキストフィールド を テキストフィールドインスタンス として _root に宣言する場合でしょうか。 しかし,現物のテキストフィールドは手動で作成してあるのであまり使いません。 使うべきなのは(使うべきものでもありませんが,ActionScript2.0 に忠実に従った場合使うとするなら), テキストフィールド の部分ではなくて,その前の now_date h や m や s だと思います。 now_date h m s は全体を通すと何のことかわかりますが,単独では何のことやらわかりません。 凝りたいとするなら,ここまでするかもしれません(あまりここまではしません)。 var dispTime:TextField; _root.onEnterFrame = function():Void { var now_date:Date = new Date(); var h:Number = now_date.getHours(); var m:Number = now_date.getMinutes(); var s:Number = now_date.getSeconds(); _root.dispTime.text = String(h)+":"+String(m)+":"+String(s); }; _root.onEnterFrame();

cory1379
質問者

お礼

最後の疑問も丁寧にご解説下さいまして、ありがとうございました。 厳密にすると咀嚼するのに時間がかかりますが、原理が分かればよりすっきりします。 初歩的な疑問も多々ありましたが、無事理解できました。

回答No.5

#1,2です。 デバイスフォントを使わずに、 アウトラインフォントを使えば表示できることがある様です。 もし外部フォントを使っているなら試してみてください。

cory1379
質問者

お礼

何度もアドバイスありがとうございます。 ダイナミックテキストのフォントを変えて「デバイスフォントの使用」や「アンチエイリアス」(埋め込み)などを試しているのですが、それでも一向に数字が表示されないんです。 こういう症状は他に原因があるのでしょうか。

  • suzuko
  • ベストアンサー率38% (1112/2922)
回答No.4

すみません。検証せずに書いていました。 _root.dispTime.onEnterFrame・・・ では確かに作動しませんね。^^; This.onEnterFrame = function(){ now_date = new Date(); h = now_date.getHours(); m = now_date.getMinutes(); s = now_date.getSeconds(); Time = h + ":" + m+ ":" +s; }; ならいけませんか?

cory1379
質問者

お礼

今度もそのまま貼り付けて試してみましたが、時刻の文字が表示されませんでした。 ダイナミックテキストで文字が表示されない理由として何かあるのかなと思って探しているのですが、改善できません。

  • suzuko
  • ベストアンサー率38% (1112/2922)
回答No.3

ダイナミックテキストのインスタンス名と変数を同じ「dispTime」にしているからではないですか? ダイナミックテキストのプロパティで変数を「Time」にして、 _root.dispTime.onEnterFrame = function(){ now_date = new Date(); h = now_date.getHours(); m = now_date.getMinutes(); s = now_date.getSeconds(); Time = h + ":" + m+ ":" +s; }; にされてはいかが?

cory1379
質問者

お礼

ご回答ありがとうございます。 ご指摘の通りに、ダイナミックテキストをTimeに名称変更して、アクションレイヤーにスクリプトを打ち込んだのですが、それでも表示されませんでした。 何が原因でひっかかっているのか・・。 普通ならば簡単にできるのだと思うのですが、困りました。

回答No.2

#1です。エラーが出ないということは記述に問題は無いと思います。 むしろダイナミックテキスト側のインスタンス名の設定か、 フレームがテキストよりも先になっている等の方が怪しいです。 短くした方では他に間違えようがないので、 名前を一度削除してコピー貼り付けなどで動くかもしれません。 ループはわかりやすくするために、 仮にフレーム側で設定した方がいいと思います。

cory1379
質問者

お礼

再びのご回答ありがとうございます。 名前は何度も確認して同じものになっています。 又、時刻が表示されるダイナミックテキストは何もないただ白の背景色があるものの上においていますし、最前面にしています。 静止テキストでは当たり前ですが、問題ないんです。

回答No.1

now_date = new Date(); h = now_date.getHours(); m = now_date.getMinutes(); s = now_date.getSeconds(); dispTime = h + ":" + m+ ":" +s; とりあえずアクションはこれだけで動くはずです。 _root.dispTime.onEnterFrame = function() の部分で何がしたいのか不明です。

cory1379
質問者

お礼

ご回答ありがとうございます。 ご指摘の通りにしてみましたら、やはり時刻の文字が表示されませんでした。 シンタックスエラーは出なかったのですが・・・。 >_root.dispTime.onEnterFrame = function() の部分で何がしたいのか不明です。 onEnterFrameでは、繰り返し処理をしたかったのです。 これがなくても問題ないのでしょうか。

関連するQ&A

専門家に質問してみよう