RosettaCodeData/Task/Draw-a-clock/ActionScript/draw-a-clock.as

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;
}
}
}