超小超轻便——100多行代码实现的简易缓动类

  平时做as3游戏少不了要用到缓动效果,一般都是用greensock的tweenlite库,但引用tweenlite库是有代价的,整个swc库的大小是93kb。对于大型的页游,游戏本身体量就大,且需要用到大量缓动效果,那这100kb左右的文件大小当然是微不足道。但如果是普通的几mb的小游戏,只需要用到to方法实现一个最简单的缓动效果,那专门引入tweenlite库则显得小题大做。缓动效果并不难实现,针对这种简单应用,完全可以用100多行的代码自己实现。代码大小小于1kb。思路是通用的,像cocos,unity等手游开发,也会有开源的第三方缓动库。开发一些几mb的手机小游戏,如果只需要简单的缓动效果,完全可以自己实现,养成好习惯,为游戏安装包瘦身。毕竟安装包越小,玩家越喜欢。

 

  1 package
  2 {
  3     import__global;
  4     
  5     import flash.display.DisplayObject;
  6     import flash.display.MovieClip;
  7     import flash.display.Sprite;
  8     import flash.events.Event;
  9     import flash.utils.Dictionary;
 10 
 11     public class Tween
 12     {
 13         public function Tween()
 14         {
 15             
 16         }
 17         private static var root:DisplayObject;
 18         
 19         private static var list:Dictionary=new Dictionary();
 20         private static var len:int;
 21         /**
 22          *缓动类 
 23          * @param target 目标
 24          * @param duration 缓动时间 秒
 25          * @param targetVars 参数 {目标对象属性:值}
 26          * @param callBack 变化完成后回调
 27          */        
 28         public static function to(target:Object, duration:Number, targetVars:Object,fromVars:Object=null,callBack:Function=null):void
 29         {
 30             //假如该对象已经有缓动则直接完成上一次的缓动
 31             if(list[target]!=null)
 32             {
 33                 for(var key:String in targetVars)
 34                 {
 35                     setValue(target,key,targetVars[key]);
 36                 }
 37                 len--;
 38             }
 39             if(fromVars==null)
 40             {
 41                 fromVars={};
 42                 for(key in targetVars)
 43                 {
 44                     fromVars[key]=target[key];
 45                 }
 46             }
 47             var perVars:Object={};
 48             var count:int=duration*24;
 49             for(key in targetVars)
 50             {
 51                 perVars[key]=(targetVars[key]-target[key])/count;
 52 //                trace("per ["+key+"]:"+perVars[key]+" count:"+count);
 53             }
 54             list[target]={count:count,fromVars:fromVars,target:target,targetVars:targetVars,perVars:perVars,callBack:callBack};
 55             len++;
 56             startMotion();
 57         }
 58         
 59         private static function startMotion():void
 60         {
 61             if(root==null)
 62             {
 63                 root=__global.stage;
 64             }
 65             
 66             if(len>0)
 67             {
 68                 root.removeEventListener(Event.ENTER_FRAME,enterFrame);
 69                 root.addEventListener(Event.ENTER_FRAME,enterFrame);
 70             }
 71             else
 72             {
 73                 root.removeEventListener(Event.ENTER_FRAME,enterFrame);
 74             }
 75         }
 76         
 77         private static function enterFrame(e:Event=null):void
 78         {
 79             for(var key2:* in list)
 80             {
 81                 var task:Object=list[key2];
 82                 task.count--;
 83                 //缓动结束
 84                 if(task.count<=0)
 85                 {
 86                     for(var key:String in task.targetVars)
 87                     {
 88                         setValue(task.target,key,task.targetVars[key]);
 89                     }
 90                     if(task.callBack)task.callBack();
 91                     delete list[key2];
 92                     len--;
 93                     startMotion();
 94                 }
 95                 else
 96                 {
 97                     for( key in task.targetVars)
 98                     {
 99                         task.fromVars[key]+=task.perVars[key];
100                         setValue(task.target,key,task.fromVars[key]);
101                     }
102                 }
103             }
104         }
105         
106         /**
107          *设置值,可以通过属性名过滤处理方法 
108          * @param target
109          * @param key
110          * @param value
111          * 
112          */        
113         private static function setValue(target:Object,key:String,value:Number):void
114         {
115             switch(key)
116             {
117                 case "currentFrame":
118                     var mc:MovieClip=target as MovieClip;
119                     if(mc)
120                     {
121 //                        trace("set currentFrame:"+int(value));
122                         mc.gotoAndStop(int(value))
123                     }
124                     else
125                     {
126                         target[key]=value;
127                     }
128                     break;
129                 default:
130                     target[key]=value;
131                     break;
132             }
133         }
134         
135     }
136 }

 

posted @ 2015-03-23 19:21  立航  阅读(664)  评论(0编辑  收藏  举报