shawn.xie 发表于 2013-1-6 08:21:50

构建canvas动画框架(一)——通用类的提取

<div id="cnblogs_post_body">http://pic002.cnblogs.com/images/2012/423946/2012071022243172.png
最近一直在做canvas动画效果,发现canvas这个东西做动画不是不可以。相对于flash,它太底层。如果有给力的编辑器或者给力的框架的话,它就能发挥出更大的威力。
于是决定自己写一个简单一点的动画框架,以便能更方便地构建出一些动画效果。
我将分几个章节来讲述我这个小动画框架的实现:
1.通用类的提取:动画对象与帧对象
2.灵与肉的结合:便于拆卸的运动方程
3.进度条的实现:canvas的图片预加载
4.demo测试:通过一个demo测试框架
这一节我们先来说说通用类的提取。
其实上一篇文章我已经用到了这种从flash借鉴来的思路:一个动画对象(类似flash中的元件),一个帧对象(类似flash中的帧)。动画就是在不断在当前帧上绘制每个动画对象来实现的。有了这两个对象,再加上一些运动方法,我们就可以构建出动画来。
首先我们先来看看动画对象Aniele:
<div class="cnblogs_code"> /* *Aniele动画对象 *所有动画对象的始祖 */ var Aniele=function(){   this.img=new Image();   //定义动画对象位置   this.loca={             x:300,             y:300   }   //定义动画对象的大小(可以实现缩放)   this.dw;   this.dh;   //动画对象的速度属性   this.speed={             x:0,             y:0   }         //设置对象的透明度   this.alpha=1;   //设置图像翻转,1为不翻转,-1为翻转   this.scale={             x:1,            y:1   }   //定动画对象的运动方法库   this.motionFncs=[]; } Aniele.prototype={   //添加运动方法   addMotionFnc:function (name,fnc) {      this.motionFncs=fnc;    },    //删除运动方法    deleMotionFnc:function(name){      this.motionFncs=null;    },    //遍历运动方法库里的所有运动方法    countMotionFncs:function () {      for (var i=0; i<this.motionFncs.length; i++) {            if(this.motionFncs==null)                continue;            this.motionFncs.call(this);      }    },    //把自己绘制出来的方法,包括功能:水平翻转    draw:function(canvas,ctx){      //存储canvas状态      ctx.save();      //实现透明度的改变      ctx.globalAlpha=this.alpha;      //实现水平竖直翻转,定义drawImage的两个位置参数dx,dy      var dx=this.loca.x;      var dy=this.loca.y;      if(this.scale.x!=1||this.scale.y!=1){            if(this.scale.x<0){                console.log(this.img.width)                dx=canvas.width-this.loca.x-this.img.width;                ctx.translate(canvas.width,1);                ctx.scale(this.scale.x,1);            }                if(this.scale.y<0){                dy=canvas.height-this.loca.y-this.img.height;                ctx.translate(1,canvas.height);                ctx.scale(1,this.scale.y);            }            }      if(this.dw==null)            this.dw=this.img.width;      if(this.dh==null)             this.dh=this.img.height;      //画出对象      ctx.drawImage(this.img,dx,dy,this.dw,this.dh);      //恢复canvas状态          ctx.restore();    } }
页: [1]
查看完整版本: 构建canvas动画框架(一)——通用类的提取