ささきち流 Suzuka & ParaDraw 講座
Suzuka & ParaDraw
TOP
PROFILE
ActionScript Editor
LINK
BBS


フリーソフト Suzuka & ParaDraw で Flash な生活を楽しんじゃおうというサイトです。
万年カレンダー サンプル&作成方法解説

 

年と月は手動で変えられます。

 


サンプルダウンロード
PDRファイル・CSFファイル在中
「calendar.zip」 19.1 KB (19,560 バイト)



万年カレンダー 作成方法解説

めずらしく装飾には凝っていなくてシンプルなサンプルですが,一応 ParaDraw Ver.0.3a4 で作成した絵を,Suzuka Ver.0.7.3.4 で動作させています。

ActionSucriptやしくみなどは,他のサイトなどを全く参考にしていないので,極めてささきち流なFlash(Suzuka)的万年カレンダーだと思います。
祝祭日などは表示されません。

JavaScript風なスクリプトを使用した物は Adobe Flash の解説サイトで見かけたことがありますし,時には JavaScript を参考にすることがあっても良いですが,真似をする必要は全くありません。
また Excel の関数や VBA で動く万年カレンダーも見かけたことがありますが Excel のような考え方も今回は全く関係ありません。Suzuka は Suzuka です。

JavaScript や Excel のように小難しいプログラムを考えて日付を算出するというものではなく,キーとなる日付(その月の1日と2月29日)の曜日を求めるだけで,あとはスプライトの座標をスライドさせてカレンダー表示をさせるというものです。
不人気なお土産や記念品コーナーでありそうな,実物として存在する万年カレンダーの原理に近いものを利用して作っていると思います。
こうすると,スクリプトが簡単になるのみならず,Flash的 な動きも付加させることができます。

メインのタイムラインと,各レイヤーに配置した物を図にすると次のようになっています。

「日付マスク部分」というものがありますが,これは本来のマスクではありません
穴の開いた文字盤の上に黒い幕をかぶせて,穴が見えないようにしているというもので,マスクではなく,あて布(覆い)のようなものです
月によって,28日までしかなかったり,31日まであったりするので,月によって29〜31の穴を塞いでいます。

スクリプトはメインのタイムラインの フレーム1 にのみ書いています。

// テキストフィールドの文字入力制限
y_txt.restrict = "0-9";
m_txt.restrict = "0-9";
// 現在の日付オブジェクト objD を作成
objD = new Date();
// テキストフィールドに年と月の初期値を代入
y_txt.text = objD.getFullYear();
m_txt.text = objD.getMonth()+1;
// 月による日付マスク座標の座標配列を設定
msk_arr = [60, -30, 60, 30, 60, 30, 60, 60, 30, 60, 30, 60];
// カレンダーを変えるユーザ定義関数を定義
function changeCalendar() {
	// テキストフィールド月の1日の日付オブジェクトを作成
	objD = new Date(Number(y_txt.text), Number(m_txt.text)-1, 1);
	// その日の曜日番号を求める
	week = objD.getDay();
	// 文字盤の目差す座標を変更
	m_x = week*30-30*6+10;
	// 日付マスクの座標を設定
	// もし月が2月であれば(閏年判定)
	if (Number(m_txt.text) == 2) {
		// その年の2月29日の日付オブジェクトを作成
		objD1 = new Date(Number(y_txt.text), 1, 29);
		// その年の2月29日の曜日を求める
		week1 = objD1.getDay();
		// その年の3月1日の日付オブジェクトを作成
		objD2 = new Date(Number(y_txt.text), 2, 1);
		// その年の3月1日の曜日を求める
		week2 = objD2.getDay();
		// もし2月29日と3月1日の曜日が違えば
		if (week1 != week2) {
			// 閏年なので日付マスク座標を 0 にする
			moji_mc.msk_mc._x = 0;
		} else {
			// それ以外は閏年ではないので規定通り -30 にする
			moji_mc.msk_mc._x = -30;
		}
	} else {
		// 2月以外は規定通りの座標にする
		moji_mc.msk_mc._x = msk_arr[Number(m_txt.text)-1];
	}
}
// カレンダーを変えるユーザ定義関数の初回実行
changeCalendar();
// 文字盤の移動(Flash的演出)
moji_mc.onEnterFrame = function() {
	this._x += (m_x-this._x)*2/10;
};
// テキストフィールドの入力値が変わったとき
y_txt.onChanged = function() {
	// カレンダーを変えるユーザ定義関数の実行
	changeCalendar();
};
m_txt.onChanged = y_txt.onChanged;

4の倍数の年が閏年ですが,100の倍数年は例外的に閏年にならず,400の倍数年はさらに例外的に閏年になるという複雑なルール(法則)があります。
しかし,そんな小難しいルールも考えません。

2月のカレンダーを表示させるときは,2月29日と3月1日の曜日を求めて,違っていれば閏年,同じであれば閏年ではないと判断させています。
つまり,2月29日が存在するのであれば,3月1日と同じ曜日になるはずがありません。
同じ曜日になるということは,2月29日は存在しないということになります。
というか,
実際は閏年であるかないかということは最初から判断させずに,2月29日が存在するかしないかということだけを判断させています。
閏年も,こう言った単純で,PC(OS)任せな考え方で処理しています。

Suzuka に慣れていないと,ActionScriptよりも,スプライト構造やしくみがわかりにくいかもしれませんが,以上のような感じで,全て Flash(Suzuka) 中心で物事を考えた万年カレンダーです。

Flash(Suzuka) でも,当然 JavaScript や Excel っぽい考え方で万年カレンダーを作ることはできます。
しかし,こういう,お土産や記念品でありそうな,古風なしくみを使っても簡単に作ることが可能です。
こういう物体的なしくみを簡単に再現&利用できるというのが Flash(Suzuka) の特徴(長所)です。