/**
* Copyright yama3 ( http://wonderfl.net/user/yama3 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/tsc1
*/
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.geom.Matrix;
import flash.geom.Point;
[SWF(width = "465", height = "465", backgroundColor = "0x0", frameRate = "90")]
public class ElectorogramClock extends Sprite
{
//線を引くためのクラス
private var _line:DrawLine = new DrawLine();
//各数字の座標配列
private var _line0:Array=[{x:-4.14,y:51.775},{x:4.735,y:51.837},{x:9.86,y:47.775},{x:14.11,y:30.15},{x:24.36,y:8.775},{x:39.423,y:-0.413},{x:47.36,y:-1.725},{x:49.63,y:-1.474},{x:50.383,y:2.419},{x:42.321,y:3.258},{x:26.198,y:13.166},{x:15.197,y:42.389},{x:14.776,y:71.612},{x:27.206,y:94.284},{x:57.772,y:105.872},{x:85.483,y:94.537},{x:96.064,y:71.612},{x:96.735,y:42.306},{x:87.33,y:16.527},{x:67.932,y:4.77},{x:55.084,y:3.09},{x:53.284,y:0.932},{x:57.86,y:-1.225},{x:70.548,y:0.962},{x:81.36,y:5.775},{x:90.61,y:15.087},{x:96.86,y:26.275},{x:99.86,y:35.337},{x:101.36,y:43.275},{x:101.11,y:49.462},{x:103.86,y:52.275},{x:108.36,y:52.275},{x:109.86,y:52.275}];
private var _line1:Array=[{x:-5.916,y:50.071},{x:-2.446,y:50.337},{x:5.827,y:50.603},{x:14.368,y:45.733},{x:18.104,y:38.861},{x:17.914,y:30.099},{x:25.207,y:21.299},{x:32.261,y:19.198},{x:43.346,y:14.579},{x:53.422,y:6.267},{x:59.468,y:0.472},{x:59.468,y:51.193},{x:59.468,y:101.913},{x:64.073,y:103.348},{x:74.684,y:95.975},{x:83.091,y:68.885},{x:92.298,y:50.603},{x:103.441,y:50.603},{x:107.778,y:50.603}];
private var _line2:Array=[{x:-5.013,y:45.603},{x:-0.142,y:45.603},{x:9.933,y:44.002},{x:14.989,y:36.404},{x:14.842,y:30.406},{x:15.346,y:22.932},{x:18.872,y:8.907},{x:29.789,y:-1.42},{x:45.744,y:-5.199},{x:66.402,y:-1.925},{x:82.021,y:14.954},{x:79.838,y:35.529},{x:70.601,y:46.529},{x:55.485,y:56.606},{x:38.355,y:66.682},{x:23.743,y:76.339},{x:12.155,y:95.569},{x:49.774,y:95.569},{x:87.394,y:95.569},{x:92.434,y:93.272},{x:97.473,y:86.17},{x:97.272,y:63.218},{x:100.674,y:45.071},{x:106.212,y:45.071},{x:108.146,y:45.071}];
private var _line3:Array=[{x:0.491,y:46.071},{x:5.162,y:46.604},{x:13.836,y:45.536},{x:20.273,y:41.428},{x:22.707,y:28.717},{x:24.89,y:17.046},{x:38.159,y:-0.169},{x:66.961,y:-4.117},{x:91.229,y:8.564},{x:93.161,y:28.718},{x:86.527,y:38.794},{x:71.831,y:42.322},{x:53.608,y:44.84},{x:65.785,y:45.68},{x:84.513,y:49.544},{x:94.336,y:59.621},{x:96.604,y:75.743},{x:86.694,y:90.943},{x:67.717,y:98.584},{x:46.892,y:98.752},{x:30.098,y:91.866},{x:22.036,y:78.095},{x:20.021,y:64.323},{x:18.062,y:63.737},{x:16.505,y:67.954},{x:18.974,y:79.831},{x:23.444,y:89.305},{x:29.782,y:95.777},{x:46.93,y:101.048},{x:66.479,y:101.983},{x:83.227,y:97.312},{x:97.172,y:89.172},{x:101.908,y:78.63},{x:102.175,y:63.418},{x:102.442,y:51.407},{x:106.846,y:46.937},{x:113.652,y:46.071}];
private var _line4:Array=[{x:-6.916,y:36.091},{x:1.521,y:38.716},{x:3.584,y:46.591},{x:3.834,y:70.716},{x:11.584,y:89.591},{x:42.461,y:89.588},{x:65.839,y:89.584},{x:65.839,y:39.536},{x:65.839,y:-10.512},{x:36.616,y:25.093},{x:7.393,y:60.698},{x:48.037,y:60.698},{x:88.681,y:60.698},{x:91.383,y:58.832},{x:94.084,y:52.091},{x:92.646,y:41.654},{x:97.584,y:36.091},{x:105.021,y:36.091},{x:106.084,y:36.091}];
private var _line5:Array=[{x:-14.916,y:49.091},{x:-3.604,y:49.466},{x:0.584,y:55.091},{x:1.146,y:62.466},{x:5.084,y:64.591},{x:8.482,y:68.136},{x:8.506,y:71.682},{x:12.536,y:87.888},{x:24.629,y:98.553},{x:43.438,y:102.836},{x:66.277,y:98.553},{x:82.401,y:80.667},{x:82.401,y:56.231},{x:68.919,y:40.137},{x:44.109,y:35.406},{x:20.093,y:43.468},{x:11.192,y:51.529},{x:17.574,y:26.672},{x:23.956,y:1.816},{x:52.171,y:1.816},{x:80.386,y:1.816},{x:83.485,y:2.703},{x:86.584,y:12.591},{x:86.834,y:30.904},{x:87.084,y:43.591},{x:88.209,y:48.029},{x:91.584,y:49.091},{x:96.209,y:49.341},{x:98.584,y:49.591}];
private var _line6:Array=[{x:-1.416,y:45.091},{x:7.959,y:46.966},{x:12.084,y:54.091},{x:14.879,y:58.473},{x:17.675,y:57.606},{x:31.698,y:36.613},{x:55.294,y:30.733},{x:80.738,y:41.146},{x:91.57,y:65.667},{x:79.227,y:91.699},{x:49.248,y:100.599},{x:23.132,y:86.323},{x:15.659,y:67.01},{x:14.735,y:43.077},{x:20.361,y:14.611},{x:39.423,y:-1.932},{x:66.044,y:-2.856},{x:84.854,y:11.001},{x:89.555,y:21.329},{x:90.507,y:33.46},{x:95.584,y:45.591},{x:105.646,y:45.591},{x:111.584,y:45.591}];
private var _line7:Array=[{x:-5.416,y:43.591},{x:5.084,y:34.216},{x:8.084,y:18.091},{x:11.319,y:5.002},{x:22.067,y:-1.338},{x:57.336,y:-1.338},{x:92.604,y:-1.338},{x:77.91,y:14.785},{x:57.672,y:40.985},{x:47.175,y:69.368},{x:42.22,y:96.743},{x:48.277,y:99.355},{x:59.584,y:92.591},{x:72.459,y:63.654},{x:90.584,y:44.091},{x:104.334,y:44.091},{x:107.584,y:44.091}];
private var _line8:Array=[{x:-3.916,y:52.091},{x:26.446,y:52.082},{x:60.569,y:50.366},{x:70.479,y:48.939},{x:85.426,y:40.962},{x:88.953,y:24.083},{x:77.365,y:8.716},{x:49.989,y:4.685},{x:25.638,y:12.745},{x:20.011,y:28.45},{x:22.951,y:39.619},{x:29.836,y:46.421},{x:45.791,y:51.711},{x:68.043,y:52.55},{x:86.769,y:60.444},{x:94.495,y:79.841},{x:88.113,y:96.72},{x:72.411,y:105.789},{x:51.166,y:108.812},{x:30.339,y:104.448},{x:17.576,y:94.033},{x:14.469,y:77.994},{x:18.92,y:64.474},{x:27.149,y:57.337},{x:36.385,y:53.726},{x:61.484,y:52.908},{x:92.584,y:52.091},{x:103.584,y:52.341},{x:108.584,y:52.591}];
private var _line9:Array = [ { x: -9.416, y:46.591 }, { x:4.084, y:48.966 }, { x:11.584, y:56.591 }, { x:12.34, y:68.304 }, { x:13.096, y:74.767 }, { x:25.775, y:95.087 }, { x:48.027, y:100.295 }, { x:69.357, y:93.661 }, { x:85.648, y:67.376 }, { x:86.992, y:32.36 }, { x:80.273, y:10.947 }, { x:65.242, y: -0.39 }, { x:42.654, y: -3.161 }, { x:21.577, y:4.733 }, { x:11.08, y:25.727 }, { x:15.446, y:49.323 }, { x:29.889, y:61.33 }, { x:52.31, y:63.934 }, { x:74.228, y:55.957 }, { x:84.473, y:38.742 }, { x:85.648, y:29.084 }, { x:86.929, y:25.588 }, { x:91.584, y:22.091 }, { x:97.021, y:26.654 }, { x:99.084, y:34.591 }, { x:99.084, y:42.779 }, { x:103.584, y:47.591 } ];
//全部入り配列
private var _allTimeList:Array;
//現在表示の時間の座標配列
private var _displayTimeList:Array = new Array();
//時計クラス
private var _clock:clockMaster = new clockMaster();
//残像表示のためのbitmap
private var _bmp:Bitmap = new Bitmap();
private var _bmd:BitmapData = new BitmapData(465, 465, true, 0);
private var Mtx:Matrix = new Matrix();
public function ElectrogramClock():void
{
_step1_setDisplay();
_step2_setClock();
_step3_setBmpEffect();
}
//step1表示オブジェクトの配置と配列の設定
private function _step1_setDisplay():void
{
_allTimeList = [_line0, _line1, _line2, _line3, _line4, _line5, _line6, _line7, _line8, _line9 ];
addChild(_bmp);
addChild(_line);
}
//step2時計を設定する
private function _step2_setClock():void
{
_refleshDisplay();
_clock.addEventListener(ClockEvent.SECONDS_CHANGED, _secHandler);
_clock.addEventListener(ClockEvent.MINUTES_CHANGED, _minHandler);
}
private function _secHandler(e:ClockEvent):void
{
_line.getListAndDraw(_displayTimeList);
}
private function _minHandler(e:ClockEvent):void
{
_refleshDisplay();
}
//step3残像効果を設定する
private function _step3_setBmpEffect():void
{
_bmp.bitmapData = _bmd;
addEventListener(Event.ENTER_FRAME, _enterFrameHandler);
}
private function _enterFrameHandler(e:Event):void
{
_bmd.draw(_line);
_bmd.applyFilter(_bmd, _bmd.rect, new Point(0, 0), new BlurFilter(4, 4));
}
//分が変わるごとに時計の表示をリフレッシュ
private function _refleshDisplay():void
{
_displayTimeList = new Array();
var i:uint = 0;
var _xUnit:Number = 107;
var len:int = _allTimeList[_clock.hoursUpper].length;
for (i = 0; i < len; i++) {
_displayTimeList.push(new Point(_allTimeList[_clock.hoursUpper][i].x + _xUnit, _allTimeList[_clock.hoursUpper][i].y));
}
len = _allTimeList[_clock.hoursLower].length;
for (i = 0; i < len; i++) {
_displayTimeList.push(new Point(_allTimeList[_clock.hoursLower][i].x + _xUnit, _allTimeList[_clock.hoursLower][i].y));
}
len = _allTimeList[_clock.minutesUpper].length;
for (i = 0; i < len; i++) {
_displayTimeList.push(new Point(_allTimeList[_clock.minutesUpper][i].x + _xUnit * 2, _allTimeList[_clock.minutesUpper][i].y));
}
len = _allTimeList[_clock.minutesLower].length;
for (i = 0; i < len; i++) {
_displayTimeList.push(new Point(_allTimeList[_clock.minutesLower][i].x + _xUnit * 3, _allTimeList[_clock.minutesLower][i].y));
}
_displayTimeList.push(new Point(470, 47));
_displayTimeList.push(new Point(490, 47 + 10));
_displayTimeList.push(new Point(520, 47 - 10));
}
}
}
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.display.DisplayObject;
import flash.events.EventDispatcher;
class DrawLine extends Sprite {
private var _listLength:int;
private var _counter:int = 0;
private var _pointer:Sprite = new Sprite();
private var _positionList:Array;
private var lineBase:Sprite = new Sprite();
private var _tailList:Array = [new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0)];
private var tailLen:int = 5;
public function DrawLine() {
addChild(lineBase);
addChild(_pointer);
lineBase.y = 150;
_pointer.graphics.beginFill(0xFF0000, 0);
_pointer.graphics.drawCircle(0, 0, 2);
_pointer.graphics.endFill();
}
public function getListAndDraw(arr:Array):void
{
for (var i:int = 0; i < tailLen; i++) {
_tailList[i].x = 0;
_tailList[i].y = 0;
}
_listLength = arr.length;
_positionList = arr;
if (hasEventListener(Event.ENTER_FRAME)) {
removeEventListener(Event.ENTER_FRAME, _enterFrameHandler);
}
addEventListener(Event.ENTER_FRAME, _enterFrameHandler);
}
//毎フレーム実行関数
private function _enterFrameHandler(e:Event):void
{
_drawNext();
_drawNext();
_drawNext();
}
private function _drawNext():void
{
if (_counter == _listLength) {
removeEventListener(Event.ENTER_FRAME, _drawNext);
lineBase.graphics.clear();
} else {
_pointer.x = _positionList[_counter].x;
_pointer.y = _positionList[_counter].y;
_chase();
_drawLine();
_counter++;
}
}
private function _chase():void
{
for (var i:int = 0; i < tailLen - 1; i++) {
_tailList[i].x = _tailList[i + 1].x;
_tailList[i].y = _tailList[i + 1].y;
}
_tailList[tailLen - 1].x = _pointer.x;
_tailList[tailLen - 1].y = _pointer.y;
}
private function _drawLine():void
{
lineBase.graphics.clear();
lineBase.graphics.lineStyle(1, 0xffffff);
lineBase.graphics.moveTo(_tailList[0].x, _tailList[0].y);
for (var i:int = 0; i < tailLen; i++) {
lineBase.graphics.lineTo(_tailList[i].x, _tailList[i].y);
}
}
}
class clockMaster extends EventDispatcher {
private var _hours:int;
private var _minutes:int;
private var _seconds:int;
private var preSeconds:int;
private var _dispatcer:DisplayObject;
public function clockMaster():void
{
_dispatcer = new Sprite();
enterFrameHandler(null);
_dispatcer.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 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");
}
}