array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Html5游戏开发-图形与动画(一) - 爱码网
zhuxiaoxiao

最近研究了一下出来了很久的HTML5,总结了一下,准备来个系列,文中也许有很多问题,欢迎大家指正。

Canvas介绍

canvas用于在网页中绘制图形的一个元素,具体内容请查看 -> HTML5 Canvas

这里说些w3school中没有的。

立即模式

canvas元素是立即模式的图形系统,意味着当你提出要求时,他会立即绘制,然后立即忘记(绘制完成一个对象,就会销毁这个对象)。其它的图形系统(例如:SVG),使用了保留模式的图形系统,就是说绘制时他们会保留一系列将要绘制的对象。正因未Canvas不需要维护这一系列对象,所以Canvas的运行速度要快很多。

双缓存机制

在上面,我们提到了立即模式,但这里的“立即绘制”并不是大家所谓的立即,此处需要进一步说明。

在浏览器调用我们定义的绘制方法(假设这个方法是DrawGame)绘制当前动画帧时,Canvas元素并不是立即绘制出你指定的内容。相反,它会创建另一个Canvas元素(我们叫它Canvas2),所有的绘制实际上都在Canvas2中进行。当DrawGame方法返回时,浏览器会通过一个图形操作,复制Canvas2内容到屏幕上,我们将这种技术称为双缓存技术,双缓存技术让动画的实现变得平滑。

坐标系统(translate)

translate(x,y)这是Canvas元素的一个方法,游戏的背景移动,大多通过该方法来实现。游戏中,我们不会通过频繁对大量元素进行坐标计算来实现对象的滚动,因为这样的计算不仅消耗计算机性能,还增加了代码的维护难度。

注意:为了不影响后续的绘制,在使用translate(x,y)修改坐标系统后,需要再次调用translate(-x,-y)来恢复坐标系统。

具体内容请查看 -> HTML5 canvas translate()

创建Canvas镜像和恢复Canvas

在进行动画绘制时,我们会经常的对Canvas元素的绘图环境(context)进行修改,例如strokeStyle,lineWidth等。这些修改操作都是永久的,也就意味着对他们的修改将会影响接下来任何你在Canvas元素的图形操作。那么如何让这些操作只是临时有效呢?这里我们可以使用save()和restore()方法对当前Canvas元素的绘图环境状态创建镜像和恢复。任何写在这两个方法间的环境属性修改,在执行restore后,都会恢复成save时的状态。

注意:save()和restore()需要成对出现,也就是有save,就要有restore。

 

实现平滑的HTML5动画

所谓的动画,说白了就是一张一张的图片不断的连续更换。所以,通过编程实现动画也就是不断的通过替换图片,来达到动画的效果。

但是,这种不断地替换,当然不能使用死循环while(true)来实现,传统的方法是使用setTimeout()和setInterval()方法,这两个方法虽然都提供了毫秒级的精确度,但实际上,却达不到毫秒级(参考此处:setTimeout精度测试setInterval精度测试)。所以为了保证动画的平滑度,我们不应该继续使用setTimeout和setInterval方法来实现对时间有着苛刻要求的动画,用什么来代替?我们在下一节讲到。

requestAnimationFrame()方法

在w3c中的Timing Control for Script-based Animations(参考此处 -> w3c-Script-based Animations)说明中,定义了一个requestAnimationFrame()窗口对象的方法。不同于setTimeout和setInterval方法,requestAnimationFrame是专门用来实现动画的,它使用浏览器的时间间隔进行绘制,不会掉帧。

这里需要注意的是,requestAnimationFrame方法在窗体没激活或者页签不可见的时候,动画会暂停。

下面是盗的图,支持requestAnimationFrame方法的浏览器及版本(来源:HTML5 requestAnimationFrame( ) 动画API

javascript实例:

1 function animate(now)
2 {
3     DrawGame(now);
4     requestAnimationFrame(animate);
5 }
6 ...
7 requestAnimationFrame(animate);

 

制作基于时间的运动

游戏帧速率是不稳定的,也许此时能够60帧/秒,下一刻也许就成了10帧/秒。游戏帧的速率是变化的,我们不能让游戏帧的速率影像到游戏中物体运动的速率,例如:人物的运动,背景的滚动,子弹的速度等等。所以,游戏中物体的运动必须是基于时间的,并且仅仅依赖于时间(例如:像素/秒),而不是动画帧速率。

在上一节的实例中,我们可以发现animate有个参数是now,它代表当前绘制的时间,既然有了这个参数,我们就能知道两次时间间隔,从而计算出运动的距离。

javascript实例:

1 var speed = 50;
2 var lastAnimationTime = new Date();
3 var offsetX = 0;
4 function SetBackgroundOffsetX(now)
5 {
6     offsetX += speed * (now - lastAnimationTime)/1000
7     ...
8     //如果一直加下去,背景会慢慢移出屏幕,下面的代码自己写吧
9 }

 

结尾

到这里,关于图形与动画的内容就差不多结束了,内容不多,代码很少,但是我觉得已经够了,毕竟大部分的基础知识都能在网上找到哈哈。

本人不是HTML5大佬,如文中有问题,请大家帮忙指正,谢谢大家~

分类:

技术点:

相关文章: