import ColorSet; var MODE_DRAW_VERY_FIRST:Number = 0; var MODE_DRAW_INIT:Number = 1; var MODE_DRAW_ONE:Number = 2; var MODE_DRAW_CLEAR:Number = 3; var prev_s:Number = -1; var cur_m:Number = -1; var my_mode:Number = MODE_DRAW_VERY_FIRST; var first_sec = -1; /* for layouting */ var wh:Number = 10; var margin:Number = 2; var edge_margin:Number = (200 - 16 * (wh+margin) - margin)/2 ; var cols:Array = initCols(); _root.onEnterFrame = function(){ var d:Date = new Date(); h = d.getHours(); m = d.getMinutes(); s = d.getSeconds(); ms = d.getMilliseconds(); // update min_arm if(cur_m != m){ drawBack(this); drawMinArm(this, cols[m], m); drawHourArm(this, cols[(h*5)%60], h+m/60); cur_m = m; end_clear(); } // update mode switch(my_mode){ case MODE_DRAW_VERY_FIRST: first_sec = s; my_mode = MODE_DRAW_INIT; return; case MODE_DRAW_INIT: if(s == first_sec) return; if(s != first_sec + 1) my_mode = MODE_DRAW_ONE; break; case MODE_DRAW_ONE: if(s == 59) my_mode = MODE_DRAW_CLEAR; break; case MODE_DRAW_CLEAR: if(s != 59) my_mode = MODE_DRAW_ONE; break; } switch(my_mode){ case MODE_DRAW_INIT: do_first_flip(s, ms); break; case MODE_DRAW_ONE: do_draw_one(prev_s, s, ms); prev_s = s-1; break; case MODE_DRAW_CLEAR: do_clear(ms); prev_s = -1; break; } }; function do_first_flip(s, ms){ for(i = 0; i <= s; i++) drawSecFlipping(this, i, cols[i], ms * 0.001);} function do_draw_one(prev_s, s, ms){ for(i = prev_s+1; i < s; i++) drawSec(this, i, cols[i]); drawSecFlipping(this, s, cols[s], ms * 0.001);} function do_clear(ms){ for(i = 0; i < 60; i++) drawSecFlipping(this, i, cols[i], 1-ms*0.001);} function end_clear(){ for(i = 0; i < 60; i++) drawSec(this, i, [0xee,0xee,0xee]);} /* util functions */ function blend(r0, g0, b0, r1, g1, b1, alpha){ r = int(r0 * alpha + r1 * (1.00 - alpha)); g = int(g0 * alpha + g1 * (1.00 - alpha)); b = int(b0 * alpha + b1 * (1.00 - alpha)); col = r * 0x10000 + g * 0x100 + b; return col; } function initCols(){ var cols:Array = new Array(); var cs:ColorSet = new ColorSet(0xff9999); for(i = 0; i < 60; i++){ cs.h = i * 6; cols[i] = [int(cs.r), int(cs.g), int(cs.b)]; } return cols; } function getIxy(cnt){ /* Return position */ cnt = (cnt + 8) % 60; if(cnt < 15) return [cnt, 0]; if(cnt < 30) return [15, cnt-15]; if(cnt < 45) return [45-cnt, 15]; return [0, 60-cnt]; } function drawSec(my_mc, cnt, rgb){ /* 0 <= cnt < 4*N */ xy = getIxy(cnt); col = rgb[0] * 0x10000 + rgb[1] * 0x100 + rgb[2]; x0 = edge_margin + xy[0] * (wh+margin) + margin; y0 = edge_margin + xy[1] * (wh+margin) + margin; drawSq(my_mc, x0, y0, wh, col); } function drawSecFlipping(my_mc, cnt, rgb, ratio){ /* 0 <= cnt < 4*N */ xy = getIxy(cnt); x0 = edge_margin + xy[0] * (wh+margin) + margin; y0 = edge_margin + xy[1] * (wh+margin) + margin; drawSq(my_mc, x0, y0, wh, 0xffffff); col = blend(rgb[0], rgb[1], rgb[2], 0xee, 0xee, 0xee, ratio); drawFlip(my_mc, x0, y0, wh, col, ratio); } function drawSq(my_mc, x0, y0, wh, col){ my_mc.beginFill(col, 100); my_mc.moveTo(x0, y0); my_mc.lineTo(x0 + wh, y0); my_mc.lineTo(x0 + wh, y0 + wh); my_mc.lineTo(x0, y0 + wh); my_mc.endFill(); } function drawFlip(my_mc, x0, y0, wh, col, ratio){ rad = ratio * Math.PI / 2; wx = wh * Math.sin(rad); wy = wh * Math.cos(rad); my_mc.beginFill(col, 100); my_mc.moveTo(x0 + wx, y0 + wh - wy); my_mc.lineTo(x0 + wh, y0); my_mc.lineTo(x0 + wh - wx, y0 + wy); my_mc.lineTo(x0, y0 + wh); my_mc.endFill(); } function drawBack(my_mc){ my_mc.clear(); for(i = 0; i < 60; i+=15) drawIndi(my_mc, i, 0); for(i = 5; i < 60; i+=5){ if(i % 15 == 0) continue; drawIndi(my_mc, i, 1); } for(i = 1; i < 60; i++){ if(i % 5 == 0) continue; drawIndi(my_mc, i, 2); } } function drawIndi(my_mc, m, type){ rad = (m-15) * Math.PI * 2 / 60; dx = Math.cos(rad); dy = Math.sin(rad); if(type == 0){ my_mc.lineStyle(2, 0xcccccc); my_mc.beginFill(); my_mc.moveTo(100 + dx * 80, 100 + dy * 80); my_mc.lineTo(100 + dx * 75, 100 + dy * 75); my_mc.lineTo(100 + dx * 80, 100 + dy * 80); my_mc.endFill(); } else if(type == 1){ dx0 = Math.cos(rad - 0.02); dy0 = Math.sin(rad - 0.02); dx1 = Math.cos(rad + 0.02); dy1 = Math.sin(rad + 0.02); my_mc.lineStyle(); my_mc.beginFill(0xcccccc); my_mc.moveTo(100 + dx * 75, 100 + dy * 75); my_mc.lineTo(100 + dx0 * 80, 100 + dy0 * 80); my_mc.lineTo(100 + dx1 * 80, 100 + dy1 * 80); my_mc.endFill(); } else { dx0 = Math.cos(rad - 0.02); dy0 = Math.sin(rad - 0.1); dx1 = Math.cos(rad + 0.1); dy1 = Math.sin(rad + 0.1); A = cols[m]; my_mc.lineStyle(1, 0xcccccc); my_mc.beginFill(); my_mc.moveTo(100 + dx * 80, 100 + dy * 80); my_mc.lineTo(100 + dx * 78, 100 + dy * 78); my_mc.lineTo(100 + dx * 80, 100 + dy * 80); my_mc.endFill(); } } /** arm functions */ function drawMinArm(my_mc, rgb, v){ col = 0x10000 * rgb[0] + 0x100 * rgb[1] + rgb[2]; rad = v / 60 * Math.PI * 2 - Math.PI/2; drawArm(my_mc, 90, rad, col); } function drawHourArm(my_mc, rgb, v){ col = 0x10000 * rgb[0] + 0x100 * rgb[1] + rgb[2]; rad = v / 12 * Math.PI * 2 - Math.PI/2; drawArm(my_mc, 50, rad, col); } function drawArm(my_mc, armLen, rad, col){ my_mc.lineStyle(0, 0xffffff); my_mc.beginFill(col, 100); my_mc.moveTo(100,100); xx = 100 + 5 * Math.cos(rad - 1.0); yy = 100 + 5 * Math.sin(rad - 1.0); my_mc.lineTo(xx, yy); xx = 100 + armLen * Math.cos(rad); yy = 100 + armLen * Math.sin(rad); my_mc.lineTo(xx, yy); xx = 100 + 5 * Math.cos(rad + 0.5); yy = 100 + 5 * Math.sin(rad + 0.5); my_mc.lineTo(xx, yy); my_mc.lineTo(100,100); my_mc.endFill(); my_mc.lineStyle(); }