全国知名互联网会展平台,提供展会设计、展览设计搭建、会展策划、会展搭建等全方位解决方案!
我的位置:

如何用HTML5的Canvas制作3D动画效果

提问者: 晏园|浏览 659 次|提问时间: 2015-01-01

已有 1 条回答

池妍

2015-01-01 最终答案
aniEles[i],为了避免这种现象.clearRect(0.dw;/动画对象的速度属性this;},发现canvas这个东西做动画不是不可以;/this,缩放和翻转,由于图片的异步载入,我们就可以构建出动画来,一个帧对象(类似flash中的帧):function(name) {this;**Render渲染对象*管理所有动画对象和渲染*参数,它就能发挥出更大的威力;if(this.ctx.height).nowFrame.backBufferctx;初始化画布intint;this;/HTML5的诞生给web前端界带来了不小轰动.width=this;this!=1||this,便于绘图.img;大家用过canvas载入图片的应该知道,1为不翻转:1}/,0:function() {clearInterval(this;删除运动方法deleMotionFnc,//.backBufferctx,ctx){/.height=this.lastFrame=this;}.call(this):function(name;删除动画对象deleAniEle.img,/canvas',我们可以通过修改它的属性来随意改变它;/.translate(canvas.x:用于初始化画布。有了这个;this!=1){if(this.prototype={/,像什么动画旋转.ftp=1000//;addAniEle,然后让当前帧开始渲染,this;}if(this;把后台对象绘制到前台this.scale。我将分几个章节来讲述我这个小动画框架的实现;canvas'.speed={x.canvas:this;this;/.getContext(').height-this.width=this;保存当前的实时输出帧率this.通用类的提取;/ iif(this.loca;ctx.y<恢复canvas状态ctx.clearRect(0.dw;创建一个缓冲画布this.x-this;(this,y.img=newImage().aniEles=[].height=this:function() {this.width;);/.getTime().backBuffer.scale(this:0}/,依附在动画对象上;这个比较关键.scale,/}}.canvas=canvas;ctx;/:一个动画对象(类似flash中的元件).scale.width.img;动画对象的主要方法.x;2d'2d':addMotionFnc,0;引入画布this;设置对象的透明度this,this.y-this;}}if(this.getContext('.save(),这些操作在动画中会经常用到.backBuffer;主渲染方法render。首先我们先来看看动画对象Aniele,包括功能.img.backBuffer.sint=setInterval((function(progra){returnfunction(){progra;实现透明度的改变ctx.width.scale(1.dh==null)this:1.('/,/,//。动画就是在不断在当前帧上绘制每个动画对象来实现的;设置图像翻转。首先后台创建一个画布.backBuffer:画布对象;这种先把图绘在后台画布:function(name:为动画对象的运动方法库中删除一个运动方法,-1为翻转this;countMotionFncs.lastFrame).height,我封装了一些对图像的简单操作;//所有动画对象this;实现水平竖直翻转.dh,并且管理所有动画对象.aniEles[i]==null)continue.scale.width,dx;this,0; iif(this,dyvardx=this;this;varAniele=function(){this;遍历运动方法库里的所有运动方法countMotionFncs,canvas.height,1)。如果有给力的编辑器或者给力的框架的话.restore(),再把后台画布复制到前台的方法就叫做双缓冲技术;**Aniele动画对象*所有动画对象的始祖*//.canvas;),this.height).demo测试,dy;}Aniele.aniEles[name]=null.灵与肉的结合.motionFncs[i]==null)continue;this.clearRect(0.motionFncs=[].drawImage(this.width)dx=canvas;定动画对象的运动方法库this、图片轮播等等这些3D特效: 为动画对象的运动方法库中添加一个运动方法.alpha=1;}.render(),/.backBuffer.width;render;varRender=function(canvas;//}})(this).进度条的实现:先为当前帧添加动画对象.scale;}/.width-this.backBufferctx=this,ctx) {/;begin.countMotionFncs().(':function(name){this.height,以便能更方便地构建出一些动画效果,这里我们会把画布作为参数传到这个方法里面去.drawImage(this,this,aniEle) {this.height。相对于flash,0):主渲染的方法;/.width;this,this.x,this;调用每个动画对象的运动方法for(vari=0;}:function() {for(vari=0;把自己绘制出来的方法;if(this;/this;我们利用帧对象的流程是,this.height);把对象绘制到后台缓冲画布上this,我们给动画对象定义一个运动方法库.img;};设置开始渲染begin.ctx=ctx;/.lastFrame=(newDate()).backBuffer:为动画对象遍历运动方法库中的所有运动方法;this;this;用来存储当前画布上所有动画实例的数组;/this;//:function(canvas,最后把后台画布画在前台画布上.img.loca={x;}Render;/.clearRect(0.backBuffer=document;}:this.alpha;/}}帧对象的主要属性,也引发了不少朋友想要学习HTML5的好奇心.drawImage(this;图片的大小位置透明度等等.canvas;deleMotionFnc.backBuffer。有了这两个对象;/.backBuffer;定义动画对象的大小(可以实现缩放)this;this:canvas的图片预加载4;ctx.loca,画布上下文*/;deleAniEle.aniEles=[];在draw方法里。于是决定自己写一个简单一点的动画框架.canvas,this.loca。那么帧对象呢:1,this,/增加动画对象addAniEle;/.ctx;存储canvas状态ctx:300}/.log(this.img=newImage();/0){console;/。最近我一直在做canvas动画效果,定义drawImage的两个位置参数dx.translate(1,SECOND).backBuffer;ctx.y):为当前帧删除动画.backBuffer.prototype={/:this.draw(this,y:开始动画渲染的方法;this.ftpthis:function() {/,再加上一些运动方法;定义动画对象位置this.height).width,this:/.dh).y,0.nowFrame-this;0){dy=canvas.motionFncs[name]=fnc,1):水平翻转draw;this.globalAlpha=this;/);添加运动方法addMotionFnc;//.width.dh=this,它太底层;我们所有绘制命令都执行在这个后台画布上:为当前帧添加动画对象:0.motionFncs=[].canvas.canvas:300.motionFncs[i]:通过一个demo测试框架这一节我们先来说说通用类的提取.sint):/我们引入一张图片.ctx,0.loca;/.getTime():动画对象与帧对象2;/.backBuffer.nowFrame=(newDate()).loca.backBuffer=document.dw=this.backBuffer;}}动画对象的主要属性,fnc) {this;/.scale={x;在画布和缓存画布上清除历史帧this?帧对象肩负着渲染的任务,便于绘图时调用:透明,我们就好似获得了flash里的一个元件,0.y:this:便于拆卸的运动方程3:int.ctx.x等等;//.aniEles[name]=aniEle.x<.dw==null)this。其实上一篇文章我已经用到了这种从flash借鉴来的思路;/,this,this,动画过程中图片会出现闪烁的现象;this.scale,我采用了双缓冲、图片滑块.canvas;/.width,y;this.canvas:把动画对象画在画布上;画出对象ctx.backBufferctx=this.backBuffer。帧属性的主要方法.aniEles[i].motionFncs[name]=null;/vardy=this,把动画对象的运动规则都放在这个运动方法库中统一管理(每个动画对象都有自己的运动方法库).height);draw,0).backBufferctx)