一篇文章带你制作 canvas 小游戏 (2)
来源:互联网 发布:51内核单片机 编辑:程序博客网 时间:2024/04/20 10:32
window.requestAnimationFrame();
这个方法是,HTML5 专门为js实现动画效果提供的一个函数!(推荐大家使用)
setInterval 的劣势:
1.指定定时器的时间不准确 // 4ms /10ms
2.执行动画效果会造成性能的问题,如果页面中使用了多个定时器,每个定时器中都来操作dom元素,操作dom频繁了以后,会造成严重性能问题;
看性能: DOM 的重绘和重排(影响web程序的两个重要因素);
3.会造成丢帧的问题(浏览器刷新频率: 60HZ(一秒钟刷新60次)==>16.67毫秒的时间完成js效果,才不会卡!! 浏览器和定时器的刷新频率不一样,浏览器每次只能显示一帧,定时器过快会丢帧);
window.requestAnimationFrame();
能够每隔一段时间来调用一个回调函数来执行某段代码逻辑;
优势:
1. requestAnimationFrame 是根据当前浏览器的刷新频率来进行调用的(浏览器刷新一次,就会将所有 requestAnimationFrame中执行的回调函数执行一次,不会造成丢帧的问题)
2. 页面中所有的requestAnimationFrame 会在浏览器刷新的时候,一次性全部执行;(性能会有所提高);
3.因为requestAnimationFrame 方法会根据当前浏览器的刷新频率来执行,所以,事件是不固定的,但是,不会有问题;
requestAnimationFrame 语法:
var fn = function(){
//在函数的最后调用requestAnimationFrame 函数;
//函数接受一个函数参数,就是告诉浏览器下一次刷新的时候,调用fn
window.requestAnimationFrame(fn);
canvas 变化 :
3种变换方式: 平移 ,旋转 ,缩放(translate,rotate,scale)
这三种都是对canvas中坐标系的变换;
平移变换:
ctx.translate(x,y) // 原点平移以后,在绘制内容就是按新坐标系的坐标进行绘制的;
旋转变换:
ctx.rotate(toRadian(弧度));//按照当前坐标系的原点进行旋转(新的坐标系)
缩放变换:
ctx.scale(1,1) // 对坐标系进行改变
_______________________________________________
绘制状态的保存和恢复:
canvas绘图是基于状态绘图的;(设置好一个状态,接下来的绘制都是在这个状态的基础上,来绘制的!!)
设置状态:
canvas中的两个方法:
ctx.save(); //保存当前的绘制状态,(仅仅保存状态)
ctx.restore() //恢复到上一次保存的状态
//一般情况下,这两个方法配合起来使用,一般都是保存默认状态,然后通过
restore 将默认状态进行恢复!!
save()保存的状态是以栈的形式存储的 //如果调用的save方法两次,需要调用
restore两次,才能取出需要的状态!
最佳实践:save一次 ,restore一次;
表示重叠部分变为透明色;
globalCompositeOperation='destination-out';
base64 编码的图片:
//就是用字符串来表示一个图片
//将canvas画布转换为base64编码的图片字符串
cv.toDataURL('image/png',1) ; 1 表示无损压缩
ctx.getImageData() //获取画布中的像素信息
对于有性能要求的功能中 ,可以通过两个canvas画布配合来实现,在隐藏的画布中绘制,最后直接将隐藏画布绘制到画布中给用户看,能提高性能!
ctx.drawImage(cv1.0,0);
线帽: lineCap
创建拐角: lineJoin
绘制虚线: ctx.setLineDash([5]) //参数是数组 ,为空(实现)
阴影:
ctx.shadowColor='teal';
ctx.shadowBlur=10; //模糊级别
ctx.shadowOffsetX =10;
ctx.shadowOffsetX =10;
创建渐变对象:
var grd =ctx.createLinearGradient();
grd.addColorStop(0,'green');
设置背景:
var pat = ctx.createPattern(img,repeat) //对象,平铺
ctx.fillStyle=pat
限定剪裁的区域:
ctx.arc();
ctx.clip() //只能在路径中绘制内容;
设置不透明度:
这个方法是,HTML5 专门为js实现动画效果提供的一个函数!(推荐大家使用)
setInterval 的劣势:
1.指定定时器的时间不准确 // 4ms /10ms
2.执行动画效果会造成性能的问题,如果页面中使用了多个定时器,每个定时器中都来操作dom元素,操作dom频繁了以后,会造成严重性能问题;
看性能: DOM 的重绘和重排(影响web程序的两个重要因素);
3.会造成丢帧的问题(浏览器刷新频率: 60HZ(一秒钟刷新60次)==>16.67毫秒的时间完成js效果,才不会卡!! 浏览器和定时器的刷新频率不一样,浏览器每次只能显示一帧,定时器过快会丢帧);
window.requestAnimationFrame();
能够每隔一段时间来调用一个回调函数来执行某段代码逻辑;
优势:
1. requestAnimationFrame 是根据当前浏览器的刷新频率来进行调用的(浏览器刷新一次,就会将所有 requestAnimationFrame中执行的回调函数执行一次,不会造成丢帧的问题)
2. 页面中所有的requestAnimationFrame 会在浏览器刷新的时候,一次性全部执行;(性能会有所提高);
3.因为requestAnimationFrame 方法会根据当前浏览器的刷新频率来执行,所以,事件是不固定的,但是,不会有问题;
requestAnimationFrame 语法:
var fn = function(){
//在函数的最后调用requestAnimationFrame 函数;
//函数接受一个函数参数,就是告诉浏览器下一次刷新的时候,调用fn
window.requestAnimationFrame(fn);
};
_______________________________________________canvas 变化 :
3种变换方式: 平移 ,旋转 ,缩放(translate,rotate,scale)
这三种都是对canvas中坐标系的变换;
平移变换:
ctx.translate(x,y) // 原点平移以后,在绘制内容就是按新坐标系的坐标进行绘制的;
旋转变换:
ctx.rotate(toRadian(弧度));//按照当前坐标系的原点进行旋转(新的坐标系)
缩放变换:
ctx.scale(1,1) // 对坐标系进行改变
_______________________________________________
绘制状态的保存和恢复:
canvas绘图是基于状态绘图的;(设置好一个状态,接下来的绘制都是在这个状态的基础上,来绘制的!!)
设置状态:
canvas中的两个方法:
ctx.save(); //保存当前的绘制状态,(仅仅保存状态)
ctx.restore() //恢复到上一次保存的状态
//一般情况下,这两个方法配合起来使用,一般都是保存默认状态,然后通过
restore 将默认状态进行恢复!!
save()保存的状态是以栈的形式存储的 //如果调用的save方法两次,需要调用
restore两次,才能取出需要的状态!
最佳实践:save一次 ,restore一次;
表示重叠部分变为透明色;
globalCompositeOperation='destination-out';
base64 编码的图片:
//就是用字符串来表示一个图片
//将canvas画布转换为base64编码的图片字符串
cv.toDataURL('image/png',1) ; 1 表示无损压缩
ctx.getImageData() //获取画布中的像素信息
_______________________________________________
封装一个canvas所有图片加载完成调用的方法: // 图片路径在images里
onLoadImg=function(imgSrc,callback){var listImg={};var content=0;var imgLen=imgSrc.length;//给图片添加路径imgSrc.forEach(function(val,index){var img = new Image();img.src='images/'+val+'.png';listImg[val]=img;img.onload=function(){content++;//全部加载完成调用回调函数if(content>=imgLen){callback(listImg);console.log('hehe')};};});};
图片加载完成后就可以使用drawImage方法在画布中绘制图片了;
drawImage :
绘制图片: 还能绘制视频 和 另一个画布对于有性能要求的功能中 ,可以通过两个canvas画布配合来实现,在隐藏的画布中绘制,最后直接将隐藏画布绘制到画布中给用户看,能提高性能!
ctx.drawImage(cv1.0,0);
线帽: lineCap
创建拐角: lineJoin
绘制虚线: ctx.setLineDash([5]) //参数是数组 ,为空(实现)
阴影:
ctx.shadowColor='teal';
ctx.shadowBlur=10; //模糊级别
ctx.shadowOffsetX =10;
ctx.shadowOffsetX =10;
创建渐变对象:
var grd =ctx.createLinearGradient();
grd.addColorStop(0,'green');
设置背景:
var pat = ctx.createPattern(img,repeat) //对象,平铺
ctx.fillStyle=pat
限定剪裁的区域:
ctx.arc();
ctx.clip() //只能在路径中绘制内容;
设置不透明度:
ctx.globalAlpha='.4'; // 全局设置不透明度
检测坐标:ctx.isPointInPath(x,y)
作用:用来检测坐标(x,y)是否在当前路径中,如果在,
就返回TRUE否者false (有路径才行)
canvas基本属性差不多写完了,下一篇连载即将步入正题,开始制作飞鸟游戏!
本篇文章连载 , 纯手打 , 欢迎改正!
0 0
- 一篇文章带你制作 canvas 小游戏 (2)
- 一篇文章带你制作 canvas 小游戏 (1)
- 一篇文章带你制作 canvas 小游戏 (3-完结)
- 一篇好文章带你走出阴霾
- 一篇文章带你了解Flannel
- 一篇文章带你了解Cloud Native
- 一篇文章带你了解Flannel
- 一篇文章带你了解Flannel
- 一篇文章带你了解Cloud Native
- 一篇文章带你了解Flannel
- 一篇文章带你详解 HTTP 协议
- 一篇文章带你深入理解什么是负载测试
- 一篇文章带你全面了解LoRa水表
- 一篇文章带你走通 OkHttp+Retrofit+Rxjava
- 一篇文章带你搞懂DEX文件的结构
- 一篇文章带你看懂Cloudflare信息泄露事件
- 一篇文章带你搞懂DEX文件的结构
- 一篇文章带你了解步进电机的驱动方式
- 富文本编辑器kinduditor的使用
- 观察者模式--农民的故事
- MFC笔记:实现左键拖拽
- 遇见大数据可视化:基础研究
- Ubuntu 16.04安装Cuda8.0
- 一篇文章带你制作 canvas 小游戏 (2)
- C#创建Windows Service(Windows 服务)基础教程
- 适配iOS10的权限设置
- 智能指针
- CentOS7安装MariaDB成功的实践
- 关于百度地图定位异常的问题
- 1005. 继续(3n+1)猜想 (25)
- ndkBuild脚本运行
- phpexcel导出、导入excel文件