flash on 2009-12-30
♥0 |
Line 279 |
Modified 2009-12-30 03:37:13 |
MIT License
archived:2017-03-30 05:11:18
| (replaced)
ActionScript3 source code
/**
* Copyright yama3 ( http://wonderfl.net/user/yama3 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/l303
*/
package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.DataEvent;
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", frameRate = "90")]
public class PigeonClock 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:Loader;
private var _pigeon2:Loader;
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 poppotimer:Timer = new Timer(500);
private var poppo_counter:int = 0;
//目覚まし角度
private var _wakeRotate:int = 0;
public function PigeonClock()
{
_step1_dataload();
}
//ステップ1データ読み込み
private function _step1_dataload():void
{
//読み込完了ハンドラ
_allLoader.addEventListener(Event.COMPLETE, _LoadComplete);
//読み込み開始
_allDataLoad();
}
//データを読み込む関数
private function _allDataLoad():void
{
_allLoader.addLoadItem("short", "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();
_step3_setClock();
_step4_setArarm();
}
//ステップ2 Displayアイテムの配置
private function _step2_setItems():void
{
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.short.width / 2;
_allLoader.items.short.y = -_allLoader.items.short.height + 5;
_secDart.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;
addChild(body);
body.addChild(base);
base.addChild(_wakeUpDart);
base.addChild(_longDart);
base.addChild(_shortDart);
base.addChild(_secDart);
body.addChild(_pigeon);
body.addChild(_pigeon2);
base.x = 465 / 2;
base.y = 350;
_pigeon.x = body.width / 2 - 20 - 70;
_pigeon.y = 200 - 45;
_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.SECONDS_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
{
_pigeonPlay(_clock.hours);
}
private var poppoMax:int;
private var _pigeonPlayTimer:Timer = new Timer(300);
private function _pigeonPlay(h:int):void
{
poppo_counter = 0;
poppoMax = h;
_pigeonCoo();
poppo_counter++;
poppotimer.addEventListener(TimerEvent.TIMER, poppoNext);
poppotimer.start();
}
private function poppoNext(e:TimerEvent):void
{
if (poppo_counter == poppoMax) {
poppotimer.stop();
poppotimer.removeEventListener(TimerEvent.TIMER, poppoNext);
} else {
_pigeonCoo();
poppo_counter++;
}
}
private function _pigeonCoo():void {
_pigeonPlayTimer.addEventListener(TimerEvent.TIMER, pplayTimerHandler);
_pigeonPlayTimer.start();
_pigeon2.visible = true;
_pigeon.visible = false;
}
private function pplayTimerHandler(event:TimerEvent):void {
_pigeon2.visible = false;
_pigeon.visible = true;
_pigeonPlayTimer.stop();
_pigeonPlayTimer.removeEventListener(TimerEvent.TIMER, pplayTimerHandler);
}
private function _step4_setArarm():void
{
_wakeUpDart.graphics.lineStyle(1, 0xff0000);
_wakeUpDart.graphics.moveTo(0, 0);
_wakeUpDart.graphics.lineTo(0, -20);
_wakeUpDart.addChild(_wakeUpPoint);
_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(dy, dx) * 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 _dispatcher:DisplayObject;
public function ClockMaster():void
{
_dispatcher = new Sprite();
_enterFrameHandler(null);
_dispatcher.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.SECONDS_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; }
public function get hoursUpper():int { return _hours / 10; }
public function get minutesUpper():int { return _minutes / 10; }
public function get secondsUpper():int { return _seconds / 10; }
public function get hoursLower():int { return _hours % 10; }
public function get minutesLower():int { return _minutes % 10; }
public function get secondsLower():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() {
}
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 loaderUnit:Loader = items[i];
var urlUnit:String = urls[i];
loaderUnit.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompHandler);
loaderUnit.load(new URLRequest(urlUnit));
}
}
private function loadCompHandler(e:Event):void
{
_counter++;
if (_counter == _loadNum) {
dispatchEvent(new Event(Event.COMPLETE));
}
}
}
//時計イベントクラス
class ClockEvent extends Event {
public static const HOURS_CHANGED:String = "hoursChanged";
public static const MINUTES_CHANGED:String = "minutesChanged";
public static const SECONDS_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");
}
}