Canvas--粒子时钟

àì夳堔傛蜴生んèń 2022-05-31 05:26 330阅读 0赞
  1. digit.js
  2. digit =
  3. [
  4. [
  5. [0,0,1,1,1,0,0],
  6. [0,1,1,0,1,1,0],
  7. [1,1,0,0,0,1,1],
  8. [1,1,0,0,0,1,1],
  9. [1,1,0,0,0,1,1],
  10. [1,1,0,0,0,1,1],
  11. [1,1,0,0,0,1,1],
  12. [1,1,0,0,0,1,1],
  13. [0,1,1,0,1,1,0],
  14. [0,0,1,1,1,0,0]
  15. ],//0
  16. [
  17. [0,0,0,1,1,0,0],
  18. [0,1,1,1,1,0,0],
  19. [0,0,0,1,1,0,0],
  20. [0,0,0,1,1,0,0],
  21. [0,0,0,1,1,0,0],
  22. [0,0,0,1,1,0,0],
  23. [0,0,0,1,1,0,0],
  24. [0,0,0,1,1,0,0],
  25. [0,0,0,1,1,0,0],
  26. [1,1,1,1,1,1,1]
  27. ],//1
  28. [
  29. [0,1,1,1,1,1,0],
  30. [1,1,0,0,0,1,1],
  31. [0,0,0,0,0,1,1],
  32. [0,0,0,0,1,1,0],
  33. [0,0,0,1,1,0,0],
  34. [0,0,1,1,0,0,0],
  35. [0,1,1,0,0,0,0],
  36. [1,1,0,0,0,0,0],
  37. [1,1,0,0,0,1,1],
  38. [1,1,1,1,1,1,1]
  39. ],//2
  40. [
  41. [1,1,1,1,1,1,1],
  42. [0,0,0,0,0,1,1],
  43. [0,0,0,0,1,1,0],
  44. [0,0,0,1,1,0,0],
  45. [0,0,1,1,1,0,0],
  46. [0,0,0,0,1,1,0],
  47. [0,0,0,0,0,1,1],
  48. [0,0,0,0,0,1,1],
  49. [1,1,0,0,0,1,1],
  50. [0,1,1,1,1,1,0]
  51. ],//3
  52. [
  53. [0,0,0,0,1,1,0],
  54. [0,0,0,1,1,1,0],
  55. [0,0,1,1,1,1,0],
  56. [0,1,1,0,1,1,0],
  57. [1,1,0,0,1,1,0],
  58. [1,1,1,1,1,1,1],
  59. [0,0,0,0,1,1,0],
  60. [0,0,0,0,1,1,0],
  61. [0,0,0,0,1,1,0],
  62. [0,0,0,1,1,1,1]
  63. ],//4
  64. [
  65. [1,1,1,1,1,1,1],
  66. [1,1,0,0,0,0,0],
  67. [1,1,0,0,0,0,0],
  68. [1,1,1,1,1,1,0],
  69. [0,0,0,0,0,1,1],
  70. [0,0,0,0,0,1,1],
  71. [0,0,0,0,0,1,1],
  72. [0,0,0,0,0,1,1],
  73. [1,1,0,0,0,1,1],
  74. [0,1,1,1,1,1,0]
  75. ],//5
  76. [
  77. [0,0,0,0,1,1,0],
  78. [0,0,1,1,0,0,0],
  79. [0,1,1,0,0,0,0],
  80. [1,1,0,0,0,0,0],
  81. [1,1,0,1,1,1,0],
  82. [1,1,0,0,0,1,1],
  83. [1,1,0,0,0,1,1],
  84. [1,1,0,0,0,1,1],
  85. [1,1,0,0,0,1,1],
  86. [0,1,1,1,1,1,0]
  87. ],//6
  88. [
  89. [1,1,1,1,1,1,1],
  90. [1,1,0,0,0,1,1],
  91. [0,0,0,0,1,1,0],
  92. [0,0,0,0,1,1,0],
  93. [0,0,0,1,1,0,0],
  94. [0,0,0,1,1,0,0],
  95. [0,0,1,1,0,0,0],
  96. [0,0,1,1,0,0,0],
  97. [0,0,1,1,0,0,0],
  98. [0,0,1,1,0,0,0]
  99. ],//7
  100. [
  101. [0,1,1,1,1,1,0],
  102. [1,1,0,0,0,1,1],
  103. [1,1,0,0,0,1,1],
  104. [1,1,0,0,0,1,1],
  105. [0,1,1,1,1,1,0],
  106. [1,1,0,0,0,1,1],
  107. [1,1,0,0,0,1,1],
  108. [1,1,0,0,0,1,1],
  109. [1,1,0,0,0,1,1],
  110. [0,1,1,1,1,1,0]
  111. ],//8
  112. [
  113. [0,1,1,1,1,1,0],
  114. [1,1,0,0,0,1,1],
  115. [1,1,0,0,0,1,1],
  116. [1,1,0,0,0,1,1],
  117. [0,1,1,1,0,1,1],
  118. [0,0,0,0,0,1,1],
  119. [0,0,0,0,0,1,1],
  120. [0,0,0,0,1,1,0],
  121. [0,0,0,1,1,0,0],
  122. [0,1,1,0,0,0,0]
  123. ],//9
  124. [
  125. [0,0,0,0],
  126. [0,0,0,0],
  127. [0,1,1,0],
  128. [0,1,1,0],
  129. [0,0,0,0],
  130. [0,0,0,0],
  131. [0,1,1,0],
  132. [0,1,1,0],
  133. [0,0,0,0],
  134. [0,0,0,0]
  135. ]//:
  136. ];
  137. <!DOCTYPE html>
  138. <html lang="en">
  139. <head>
  140. <meta charset="UTF-8">
  141. <title>CanvasColock粒子时钟</title>
  142. <style>
  143. body{
  144. background: greenyellow;
  145. }
  146. </style>
  147. </head>
  148. <body style="height:100%">
  149. <canvas id="canvas" style="height:100%;"></canvas>
  150. </body>
  151. <script type="text/javascript" src="js/digit.js"></script>
  152. <script type="text/javascript">
  153. var WINDOW_WIDTH;
  154. var WINDOW_HEIGHT;
  155. var RADIUS;
  156. var context=canvas.getContext("2d");
  157. var MARGIN_TOP;
  158. var MARGIN_LEFT;
  159. var showtime=new Date();
  160. var balls=[];
  161. const colors=["#51F511","#66FAD5","#EF1C3E","#FFFA5F","#DE48CD","#310CF2"];
  162. window.onload=function(){
  163. WINDOW_WIDTH=document.documentElement.clientWidth;
  164. WINDOW_HEIGHT=document.documentElement.clientHeight;
  165. MARGIN_LEFT=Math.round(WINDOW_WIDTH/10);
  166. MARGIN_TOP=Math.round(WINDOW_HEIGHT/5);
  167. RADIUS=Math.round(WINDOW_WIDTH*4/5/108)-1;
  168. var canvas=document.getElementById("canvas");
  169. showtime=new Date();
  170. canvas.width=WINDOW_WIDTH;
  171. canvas.height=WINDOW_HEIGHT;
  172. setInterval(function(){
  173. render(context);
  174. update();
  175. },50);
  176. }
  177. function render(cxt){
  178. cxt.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGHT);
  179. var hours=parseInt(showtime.getHours());
  180. var minutes=parseInt(showtime.getMinutes());
  181. var seconds=parseInt(showtime.getSeconds());
  182. renderDigit(MARGIN_LEFT,MARGIN_TOP,parseInt(hours/10),cxt);
  183. renderDigit(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(hours%10),cxt);
  184. renderDigit(MARGIN_LEFT+30*(RADIUS+1),MARGIN_TOP,10,cxt);
  185. renderDigit(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(minutes/10),cxt);
  186. renderDigit(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(minutes%10),cxt);
  187. renderDigit(MARGIN_LEFT+69*(RADIUS+1),MARGIN_TOP,10,cxt);
  188. renderDigit(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(seconds/10),cxt);
  189. renderDigit(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(seconds%10),cxt);
  190. for(var i=0;i<balls.length;i++){
  191. cxt.fillStyle=balls[i].color;
  192. cxt.beginPath();
  193. cxt.arc(balls[i].x,balls[i].y,RADIUS,0,2*Math.PI,true);
  194. cxt.closePath();
  195. cxt.fill();
  196. }
  197. }
  198. function renderDigit(x,y,num,cxt){
  199. cxt.fillStyle="rgb(0,102,153)";
  200. for(var i=0;i<digit[num].length;i++)
  201. for(var j=0;j<digit[num][i].length;j++)
  202. if(digit[num][i][j]==1){
  203. cxt.beginPath()
  204. cxt.arc(x+(RADIUS+1)+j*2*(RADIUS+1),y+(RADIUS+1)+i*2*(RADIUS+1),RADIUS,0,2*Math.PI);
  205. cxt.closePath();
  206. cxt.fill();
  207. }
  208. }
  209. function update(){
  210. var nextTime=new Date();
  211. var nexttimehours=parseInt(nextTime.getHours());
  212. var nexttimeminutes=parseInt(nextTime.getMinutes());
  213. var nexttimeseconds=parseInt(nextTime.getSeconds());
  214. var showtimehours=parseInt(showtime.getHours());
  215. var showtimeminutes=parseInt(showtime.getMinutes());
  216. var showtimeseconds=parseInt(showtime.getSeconds());
  217. if(nextTime!=showtime){
  218. if(parseInt(nexttimehours/10)!=parseInt(showtimehours/10)){
  219. addballs(MARGIN_LEFT,MARGIN_TOP,parseInt(nexttimehours/10));
  220. };
  221. if(parseInt(nexttimehours%10)!=parseInt(showtimehours%10)){
  222. addballs(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(nexttimehours%10));
  223. };
  224. if(parseInt(nexttimeminutes/10)!=parseInt(showtimeminutes/10)){
  225. addballs(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(nexttimeminutes/10));
  226. };
  227. if(parseInt(nexttimeminutes%10)!=parseInt(showtimeminutes%10)){
  228. addballs(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(nexttimeminutes%10));
  229. };
  230. if(parseInt(nexttimeseconds/10)!=parseInt(showtimeseconds/10)){
  231. addballs(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(nexttimeseconds/10));
  232. };
  233. if(parseInt(nexttimeseconds%10)!=parseInt(showtimeseconds%10)){
  234. addballs(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(nexttimeseconds%10));
  235. };}
  236. showtime=nextTime;
  237. updateBalls();
  238. }
  239. function updateBalls(){
  240. for(var i=0;i<balls.length;i++){
  241. balls[i].x +=balls[i].vx;
  242. balls[i].y +=balls[i].vy;
  243. balls[i].vy +=balls[i].g;
  244. if(balls[i].y> WINDOW_HEIGHT - RADIUS){
  245. balls[i].y=WINDOW_HEIGHT -RADIUS;
  246. balls[i].vy=-balls[i].vy*0.6;
  247. }
  248. }
  249. var ballscontol=0;
  250. for(i=0;i<balls.length;i++)
  251. if (balls[i].x + RADIUS>0&&balls[i].x - RADIUS<WINDOW_WIDTH) {
  252. balls[ballscontol++]=balls[i]
  253. }
  254. while(balls.length>Math.min(ballscontol,300)){
  255. balls.pop();
  256. }
  257. }
  258. function addballs(x,y,num){
  259. for(var i=0;i<digit[num].length;i++)
  260. for(var j=0;j<digit[num][i].length;j++)
  261. if(digit[num][i][j]==1){
  262. var newball={
  263. x : x+(RADIUS+1)+j*2*(RADIUS+1),
  264. y : y+(RADIUS+1)+i*2*(RADIUS+1),
  265. g : 1.5+Math.random(),
  266. vx :Math.pow(-1,Math.floor(Math.random()*100))*5,
  267. vy : -Math.ceil(Math.random()*10),
  268. color :colors[Math.floor(Math.random()*colors.length)]
  269. }
  270. balls.push(newball);
  271. }
  272. }
  273. </script>
  274. </html>

运行效果图

70

发表评论

表情:
评论列表 (有 0 条评论,330人围观)

还没有评论,来说两句吧...

相关阅读