一个炫酷的计时器


在慕课网看到一个canvas的课,感觉很炫酷,就把它看完了,然后记下来。
http://www.imooc.com/learn/133

第一步:绘制要显示的时间

拿小球来绘制具体的数字,具体的信息存储在一个三维数组里。具体绘制小球的代码如下:

function renderDigit(x,y,num,ctx) {

    ctx.fillStyle = '#3a48ab';

    for(var i=0;i<digit[num].length;i++){
for(var j=0;j<digit[num][i].length;j++){
if(digit[num][i][j] === 1){
ctx.beginPath();
ctx.arc(x+2*j*(RADIUS+1)+(RADIUS+1),y+2*i*(RADIUS+1)+(RADIUS+1),
RADIUS,0,2*Math.PI);
ctx.closePath();
ctx.fill();
}
}
}

第二步:绘制倒计时效果

function render(ctx) {

    ctx.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGH);

    var hours = parseInt(curShowTimeSeconds / 3600);
var minutes = parseInt((curShowTimeSeconds - hours*3600) / 60);
var seconds = curShowTimeSeconds % 60; renderDigit(MARGIN_LEFT,MARGIN_TOP,parseInt(hours/10),ctx);
renderDigit(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(hours%10),ctx);
renderDigit(MARGIN_LEFT+30*(RADIUS+1),MARGIN_TOP,10,ctx);
renderDigit(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(minutes/10),ctx);
renderDigit(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(minutes%10),ctx);
renderDigit(MARGIN_LEFT+69*(RADIUS+1),MARGIN_TOP,10,ctx);
renderDigit(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(seconds/10),ctx);
renderDigit(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(seconds%10),ctx); for (var i=0;i<balls.length;i++){
ctx.fillStyle = balls[i].color;
ctx.beginPath();
ctx.arc(balls[i].x,balls[i].y,RADIUS,0,2*Math.PI,true);
ctx.closePath();
ctx.fill();
} }

第三步:绘制不同颜色的小球散落效果

function updateBalls() {
for(var i=0;i<balls.length;i++){
balls[i].x += balls[i].vx;
balls[i].y += balls[i].vy;
balls[i].vy += balls[i].g; if (balls[i].y >= WINDOW_HEIGH - RADIUS){
balls[i].y = WINDOW_HEIGH - RADIUS;
balls[i].vy = -balls[i].vy*0.75;
}
}
} function addBalls(x,y,num) {
for(var i=0;i<digit[num].length;i++){
for(var j=0;j<digit[num][i].length;j++){
if(digit[num][i][j] === 1){
var aBall = {
x:x+2*j*(RADIUS+1)+(RADIUS+1),
y:y+2*i*(RADIUS+1)+(RADIUS+1),
g:1.5+Math.random(),
vx:Math.pow(-1,Math.ceil(Math.random()*1000))*4,
vy:-5,
color:colors[Math.floor(Math.random()*colors.length)]
};
balls.push(aBall);
}
}
}
}

最后,实现效果如下:

本文转载于:猿2048https://www.mk2048.com/blog/blog.php?id=hb1ba1aha1j

最新文章

  1. DIJ产品系列
  2. NOIP2016提高组解题报告
  3. ADO.NET(很精彩全面)
  4. 3月3日(4) Remove Duplicates from Sorted List
  5. 使用GruntJS链接与压缩多个JavaScript文件
  6. 精通 Oracle+Python,第 8 部分:适合 Oracle DBA 使用的 Python
  7. 2.4 Git 基础 - 撤消操作
  8. SQL Server 分页语句
  9. ifame高度自动适应子页面内容
  10. day4作业小代码练习
  11. ffmpeg入门之 Tutorial01
  12. 转载--MYSQL5.7:Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password:YES)解决方法
  13. Java框架spring Boot学习笔记(十):传递数据到html页面的例子
  14. servlet 最大线程数探索笔记
  15. C# Dictionary序列化/反序列化
  16. 【转】java线程池
  17. HDU 6065 RXD, tree and sequence (LCA DP)
  18. 【html】html笔记综合
  19. Android 4学习(7):用户界面 - 基础
  20. android开发中图片优化步骤

热门文章

  1. sprintf的用法总结
  2. LeetCode-077-组合
  3. Lua中如何实现类似gdb的断点调试--03通用变量修改及调用栈回溯
  4. 使用 yapi-to-typescript 生成接口响应数据的 TS 类型声明
  5. go RWMutex 的实现
  6. 重磅 | 腾讯云服务网格开源项目 Aeraki Mesh 加入 CNCF 云原生全景图
  7. 对于处理datetime数据类型的一些常用方法:
  8. 如何将docker 镜像上传到docker hub仓库
  9. 内置方法 __new__ __del__
  10. Blazor 002 : 一种开历史倒车的UI描述语言 -- Razor