全國知名互聯(lián)網(wǎng)會展平臺,提供展會設(shè)計、展覽設(shè)計搭建、會展策劃、會展搭建等全方位解決方案!
我的位置:

如何用HTML5的Canvas制作3D動畫效果

提問者: 晏園|瀏覽 706 次|提問時間: 2015-01-01

已有 1 條回答

池妍

2015-01-01 最終答案
aniEles[i],為了避免這種現(xiàn)象.clearRect(0.dw;/動畫對象的速度屬性this;},發(fā)現(xiàn)canvas這個東西做動畫不是不可以;/this,縮放和翻轉(zhuǎn),由于圖片的異步載入,我們就可以構(gòu)建出動畫來,一個幀對象(類似flash中的幀):function(name) {this;**Render渲染對象*管理所有動畫對象和渲染*參數(shù),它就能發(fā)揮出更大的威力;if(this.ctx.height).nowFrame.backBufferctx;初始化畫布intint;this;/HTML5的誕生給web前端界帶來了不小轟動.width=this;this!=1||this,便于繪圖.img;大家用過canvas載入圖片的應該知道,1為不翻轉(zhuǎn):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={/,像什么動畫旋轉(zhuǎn).ftp=1000//;addAniEle,然后讓當前幀開始渲染,this;}if(this;把后臺對象繪制到前臺this.scale。我將分幾個章節(jié)來講述我這個小動畫框架的實現(xiàn);canvas'.speed={x.canvas:this;this;/.getContext(').height-this.width=this;保存當前的實時輸出幀率this.通用類的提取;/ iif(this.loca;ctx.y<恢復canvas狀態(tài)ctx.clearRect(0.dw;創(chuàng)建一個緩沖畫布this.x-this;(this,y.img=newImage().aniEles=[].height=this:function() {this.width;);/.getTime().backBuffer.scale(this:0}/,依附在動畫對象上;這個比較關(guān)鍵.scale,/}}.canvas=canvas;ctx;/:一個動畫對象(類似flash中的元件).scale.width.img;動畫對象的主要方法.x;2d'2d':addMotionFnc,0;引入畫布this;設(shè)置對象的透明度this,this.y-this;}}if(this.getContext('.save(),這些操作在動畫中會經(jīng)常用到.backBuffer;主渲染方法render。首先我們先來看看動畫對象Aniele,包括功能.img.backBuffer.sint=setInterval((function(progra){returnfunction(){progra;實現(xiàn)透明度的改變ctx.width.scale(1.dh==null)this:1.('/,/,//。動畫就是在不斷在當前幀上繪制每個動畫對象來實現(xiàn)的;設(shè)置圖像翻轉(zhuǎn)。首先后臺創(chuàng)建一個畫布.backBuffer:畫布對象;這種先把圖繪在后臺畫布:function(name:為動畫對象的運動方法庫中刪除一個運動方法,-1為翻轉(zhuǎn)this;countMotionFncs.lastFrame).height,我封裝了一些對圖像的簡單操作;//所有動畫對象this;實現(xiàn)水平豎直翻轉(zhuǎn).dh,并且管理所有動畫對象.aniEles[i]==null)continue.scale.width,dx;this,0; iif(this,dyvardx=this;this;varAniele=function(){this;遍歷運動方法庫里的所有運動方法countMotionFncs,canvas.height,1)。如果有給力的編輯器或者給力的框架的話.restore(),再把后臺畫布復制到前臺的方法就叫做雙緩沖技術(shù);**Aniele動畫對象*所有動畫對象的始祖*//.canvas;),this.height).demo測試,dy;}Aniele.aniEles[name]=null.靈與肉的結(jié)合.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).進度條的實現(xiàn):先為當前幀添加動畫對象.scale;}/.width-this.backBufferctx=this,ctx) {/;begin.countMotionFncs().(':function(name){this.height,以便能更方便地構(gòu)建出一些動畫效果,這里我們會把畫布作為參數(shù)傳到這個方法里面去.drawImage(this,this,aniEle) {this.height。相對于flash,0):主渲染的方法;/.width;this,this.x,this;調(diào)用每個動畫對象的運動方法for(vari=0;}:function() {for(vari=0;把自己繪制出來的方法;if(this;/this;我們利用幀對象的流程是,this.height);把對象繪制到后臺緩沖畫布上this,我們給動畫對象定義一個運動方法庫.img;};設(shè)置開始渲染begin.ctx=ctx;/.lastFrame=(newDate()).backBuffer:為動畫對象遍歷運動方法庫中的所有運動方法;this;this;用來存儲當前畫布上所有動畫實例的數(shù)組;/this;//:function(canvas,最后把后臺畫布畫在前臺畫布上.img.loca={x;}Render;/.clearRect(0.backBuffer=document;}:this.alpha;/}}幀對象的主要屬性,也引發(fā)了不少朋友想要學習HTML5的好奇心.drawImage(this;圖片的大小位置透明度等等.canvas;deleMotionFnc.backBuffer。有了這兩個對象;/.backBuffer;定義動畫對象的大?。梢詫崿F(xiàn)縮放)this;this:canvas的圖片預加載4;ctx.loca,畫布上下文*/;deleAniEle.aniEles=[];在draw方法里。于是決定自己寫一個簡單一點的動畫框架.canvas,this.loca。那么幀對象呢:1,this,/增加動畫對象addAniEle;/.ctx;存儲canvas狀態(tài)ctx:300}/.log(this.img=newImage();/0){console;/。最近我一直在做canvas動畫效果,定義drawImage的兩個位置參數(shù)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):水平翻轉(zhuǎn)draw;this.globalAlpha=this;/);添加運動方法addMotionFnc;//.width.dh=this,它太底層;我們所有繪制命令都執(zhí)行在這個后臺畫布上:為當前幀添加動畫對象:0.motionFncs=[].canvas.canvas:300.motionFncs[i]:通過一個demo測試框架這一節(jié)我們先來說說通用類的提取.sint):/我們引入一張圖片.ctx,0.loca;/.getTime():動畫對象與幀對象2;/.backBuffer.nowFrame=(newDate()).loca.backBuffer=document.dw=this.backBuffer;}}動畫對象的主要屬性,fnc) {this;/.scale={x;在畫布和緩存畫布上清除歷史幀this?幀對象肩負著渲染的任務(wù),便于繪圖時調(diào)用:透明,我們就好似獲得了flash里的一個元件,0.y:this:便于拆卸的運動方程3:int.ctx.x等等;//.aniEles[name]=aniEle.x<.dw==null)this。其實上一篇文章我已經(jīng)用到了這種從flash借鑒來的思路;/,this,this,動畫過程中圖片會出現(xiàn)閃爍的現(xiàn)象;this.scale,我采用了雙緩沖、圖片滑塊.canvas;/.width,y;this.canvas:把動畫對象畫在畫布上;畫出對象ctx.backBufferctx=this.backBuffer。幀屬性的主要方法.aniEles[i].motionFncs[name]=null;/vardy=this,把動畫對象的運動規(guī)則都放在這個運動方法庫中統(tǒng)一管理(每個動畫對象都有自己的運動方法庫).height);draw,0).backBufferctx)