• 超小超轻便——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 }
  • 相关阅读:
    好尚不可为,其况恶乎(转)
    getResource(String name)用法及源码分析
    怎样从ext3升级到ext4?
    Java设计模式之适配器模式(Adapter Pattern)
    javascript实现图片无缝滚动(scrollLeft的使用方法介绍)
    PowerDesigner使用教程
    python 多线程编程
    java中接口的定义与实现
    Java调用cmd命令 打开一个站点
    C#中MessageBox使用方法大全(附效果图)
  • 原文地址:https://www.cnblogs.com/leoin2012/p/4360773.html
Copyright © 2020-2023  润新知