139 lines
4.3 KiB
ActionScript
139 lines
4.3 KiB
ActionScript
package {
|
|
|
|
import flash.display.Graphics;
|
|
import flash.display.Shape;
|
|
import flash.display.Sprite;
|
|
import flash.events.Event;
|
|
import flash.events.TimerEvent;
|
|
import flash.utils.Timer;
|
|
|
|
public class Clock extends Sprite {
|
|
|
|
// Changes of hands (in degrees) per second
|
|
private static const HOUR_HAND_CHANGE:Number = 1 / 120; // 360 / (60 * 60 * 12)
|
|
private static const MINUTE_HAND_CHANGE:Number = 0.1; // 360 / (60 * 60)
|
|
private static const SECOND_HAND_CHANGE:Number = 6; // 360 / 60
|
|
|
|
private var _timer:Timer;
|
|
|
|
private var _hHand:Shape;
|
|
private var _mHand:Shape;
|
|
private var _sHand:Shape;
|
|
|
|
public function Clock() {
|
|
if ( stage ) _init();
|
|
else addEventListener(Event.ADDED_TO_STAGE, _init);
|
|
}
|
|
|
|
private function _init(e:Event = null):void {
|
|
|
|
var i:uint;
|
|
|
|
var base:Shape = new Shape(), hHand:Shape = new Shape(), mHand:Shape = new Shape();
|
|
var sHand:Shape = new Shape(), hub:Shape = new Shape();
|
|
|
|
var size:Number = 500;
|
|
var c:Number = size / 2;
|
|
x = 30;
|
|
y = 30;
|
|
|
|
var baseGraphics:Graphics = base.graphics;
|
|
|
|
baseGraphics.lineStyle(5, 0xEE0000);
|
|
baseGraphics.beginFill(0xFFDDDD);
|
|
baseGraphics.drawCircle(c, c, c);
|
|
|
|
var uAngle:Number = Math.PI / 30;
|
|
|
|
var markerStart:Number = c - 30;
|
|
var markerEnd:Number = c - 15;
|
|
|
|
var markerX1:Number, markerY1:Number, markerX2:Number, markerY2:Number;
|
|
var angle:Number, angleSin:Number, angleCos:Number;
|
|
|
|
baseGraphics.endFill();
|
|
|
|
var isMajorMarker:Boolean = true;
|
|
|
|
for ( i = 0; i < 60; i++ ) {
|
|
// Draw the markers
|
|
|
|
angle = uAngle * i;
|
|
angleSin = Math.sin(angle);
|
|
angleCos = Math.cos(angle);
|
|
|
|
markerX1 = c + markerStart * angleCos;
|
|
markerY1 = c + markerStart * angleSin;
|
|
markerX2 = c + markerEnd * angleCos;
|
|
markerY2 = c + markerEnd * angleSin;
|
|
|
|
if ( i % 5 == 0 ) {
|
|
baseGraphics.lineStyle(3, 0x000080);
|
|
isMajorMarker = true;
|
|
}
|
|
else if ( isMajorMarker ) {
|
|
baseGraphics.lineStyle(1, 0x000080);
|
|
isMajorMarker = false;
|
|
}
|
|
|
|
baseGraphics.moveTo(markerX1, markerY1);
|
|
baseGraphics.lineTo(markerX2, markerY2);
|
|
}
|
|
|
|
addChild(base);
|
|
|
|
sHand.graphics.lineStyle(2, 0x00BB00);
|
|
sHand.graphics.moveTo(0, 0);
|
|
sHand.graphics.lineTo(0, 40 - c);
|
|
sHand.x = sHand.y = c;
|
|
|
|
mHand.graphics.lineStyle(8, 0x444444);
|
|
mHand.graphics.moveTo(0, 0);
|
|
mHand.graphics.lineTo(0, 50 - c);
|
|
mHand.x = mHand.y = c;
|
|
|
|
hHand.graphics.lineStyle(8, 0x777777);
|
|
hHand.graphics.moveTo(0, 0);
|
|
hHand.graphics.lineTo(0, 120 - c);
|
|
hHand.x = hHand.y = c;
|
|
|
|
hub.graphics.lineStyle(4, 0x664444);
|
|
hub.graphics.beginFill(0xCC9999);
|
|
hub.graphics.drawCircle(c, c, 5);
|
|
|
|
_hHand = hHand;
|
|
_mHand = mHand;
|
|
_sHand = sHand;
|
|
|
|
addChild(mHand);
|
|
addChild(hHand);
|
|
addChild(sHand);
|
|
addChild(hub);
|
|
|
|
var date:Date = new Date();
|
|
|
|
// Since millisecond precision is not needed, round it up to the nearest second.
|
|
var seconds:Number = date.seconds + ((date.milliseconds > 500) ? 1 : 0);
|
|
var minutes:Number = date.minutes + seconds / 60;
|
|
var hours:Number = (date.hours + minutes / 60) % 12;
|
|
|
|
sHand.rotation = seconds * 6;
|
|
mHand.rotation = minutes * 6;
|
|
hHand.rotation = hours * 30;
|
|
|
|
_timer = new Timer(1000); // 1 second = 1000 ms
|
|
_timer.addEventListener(TimerEvent.TIMER, _onTimerTick);
|
|
_timer.start();
|
|
|
|
}
|
|
|
|
private function _onTimerTick(e:TimerEvent):void {
|
|
_hHand.rotation += HOUR_HAND_CHANGE;
|
|
_mHand.rotation += MINUTE_HAND_CHANGE;
|
|
_sHand.rotation += SECOND_HAND_CHANGE;
|
|
}
|
|
|
|
}
|
|
|
|
}
|