超小超轻便——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 }