forked from: PigeonClock

by ieha forked from PigeonClock (diff: 309)
♥0 | Line 274 | Modified 2010-01-30 12:26:12 | MIT License | (replaced)
play

ActionScript3 source code

/**
 * Copyright ieha ( http://wonderfl.net/user/ieha )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/rQkO
 */

package {
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.net.URLRequest;
	import flash.utils.Timer;
	
	[SWF(width = "465", height = "465", backgroundColor = "0x0", framRate = "90")]
	
	public class wo010401 extends Sprite {
		// 表示パーツ
		private var _longDart:Sprite = new Sprite();
		private var _shortDart:Sprite = new Sprite();
		private var _secDart:Sprite = new Sprite();
		private var _base:Sprite = new Sprite();
		private var _body:Sprite = new Sprite();
		private var _furiko:Sprite = new Sprite();
		private var _pigeon:Sprite = new Sprite();
		private var _pigeon2:Sprite = new Sprite();
		private var _wakeUpDart:Sprite = new Sprite();
		private var _wakeUpPoint:Sprite = new Sprite();
		
		private var _loader:Loader = new Loader();				// ローダー
		private var _allLoader:DataLoaders = new DataLoaders();
		private var _clock:ClockMaster = new ClockMaster();		// 時計クラス
		private var _poppotTimer:Timer = new Timer(500);		// 鳩アニメ用タイマー
		private var _poppoCounter:int = 0;
		private var _wakeRotate:int = 0;						// 目覚まし角度
		
		// 鳩時計を作成		
		// コンストラクタ
		// データ読み込み → 表示オブジェクト配置 → 鳩を1回実行 → 時計スタートの順
		public function wo010401() {
			// ステップ1 データ読み込み
			_step1_daraload();		
		}
		
		// ステップ1 データ読み込み
		public function _step1_daraload():void {
			// 読み込み完了ハンドラ
			_allLoader.addEventListener(Event.COMPLETE, _LoadComplete);
			// 読み込み開始
			_allDataLoad();
		}
		
		// データを読み込む関数
		private function _allDataLoad():void {
			_allLoader.addLoadItem("shor", "http://assets.wonderfl.net/images/related_images/9/99/99b7/99b704fec21c9b0f884566c0bc88254846a6cc4d");
			_allLoader.addLoadItem("long", "http://assets.wonderfl.net/images/related_images/f/fd/fd7f/fd7f8e2dbebbfa57c0fc50ddc0559cb7cdafc061");
			_allLoader.addLoadItem("sec", "http://assets.wonderfl.net/images/related_images/8/88/88bf/88bf23d320ba18d01c387b89db651eb8319fb483");
			_allLoader.addLoadItem("body", "http://assets.wonderfl.net/images/related_images/f/fc/fc26/fc26d4b361f51da5f33d9fb67b2ef8f2cfe8987f");
			_allLoader.addLoadItem("alarmDart", "http://assets.wonderfl.net/images/related_images/1/1e/1e89/1e89181b840dc5a7c07753bb639f4befac900433");
			_allLoader.addLoadItem("alarmHand", "http://assets.wonderfl.net/images/related_images/0/02/02b9/02b90ab43bc3b1589e4c6efae5b29238ee3f98fd");
			_allLoader.addLoadItem("poppo", "http://assets.wonderfl.net/images/related_images/d/d4/d4f3/d4f3084298d09906edadbeb556ee674cdb615dbc");
			_allLoader.addLoadItem("poppo2", "http://assets.wonderfl.net/images/related_images/e/e4/e477/e47725c6099fae966713995479f422b6181181d3");
			
			_allLoader.loadStart();
		}
		
		// 読み込み完了ハンドラ
		private function _LoadComplete(e:Event):void {
			_step2_setItems();	// ステップ2 Displayアイテムの配置
			_step3_setClock();	// ステップ3 時計イベントの設定
			_step4_setArarm();	// ステップ4 アラームの設定
		}
		
		// ステップ2 Displayアイテムの配置
		private function _step2_setItems():void {
			// 1.読み込んだデータをあらかじめ用意したMCに配置
			// 本体
			_body.addChild(_allLoader.items.body);
			// 長針
			_longDart.addChild(_allLoader.items.long)
			_allLoader.items.long.x = -_allLoader.items.long.width / 2;
			_allLoader.items.long.y = -_allLoader.items.long.height + 5;
			// 短針
			_shortDart.addChild(_allLoader.items.short);
			_allLoader.items.short.x = -_allLoader.items.sec.width / 2;
			_allLoader.items.short.y = -_allLoader.items.sec.height + 5;
			// 秒針
			_shortDart.addChild(_allLoader.items.sec);
			_allLoader.items.sec.y = -_allLoader.items.sec.height;
			// アラーム針
			_wakeUpDart.addChild(_allLoader.items.alarmDart);
			_allLoader.items.alarmDart.x = -_allLoader.items.alarmDart.width / 2;
			_allLoader.items.alarmDart.y = -_allLoader.items.alarmDart.height;
			// アラーム針の持ち手
			_wakeUpPoint.addChild(_allLoader.items.alarmHand);
			_allLoader.items.alarmHand.x = -_allLoader.items.alarmHand.width / 2;
			_allLoader.items.alarmHand.y = -_allLoader.items.alarmHand.height / 2 + 50;
			// 鳩
			_pigeon = _allLoader.items.poppo;
			_pigeon2 = _allLoader.items.poppo2;
			
			// 2.データが配置されたMCをステージに配置
			addChild(_body);
			_body.addChild(_base);
			_body.addChild(_wakeUpDart);
			_body.addChild(_longDart);
			_body.addChild(_shortDart);
			_body.addChild(_secDart);
			// _body.addChild(_furiko);
			_body.addChild(_pigeon);
			_body.addChild(_pigeon2);
			
			_base.x = 465 / 2;
			_base.y = 350;
			_pigeon.x = _body.width / 2 - 20 - 70;
			_pigeon.y = 200 - 45 - 210;
			_pigeon2.x = _body.width / 2 - 20 - 70 - 95;
			_pigeon2.y = 200 - 45 - 210;
			_pigeon2.visible = false;
		}
		
		// ステップ3 時計イベントの設定
		private function _step3_setClock():void {
			_secHandler(null);
			_minHandler(null);
			_hourHandler(null);
			_clock.addEventListener(ClockEvent.SECONDA_CHANGED, _secHandler);
			_clock.addEventListener(ClockEvent.MINUTES_CHANGED, _minHandler);
			_clock.addEventListener(ClockEvent.HOURS_CHANGED, _hourHandler);

		}
		
		private function _secHandler(e:ClockEvent):void {
			_secDart.rotation = _clock.secondsDegree;
			_shortDart.rotation = _clock.hoursDegree;
			_longDart.rotation = _clock.minutesDegree;
			
			// 目覚まし機能
			if (Math.abs( _wakeRotate- _shortDart.rotation) == 0) {
				_pigeonPlay(1);
			}
		}
		
		private function _minHandler(e:ClockEvent):void {
			_longDart.rotation = _clock.minutesDegree;
		}
		
		private function _hourHandler(e:ClockEvent):void {
			// _shortDart.rotation = _clock.hourDegree;
			_pigeonPlay(_clock.hours);
		}
		
		// 葉との動きと今の時間を参照して、今の時間の回数実行します
		private var _poppoMax:int;
		private var _pigeonPlayTimer:Timer = new Timer(300);
		private function _pigeonPlay(h:int):void {
			_poppoCounter = 0;
			_poppoMax = h;
			
			_pigeonCoo();
			_poppoCounter++;
			_poppotTimer.addEventListener(TimerEvent.TIMER, poppoNext);
			_poppotTimer.start();
		}
		
		private function poppoNext(e:TimerEvent):void {
			if (_poppoCounter == _poppoMax) {
				_poppotTimer.stop();
				_poppotTimer.removeEventListener(TimerEvent.TIMER, poppoNext);
			} else {
				_pigeonCoo();
				_poppoCounter++;
			}
		}
		
		private function _pigeonCoo():void {
			_pigeonPlayTimer.addEventListener(TimerEvent.TIMER, pplayTimerHandloer);
			_pigeonPlayTimer.start();
			_pigeon2.visible = true;
			_pigeon.visible = false;
		}
		
		private function pplayTimerHandloer(e:TimerEvent):void {
			_pigeon2.visible = false;
			_pigeon.visible = true;
			_pigeonPlayTimer.stop();
			_pigeonPlayTimer.removeEventListener(TimerEvent.TIMER, pplayTimerHandloer);
		}
		
		// 目覚ましの動き、マウスドラッグで回転する針を作る
		// マウスアップイベントでタイマーをセット
		private function _step4_setArarm():void {
			_wakeUpDart.graphics.lineStyle(1, 0xFF0000);
			_wakeUpDart.graphics.moveTo(0, 0);
			_wakeUpDart.graphics.lineTo(0, -20);
			_wakeUpDart.addChild(_wakeUpDart);
			_wakeUpPoint.y = _wakeUpDart.height * 0.9;
			_wakeUpPoint.buttonMode = true;
			_wakeUpPoint.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, upHandler);
		}
		
		private function downHandler(e:MouseEvent):void {
			_wakeUpDart.addEventListener(Event.ENTER_FRAME, wakeUpEnterFrame);
		}
		
		private function wakeUpEnterFrame(e:Event):void {
			var dx:Number = _base.mouseX - _wakeUpDart.x;
			var dy:Number = _base.mouseY - _wakeUpDart.y;
			_wakeUpDart.rotation = Math.atan2(dx, dy) * 180 / Math.PI + 90;
		}
		
		private function upHandler(e:MouseEvent):void {
			_wakeUpDart.removeEventListener(Event.ENTER_FRAME, wakeUpEnterFrame);
			_wakeRotate = _wakeUpDart.rotation;
		}
	}
}

import flash.display.Sprite;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.display.DisplayObject;
import flash.display.Bitmap;

// 時計を管理するクラス
class ClockMaster extends EventDispatcher {
	
	private var _hours:int;
	private var _minutes:int;
	private var _seconds:int;
	private var _preSeconds:int;
	private var _dispatsher:DisplayObject;
	
	// コンストラクタ
	public function ClockMaster():void {
		_dispatsher = new Sprite();
		_enterFrameHandler(null);
		_dispatsher.addEventListener(Event.ENTER_FRAME, _enterFrameHandler);
	}
	
	private function _enterFrameHandler(e:Event):void {
		var _date:Date = new Date();
		_hours = _date.getHours();
		_minutes = _date.getMinutes();
		_seconds = _date.getSeconds();
		if (_seconds != _preSeconds) {
			dispatchEvent(new ClockEvent(ClockEvent.SECONDA_CHANGED));
			if (_seconds == 0) {
				dispatchEvent(new ClockEvent(ClockEvent.MINUTES_CHANGED));
				if (_minutes == 0) {
					dispatchEvent(new ClockEvent(ClockEvent.HOURS_CHANGED));
				}
			}
		}
		_preSeconds - _seconds;
	}
	
	// 時間を返す
	public function get hours():int {
		return _hours;
	}
	public function get minutes():int {
		return _minutes;
	}
	public function get seconds():int {
		return _seconds;
	}
	
	// 上位1桁返す
	public function get hoursUpper():int {
		return _hours / 10;
	}
	public function get minutesUpper():int {
		return _minutes / 10;
	}
	public function get secondsUpper():int {
		return _seconds / 10;
	}
	
	// 下位1桁返す
	public function get hoursLower():int {
		return _hours % 10;
	}
	public function get minutesLower():int {
		return _minutes % 10;
	}
	public function get secindsLower():int {
		return _seconds % 10;
	}
	
	// アナログ時計にした時の針の角度を返す
	public function get hoursDegree():Number {
		return((_hours % 12) * 30) + (_minutes / 2) + (_seconds / 120);
	}
	public function get minutesDegree():Number {
		return(_minutes * 6) + (_seconds / 10);
	}
	public function get secondsDegree():Number {
		return _seconds * 6;
	}
}

// データ読み込みクラス
class DataLoaders extends Sprite {
	private var _counter:int = 0;
	private var _loadNum:int = 0;
	public var items:Object = new Object();
	private var _urls:Object = new Object();
	public static var LOADCOMPLETE:String = "loadComp";
	
	// コンストラクタ
	public function DataLoaders():void {
		
	}
	
	public function addLoadItem(_name:String, _url:String):void {
		items[_name] = new Loader();
		_urls[_name] = _url;
		_loadNum++;
	}
	
	public function loadStart():void {
		var i:String;
		for (i in items) {
			var loderUnit:Loader = items[i];
			var urlUnit:String = _urls[i];
			loderUnit.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompHandler);
			loderUnit.load(new URLRequest(urlUnit));
		}
	}
	
	private function loadCompHandler(e:Event):void {
		// if (e.target.content is Bitmap)
		// Bitmap(e.target.content).smoothing = true;
		_counter++;
		if (_counter == _loadNum) {
			dispatchEvent(new Event(Event.COMPLETE));
		}
	}
}

// 時計イベントクラス
class ClockEvent extends Event {
	public static const HOURS_CHANGED:String = "houesChanged";
	public static const MINUTES_CHANGED:String = "minutesChanged";
	public static const SECONDA_CHANGED:String = "secondsChanged";
	
	// コンストラクタ
	public function ClockEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false) {
		super(type, bubbles, cancelable);
	}
	
	public override function clone():Event {
		return new ClockEvent(type, bubbles, cancelable);
	}
	
	public override function toString():String {
		return formatToString("ClockEvent", "type", "bubbles", "cancelable", "eventPhase");
	}
}