トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     カレンダー生成について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
blue
Åê¹ÆNo.14613
投稿日時: 2005-1-30 22:46
新米
居住地: 川辺
投稿: 19
使用環境:
★PC  : MACOS.9.2
★FLASH : FLASH MX
カレンダー生成について
はじめまして、いつも参考にさせて頂いております!
最近になってActionScriptを始めだし、サンプルを作りながらも
まだまだ頭を抱えています状態の初心者ですが
どうか宜しくお願い致します


カレンダー生成のスクリプトで分からないことがあり投稿させて頂きました。

カレンダー生成をしたく、サンプルを探したところ
MdN発行『web creators』の2004年1月号に載っていましたので
それをサンプルに作っています。

■サンプルデータ場所
http://www.mdn.co.jp/webcre/Flash/Vol25/

そのなかで、カレンダー生成だけを抜き出し、書いていったのですが分からない点があり、
こういった質問方法は間違っているのかなあ? と思いつつ、
もし御説明下さる方がいてくださったら嬉しいなあと投稿させて頂きました。


まず、日付けの設定をします。

----------------------------------------------------------
日付けの取得 
※メインフレームの[action]レイヤーの1フレーム目に記述します
----------------------------------------------------------

now = new Date();
 //日付けをDateオブジェクトにより日付けを取得

theYear = now.getFullYear();
 //現在の年を取得

theMonth = now.getMonth();
 //現在の月を取得

monthStr = ["JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"];
 //カレンダー生成の際、現在が何月かというテキスト表示をさせたい
 //MC[t_month.txt]に入れ込むための配列を作成

t_month.txt.text = monthStr[theMonth];
 //MC[t_month.txt]に現在の月を表示

theDate = now.getDate();
 //現在の日にちを取得

now = new Date(theYear,theMonth,1);
 //その月の1日のDateオブジェクトを取得

theDay = now.getDay();
 //現在の曜日を取得


//下記より当月の最終日を求める

//★ここから下記がどういった意味なのか分かりませんでした

//月の最終日は28日?31日までになるため、

for(i=29; i<=32; i++){
now = new Date(theYear,theMonth,i);
 //iが29?32までの間は now = new Date(tneYear,theMonth,i)とし
 
tmp = now.getDate();
  //temp = now.getDate();で日付けを取得すると
  //iのいずれかの値で次の月に移り変わり「temp」の値が1となる

//そのとき、lastDate=i-1;とすることで当月の最終日を取得
if(tmp==1){
lastDate = i-1; // 当月の最終日
break;
}
}

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

この当月の最終日の求め方の中の、
temp=now.getDate();?が、どういった意味なのか分かりませんでした。




次にカレンダーを生成していきます。

----------------------------------------------------------
カレンダーの生成
----------------------------------------------------------
//日付けを入れ込むMCを「t_date」とします
//MC「t_date」内には、ダイナミックテキスト設定したMC「t_date0」というMCを配置しています
//「t_date0」に配置したテキストのインスタンス名を「txt」とします


----------------------------------------------------------
//MC「t_date0」のactionフレームの1フレーム目に下記を記述
----------------------------------------------------------


theDate = _parent._parent.theDate;
 //日にち

num = Number(_parent._name.slice(6));
 //★slice(6)とは…?

txt.text = num;
textFormat1 = new TextFormat();
with (textFormat1) {
color = 0xFFFFFF;
}
if(num == theDate){
txt.setTextFormat(textFormat1);
}
 //当日の場合はテキストカラーを「白」にする



----------------------------------------------------------
//メインフレームのactionフレームに下記を設定します
----------------------------------------------------------


startX = 270;
 //日付けテキスト配置の開始位置x座標

startY = 229;
 //日付けテキスト配置の開始位置y座標

i = 1;
 //★ttachMovieで使う、日付けの「1日」という意味で合ってますでしょうか?

fr = 0;
 //★この変数が何を設定したのか分かりませんでした。

interval = 8;
space = 8;

this.onEnterFrame = function(){
if(fr%interval == 0){
  //★ここの求め方がよく分かっていません。

this.attachMovie("t_date","t_date"+i,i);
  //MC「t_date」をattachMovieにて複製していき日付けを入れる

this["t_date"+i]._x = startX+((i+theDay-1)%7)*space;
//一週間単位で改行していくタイプのカレンダーのため
  //初日の曜日の位置から1日ごとに7日周期でspaceずつ移動

this["t_date"+i]._y = startY+(Math.floor((i+theDay-1)/7))*space;
  //そのためy座標も上記となります

}
}
if(i>lastDate){
this.gotoAndStop();
this.onEnterFrame = null;
}
fr++;
};

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

このときの、frとはどういった意味の変数なのでしょうか?
また、MC「t_date0」でのスクリプトもどのように組まれていっているのか
理解しきれませんでした。
サンプルからのため、分からないままにスクリプトなどを長々と書いてしまい
本当に申し訳ありません。

もしこちらのスクリプトの説明や、
他、カレンダー生成を掲載されていらっしゃるサイト様を御存じの方がいらっしゃいましたらお教え頂けませんでしょうか?
お願い致します!

野中文雄
Åê¹ÆNo.14619
投稿日時: 2005-1-31 0:14
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: カレンダー生成について
forステートメントを使ったループ処理は、おわかりになりますか?

参考:拙著『モーショングラフィックスで学ぶActionScript』p.230-231(PDF)
引用:
kuuさんは書きました:
■サンプルデータ場所
http://www.mdn.co.jp/webcre/Flash/Vol25/

そのなかで、カレンダー生成だけを抜き出し、書いていったのですが分からない点があり、

その月の29日から1日ずつ加算していって、月が変わって1日になったら、その前日が当月最終日ということです。

でも、だったら翌月1日の前日を求めれば、一発です。
引用:
//下記より当月の最終日を求める

//★ここから下記がどういった意味なのか分かりませんでした
/*
//月の最終日は28日?31日までになるため、
for(i=29; i<=32; i++){
	now = new Date(theYear,theMonth,i);
 //iが29?32までの間は now = new Date(tneYear,theMonth,i)とし
 
	tmp = now.getDate();
  //temp = now.getDate();で日付けを取得すると
  //iのいずれかの値で次の月に移り変わり「temp」の値が1となる

//そのとき、lastDate=i-1;とすることで当月の最終日を取得
	if(tmp==1){
		lastDate = i-1;		// 当月の最終日
		break;
	}
}
*/
// 翌月1日の前日(1-1=0)を求める
lastDate = new Date(theYear, theMonth+1, 0).getDate();

この当月の最終日の求め方の中の、
temp=now.getDate();?が、どういった意味なのか分かりませんでした。

「ActionScript辞書」で、String.slice()メソッドを調べてご覧になりましたか? そのうえで、以下のtrace()ステートメントの出力結果をご確認ください。
引用:
----------------------------------------------------------
//MC「t_date0」のactionフレームの1フレーム目に下記を記述
----------------------------------------------------------
theDate = _parent._parent.theDate;
 //日にち
trace(_parent._name);  // 確認用
trace(_parent._name.slice(6));  // 確認用
num = Number(_parent._name.slice(6));
 //★slice(6)とは…?

以下の変数iは日付を示し、インスタンス名およびその深度も決定しているようです。

剰余演算子%の意味は、おわかりになっていますか? そのうえで、変数intervalの値を1または100に変更して、結果をご確認ください。
引用:
----------------------------------------------------------
//メインフレームのactionフレームに下記を設定します
----------------------------------------------------------
...[中略]...
i = 1;
 //★attachMovieで使う、日付けの「1日」という意味で合ってますでしょうか?

fr = 0;
 //★この変数が何を設定したのか分かりませんでした。

interval = 8;  // 1または100に変更してみる
space = 8;

this.onEnterFrame = function(){
	if(fr%interval == 0){
  //★ここの求め方がよく分かっていません。

		this.attachMovie("t_date","t_date"+i,i);

上記ご質問でおわかりにならないとされている点は、決して「カレンダー」の意味や暦の仕組みではないはずです。forステートメントやString.slice()メソッド、剰余演算子%などは、まったく異なったコンテンツの作成でも用いられます。

ですから、理解すべきはそれらのスクリプトの要素や、その基本的な使用方法ではないでしょうか。他のカレンダーのサンプルをご覧になれば、また別のわからないスクリプトが登場することになるだけのような気がします。
引用:
もしこちらのスクリプトの説明や、
他、カレンダー生成を掲載されていらっしゃるサイト様を御存じの方がいらっしゃいましたらお教え頂けませんでしょうか?


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

Fla4man
Åê¹ÆNo.14622
投稿日時: 2005-1-31 11:42
職人
居住地: かまくら
投稿: 517
使用環境:
WinMe,Win2000,
Flash4,アズさん,大仏、delphi
Re: カレンダー生成について
Flashで時間関数は良く使われるもののひとつですが
現段階でFscommand2が登場したため鬼門です。
使う場所はできるだけ一箇所に絞ったほうがよいと思います。

将来的にはFscommand2を使ったものがパソコン版でもつかえれば
そちらのほうがよいと思います。

今回

monthStr =

という配列の使い方をしているわけですから
下手にスクリプトを書くより12ヶ月の日数を配列にしたほうが
言語依存度も低くよいのではないでしょうか。


----------------
通常のハンドル名:×○○× ねた回収モードに突入 現在1/100

blue
Åê¹ÆNo.14630
投稿日時: 2005-1-31 16:23
新米
居住地: 川辺
投稿: 19
使用環境:
★PC  : MACOS.9.2
★FLASH : FLASH MX
Re: カレンダー生成について
野中様、お忙しい中ご返信くださり本当にありがとうございました。
野中様がご指示頂きました点をすべて試してみましたところ、
謎が解けていき、こういうことだったんだ!と
一層スクリプトのおもしろさに感嘆しておりました
また、
勉強不足なまま5段ぐらい飛ばした難易度のスクリプトを作らなければならなくなってしまい
未熟さがたくさん出てしまい恥ずかしい限りです。


引用:
forステートメントを使ったループ処理は、おわかりになりますか?



forのループ処理はなんとなくなのですが何度か試していたので
分かっていたつもりだったのですが
作りたいものの目的は分かったのですが内容がどうしても理解できませず
投稿させて頂きました。
野中様からお教え頂きました方法の方が簡潔で、後からみても分かりやすく
早速記述させて頂きました。
スクリプトの作り方でも柔軟な考え方が必要なのですね。


引用:
String.slice()メソッドを調べてご覧になりましたか?



こちらを投稿前、macromediaの方で調べたのですがちゃんと理解できず
野中様からお教え頂きました後で再度ネット上で調べましたところようやく分かりました。
この場合でしたら、生成されてゆく"date_x(x=日付け)"となり日付けだけ欲しいため
"date_"を取り除き、"x"を取り出しテキストに入れていくんですね!


引用:
剰余演算子%の意味は、おわかりになっていますか? そのうえで、変数intervalの値を1または100に変更して、結果をご確認ください。



剰余演算子%の式を再度調べ直しました。
こちらも前はなんとなくでしか覚えておりませんでしたためより使い方が分かりました。
なのですが、このサンプルの際の『(fr%interval == 0)』の意図するところを
ちゃんと理解しきれておりません
interval=1では、あっという間に生成し、
intercal=100では生成される時間が遅くなる、という結果を教えて頂き
仕組みはおぼろげながら分かった形なのですが
この式の意味をしっかりと説明できないままです。


引用:
他のカレンダーのサンプルをご覧になれば、また別のわからないスクリプトが登場することになるだけのような気がします。



本当にもっと基礎的なことを徹底的に勉強してから作成しなければです。
会社でFLASHのスクリプトを作成しているのですが周りにActionScriptを扱う方がおりませず、
また色々なサンプルを作っていく内に覚えなさいという方針のため
毎日未熟さを実感しております。
ですが、お教え頂き、スクリプトが分かりましたときの
あの嬉しい感じが忘れられず難しさに泣きながらも
これからもますます好きになりました。

本当にありがとうございました!
blue
Åê¹ÆNo.14631
投稿日時: 2005-1-31 16:34
新米
居住地: 川辺
投稿: 19
使用環境:
★PC  : MACOS.9.2
★FLASH : FLASH MX
Re: カレンダー生成について
Fla4man様、お教え下さり本当にありがとうございました。

引用:
下手にスクリプトを書くより12ヶ月の日数を配列にしたほうが
言語依存度も低くよいのではないでしょうか。


本当はFla4man様からお教え頂きました通り配列にして作成した方が
まだスクリプトに不馴れな場合いいのかなあと思います。
ただ、何年にも渡って使っていく場合
1ヶ月ごとに作成しなければならないという理由から
スクリプトでとの指示があり、組むことになりました。
配列で12ヶ月組む場合ですと月が変わる時用のスクリプトを組めば自動的に1年間、
動いてくれますでしょうか?
何度も質問してしまい申し訳ありません。
blue
Åê¹ÆNo.14632
投稿日時: 2005-1-31 16:44
新米
居住地: 川辺
投稿: 19
使用環境:
★PC  : MACOS.9.2
★FLASH : FLASH MX
Re: カレンダー生成について
いくつもの質問を申し訳ありません

このサンプルでカレンダーを生成していきましたとき、
土曜日は××色に、日曜日は××色に、というスクリプトを書くにはどうしたらいいでしょうか?

方法として、x座標・y座標を7日周期で変更していく方法と同じように最初の曜日を取得し、
そこから土曜日の設定を7日周期で、日曜日の設定も7日周期で設定する方法を
思ったのですが、合っていますでしょうか?
その場合のスクリプトは
this["t_date"+i]._x = startX+((i+theDay-1)%7)*space;を変化させてできるかと
何パターンか組んでみたのですが式の構造自体が間違ってしまっているようで
動きませんでした。
この曜日設定を色でつけてあげたい場合にはどのようにすればいいでしょうか?
お尋ねするばかりで自分で見つけきれずなので
お教えいただける前に自分で解決できるよう頑張ります!
野中文雄
Åê¹ÆNo.14633
投稿日時: 2005-1-31 16:52
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: カレンダー生成について
MovieClipシンボルを作成して、以下のスクリプトを第1フレームアクションに設定したうえで、動作および[出力]パネルの表示を確認してみてください。フレームレートは少し遅めにした方が、わかりやすいかもしれません。
// MovieClip: 2フレームおきに右方向に移動
// 第1フレームアクション
var fr = 0;
var interval = 3;
this.onEnterFrame = function() {
    trace(fr%interval);
    if (fr%interval == 0) {
        trace("進む");
        _x += 5;
    } else {
        trace("パス");
    }
    ++fr;
};

また、以下のノートのサンプルスクリプトが、剰余演算子%をもっとスタンダードな意味(割った余りを調べる)で使用しています。ご参考まで。
if/else if/elseアクションを使った処理
引用:
kuuさんは書きました:
剰余演算子%の式を再度調べ直しました。
こちらも前はなんとなくでしか覚えておりませんでしたためより使い方が分かりました。
なのですが、このサンプルの際の『(fr%interval == 0)』の意図するところを
ちゃんと理解しきれておりません
interval=1では、あっという間に生成し、
intercal=100では生成される時間が遅くなる、という結果を教えて頂き
仕組みはおぼろげながら分かった形なのですが
この式の意味をしっかりと説明できないままです。


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

野中文雄
Åê¹ÆNo.14635
投稿日時: 2005-1-31 17:26
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: カレンダー生成について
「何の」色を変えたいのでしょう? 背景色(MovieClipのカラー)ですか、テキストのカラーですか?

Date.getDay()メソッドを使えば、曜日を調べることができます。
引用:
kuuさんは書きました:
このサンプルでカレンダーを生成していきましたとき、
土曜日は××色に、日曜日は××色に、というスクリプトを書くにはどうしたらいいでしょうか?

// MovieClip: シンボルt_date0
// 第1フレームアクション
theDate = _parent._parent.theDate;
num = Number(_parent._name.slice(6));
txt.text = num;
nWeekDay = new Date(_root.theYear, _root.theMonth, num).getDay();
if (nWeekDay == 0) {
    trace(num + " is Sunday");  // テスト用
} else if (nWeekDay == 6) {
    trace(num + " is Saturday");  // テスト用
}
textFormat1 = new TextFormat();
with (textFormat1) {
    color = 0xFFFFFF;
}
if (num == theDate) {
    txt.setTextFormat(textFormat1);
}


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

blue
Åê¹ÆNo.14654
投稿日時: 2005-1-31 22:46
新米
居住地: 川辺
投稿: 19
使用環境:
★PC  : MACOS.9.2
★FLASH : FLASH MX
Re: カレンダー生成について
剰余演算子%に関してお教え頂きましたサンプルを作成し
frとintervalの値を色々変えて出力しましたところようやくこちらの式の仕組みが分かりました!
先程試しておりましたところなのでまだ言葉があやふやになってしまうのですが

増加してゆく『fr』を『interval』で割ったとき、
余りのでないときにはx座標を進め、
余りのあるときはカウントして間隔をあける(←こちらの説明が下手で申し訳ありません)

という解釈であってますでしょうか?

また、野中様の『if/else if/elseアクションを使った処理
』も参考にさせて頂き
今日一日だけでもやもやしたものがすっきり晴れて本当に嬉しいです。

まだお教え頂きました『if/else if/elseアクションを使った処理
』の方を
より詳しく試しておりませんため、再度作って参考にさせて頂きます。
野中様、幾度も本当にありがとうございました!
blue
Åê¹ÆNo.14656
投稿日時: 2005-1-31 23:04
新米
居住地: 川辺
投稿: 19
使用環境:
★PC  : MACOS.9.2
★FLASH : FLASH MX
Re: カレンダー生成 [ 曜日の色付け ]
野中様、こちらの方でもお教え下さりありがとうございます。

曜日テキストの色を変えたく悩んでおりました。
野中様からお教え頂きました方法で日曜日、土曜日を取得し
下記スクリプトを作成すると各曜日のテキストの色を変化させることができました。


---------------------------------------------------------
// MovieClip: シンボルt_date0
// 第1フレームアクション
---------------------------------------------------------

theDate = _parent._parent.theDate;
num = Number(_parent._name.slice(6));
txt.text = num;
nWeekDay = new Date(_root.theYear, _root.theMonth, num).getDay();


//日曜日の日付けに色をつけるためのメソッドを作成

sunColor = new TextFormat();
with (sunColor) {
color = 0xf20000;
}

if(nWeekDay == 0){
txt.setTextFormat(sunColor);
}


//土曜日の日付けに色をつけるためのメソッドを作成

satColor = new TextFormat();
with (satColor) {
color = 0x1066de;
}

if(nWeekDay == 6){
txt.setTextFormat(satColor);
}


//当日であるときには文字色を白に

textFormat1 = new TextFormat();
with (textFormat1) {
color = 0xFFFFFF;
}
if (num == theDate) {
txt.setTextFormat(textFormat1);
}

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


スクリプトをもっと要約し、綺麗に書ける方法があるはずだと思いながら
こちらの方で動作確認できました。
さらに綺麗なスクリプトになるようつきつめ、
また、背景色も変えれるようもう暫く作成して参ります。
最初から最後まで、本当にありがとうございました
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops