Advertisement
beezing

Clock Animation - Coders

Nov 3rd, 2011
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.51 KB | None | 0 0
  1. -- Clock animation
  2. -- by @beezing
  3.  
  4. abs = math.abs
  5. sin = math.sin
  6. cos = math.cos
  7. rad = math.rad
  8. floor = math.floor
  9. format = string.format
  10. drawText = writeTextAtPosition
  11.  
  12. hour   = 10
  13. minute = 17
  14. second = 5
  15.  
  16. clockX = 165 --384
  17. clockY = 615 --384
  18. clockR = 100 --300 --play with this value to see it auto-adjust
  19.  
  20. borderThick = 2
  21. hourThick   = 6
  22. minuteThick = 3
  23. secondThick = 1
  24. digitalSize = 18 --play with this value too
  25.  
  26. clockColor  = 'BLACK'
  27. borderColor = 'GRAY'
  28. hourColor   = 'BLUE'
  29. minuteColor = 'DARKBLUE'
  30. secondColor = 'RED'
  31.  
  32. function colorName(name)
  33.   if name == 'WHITE'      then r,g,b = 255,255,255 end
  34.   if name == 'BLACK'      then r,g,b =   0,  0,  0 end
  35.   if name == 'GRAY'       then r,g,b = 192,192,192 end
  36.   if name == 'RED'        then r,g,b = 192,  0,  0 end
  37.   if name == 'GREEN'      then r,g,b =   0,192,  0 end
  38.   if name == 'BLUE'       then r,g,b =   0,  0,192 end
  39.   if name == 'LIGHTRED'   then r,g,b = 255,  0,  0 end
  40.   if name == 'LIGHTGREEN' then r,g,b =   0,255,  0 end
  41.   if name == 'LIGHTBLUE'  then r,g,b =   0,  0,255 end
  42.   if name == 'DARKRED'    then r,g,b = 128,  0,  0 end
  43.   if name == 'DARKGREEN'  then r,g,b =   0,128,  0 end
  44.   if name == 'DARKBLUE'   then r,g,b =   0,  0,128 end
  45.   return r,g,b
  46. end
  47.  
  48. function circle(r, x, y)
  49.   move(x+r, y)
  50.   for i = 0, 3.14*2+0.1, 0.1 do
  51.     draw(x+r*cos(i), y+r*sin(i))
  52.   end
  53. end
  54.  
  55. function clock12ToDeg(clockVal)
  56.   if clockVal >= 12 then clockVal = clockVal-12 end
  57.   degVal = 90 - (30 * clockVal)
  58.   return degVal
  59. end
  60.  
  61. function clock60ToDeg(clockVal)
  62.   if clockVal >= 60 then clockVal = clockVal-60 end
  63.   degVal = 90 - (6 * clockVal)
  64.   return degVal
  65. end
  66.  
  67. function degPos(degree, r,x,y)
  68.   if r == nil then r = clockR end
  69.   if x == nil then x = clockX end
  70.   if y == nil then y = clockY end
  71.  
  72.   mx = x + r * cos(rad(degree))
  73.   my = y + r * sin(rad(degree))
  74.   return mx, my
  75. end
  76.  
  77. function drawNumbers()
  78.   setFontSize(digitalSize-2)
  79.   local w,h = sizeOfText('0')
  80.  
  81.   -- adjust text position to clock size
  82.   local r = clockR - w-2
  83.   local x = clockX - w/2
  84.   local y = clockY + h/2
  85.  
  86.   for i = 5, 55, 5 do
  87.     local x,y = degPos(clock60ToDeg(i),r,x,y)
  88.     drawText(i/5,x,y)
  89.   end
  90.   drawText('12', degPos(clock60ToDeg(0),r,x-w/2,y))
  91. end
  92.  
  93. function drawClock()
  94.   -- draw clock border
  95.   setColor(colorName(borderColor))
  96.   setLineWidth(borderThick)
  97.   circle(clockR+borderThick+5, clockX,clockY)
  98.   -- draw 60 clock dot marks
  99.   setColor(colorName(clockColor))
  100.   for i = 0, 59 do    
  101.     drawPoint(degPos(clock60ToDeg(i)))
  102.   end
  103.   -- draw 12 clock dot marks
  104.   for i = 0, 59, 5 do    
  105.     circle(1, degPos(clock60ToDeg(i)))
  106.   end
  107.   -- draw 12 clock numbers, if size fit
  108.   if clockR >= 4*(digitalSize-2) then
  109.     drawNumbers()
  110.   end
  111. end
  112.  
  113. function drawHour(hourVal)
  114.   local r = clockR*2/3 - 5
  115.   move(clockX,clockY)
  116.   setLineWidth(hourThick)
  117.   setColor(colorName(hourColor))
  118.   draw(degPos(clock12ToDeg(hourVal),r))
  119. end
  120.  
  121. function drawMinute(minuteVal)
  122.   local r = clockR - 5
  123.   move(clockX,clockY)
  124.   setLineWidth(minuteThick)
  125.   setColor(colorName(minuteColor))
  126.   draw(degPos(clock60ToDeg(minuteVal),r))
  127. end
  128.  
  129. function drawSecond(secondVal)
  130.   local r = clockR
  131.   move(clockX,clockY)
  132.   setLineWidth(secondThick)
  133.   setColor(colorName(secondColor))
  134.   draw(degPos(clock60ToDeg(secondVal),r))
  135.  
  136.   local r = clockR/5
  137.   move(clockX,clockY)
  138.   setLineWidth(secondThick*2)
  139.   setColor(colorName(secondColor))
  140.   draw(degPos(clock60ToDeg(secondVal+30),r))
  141.  
  142.   move(clockX,clockY)
  143.   setLineWidth(secondThick*10)
  144.   setColor(colorName(secondColor))
  145.   circle(secondThick*3,clockX,clockY)
  146. end
  147.  
  148. function drawDigital()
  149.   setFontSize(digitalSize)
  150.   w,h = sizeOfText('00:00:00')
  151.   x   = clockX - w/2
  152.   y   = clockY - clockR/2 + h
  153.   -- draw out of clock area if not fit
  154.   if w >= clockR-10 then y = clockY - clockR - h end
  155.  
  156.   ht  = format('%02d', floor(hour))
  157.   mt  = format('%02d', floor(minute))
  158.   st  = format('%02d', floor(second))
  159.   txt = ht..':'..mt..':'..st
  160.  
  161.   setColor(colorName(clockColor))
  162.   drawText(txt,x,y)
  163. end
  164.  
  165. -- adjust hand position to values
  166. minute = minute + second/60
  167. hour   = hour + minute/60
  168. speed  = 1 --0.111
  169.  
  170. while true do
  171.   disableScreenRefresh()
  172.   clearCanvas()
  173.  
  174.   if second >= 60 then second = 0 end
  175.   if minute >= 60 then minute = 0 end
  176.   if hour   >= 24 then hour   = 0 end
  177.  
  178.   drawDigital()
  179.   drawClock()
  180.   drawHour(hour)
  181.   drawMinute(minute)
  182.   drawSecond(second)
  183.  
  184.   second = second + speed
  185.   minute = minute + speed/60
  186.   hour   = hour   + speed/3600
  187.  
  188.   enableScreenRefresh()
  189. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement