グレゴリオ暦から月齢を求め、今日の月を満ち欠けを表示する
代表的な式をActionscriptで再現することで今日の満ち欠けを求めます。月齢(新月から新月の間0~29.53059)を求め、今日の満ち欠けに対応するアニメーションのフレームで止めるという仕組みです。(今回使用した式はウィキペディアより引用しました。)
1. 一番上に新しいレイヤー「action」を作成し、2フレーム目にキーフレームを作成してください。
2. レイヤー「action」の1フレーム目にActionscriptを記述していきます。
まず、Dateオブジェクトを生成します。
nowTime = new Date();一行目でdateObjectを作成しています。今回使用するのは年、月、日の3つです。
nowYear = nowTime.getFullYear();
nowMonth = nowTime.getMonth();
nowDate = nowTime.getDate();
2. 続いて指定されている各月の表を配列として持ちます。
moonageArray = [0,2,0,2,2,4,5,6,7,8,9,10];
3. 月齢を求める式「a = (((y-11)%19)*11+c(m)+d)%30」をActionscriptに置き換えます。
moonAge = (((nowYear - 11)%19) * 11 + moonageArray[nowMonth] + nowDate)%30;
4. 再生を止めるフレームを2フレーム目から最終フレームの間で決めます。
targetFrame = Math.floor(Math.min(_root._totalframes,Math.max(2,moonAge*10+1)));再生を止めるフレームを変数「targetFrame」としています。
「Math.min(A,B)」は、「AとB」の小さい方を返します。この場合、2フレーム目と「月齢*10+1」を比較しています。
5. 毎フレームごとに現在がターゲットのフレームかどうか監視を行い。ターゲットフレームであればアニメーションをストップします。
_root.onEnterFrame = function(){ if(this._currentframe == targetFrame){ this.stop(); this.onEnterFrame = null; } }まず一行目「_root.onEnterFrame = function(){}」とあります。これは「_root」フレームでタイムラインが進む度に「{ }」内の処理を実行するという物です。
次に二行目にif文があります。「this._currentframe」というのは現在のフレーム番号を返すものです。これを止めたいフレームである「targetFrame」と比較し、同じ値になった場合処理を実行するという意味になります。
三行目、四行目で、現在のフレームが止めたいフレームだった場合の処理を記述しています。三行目でフレームを止める記述をし、四行目は見慣れないものです。「this.onEnterFrame = null」で、一行目に記述してある「_root.onEnterFrame = function(){ }の処理をやめる」という意味になります。「onEnterFrame」は特別な指示をしない限り永遠に実行され続けてしまい、パソコンに無駄な負荷をかけてしまうことになるので、このように必要がなくなった物は停止させることが必要になります。
これで今日の満ち欠けが分かるようになりました。
次のページでは月の上に年月日を表示し、デザイン性とカレンダーとしての実用性を上げていきます。