`

Tween类,flash缓冲效果讲解(as3.0)

    博客分类:
  • Flex
阅读更多

最近做的东西,对于效果编程比较多,特别是缓冲,加速度等效果,特意研究了一下Tween类,过年没什么礼物给大家,写篇教程分享给大家,算是过年送给大家的新年礼物!

下面是官方写的fl.transitions.Tween类:
可以先尝试看一下这段代码的写法,用这个方法去看:
从构造函数看起,假设我使用了该类
new Tween(mc,"x",Regular.easeOut,0,200,4);
结合adobe的帮助文档,当初始化实例的时候,便对对象mc的x进行Regular.easeOut操作,具体是从0值到200值,历时4帧
然后问一个为什么,他为什么会对对象mc的x进行Regular.easeOut操作,具体是从0值到200值,历时4帧?
带着这个问题,现在开始看这个类吧!从构造函数看

package fl.transitions
{
import flash.events.*;
import flash.display.*;
import flash.utils.*;
[Event(name="motionChange", type="fl.transitions.TweenEvent")]
[Event(name="motionFinish", type="fl.transitions.TweenEvent")]
[Event(name="motionLoop", type="fl.transitions.TweenEvent")]
[Event(name="motionResume", type="fl.transitions.TweenEvent")]
[Event(name="motionStart", type="fl.transitions.TweenEvent")]
[Event(name="motionStop", type="fl.transitions.TweenEvent")]
public class Tween extends EventDispatcher
{
   protected static var _mc:MovieClip = new MovieClip();

  public var isPlaying:Boolean = false;

   public var obj:Object = null;

  public var prop:String = "";

  public var func:Function = function (t:Number, b:Number, c:Number, d:Number):Number { return c*t/d + b; }

  public var begin:Number = NaN;

  public var change:Number = NaN;

  public var useSeconds:Boolean = false;

  public var prevTime:Number = NaN;

  public var prevPos:Number = NaN;

  public var looping:Boolean = false;

  private var _duration:Number = NaN;

  private var _time:Number = NaN;

  private var _fps:Number = NaN;

  private var _position:Number = NaN;

  private var _startTime:Number = NaN;

  private var _intervalID:uint = 0;

  private var _finish:Number = NaN;

  private var _timer:Timer = null;

 public function get time():Number 
 {
 return this._time;
 }

  public function set time(t:Number):void 
  {
    this.prevTime = this._time;
    if (t > this.duration) {
      if (this.looping) {
        this.rewind (t - this._duration);
        this.update();
        this.dispatchEvent(new TweenEvent(TweenEvent.MOTION_LOOP, this._time, this._position));
      } else {
        if (this.useSeconds) {
          this._time = this._duration;
          this.update();
        }
        this.stop();
        this.dispatchEvent(new TweenEvent(TweenEvent.MOTION_FINISH, this._time, this._position));
      }
    } else if (t < 0) {
      this.rewind();
      this.update();
    } else {
      this._time = t;
      this.update();
    }
  }

 public function get duration():Number 
 {
 return this._duration;
 }
 
  public function set duration(d:Number):void 
  {
    this._duration = (d <= 0) ? Infinity : d;
  }

 public function get FPS():Number 
 {
 return this._fps;
 }
 
  public function set FPS(fps:Number):void 
  {
    var oldIsPlaying:Boolean = this.isPlaying;
    this.stopEnterFrame();
    this._fps = fps;
    if (oldIsPlaying) 
    {
      this.startEnterFrame();
    }
  }

 public function get position():Number 
 {
 return this.getPosition(this._time);
 }
 
  public function set position(p:Number):void 
  {
    this.setPosition (p);
  }
 
 public function getPosition(t:Number=NaN):Number 
 {
 if (isNaN(t)) t = this._time;
 return this.func (t, this.begin, this.change, this._duration);
 }

  public function setPosition(p:Number):void 
  {
    this.prevPos = this._position;
    if (this.prop.length)
      this.obj[this.prop] = this._position = p;
    this.dispatchEvent(new TweenEvent(TweenEvent.MOTION_CHANGE, this._time, this._position));  
  }

 public function get finish():Number 
 {
 return this.begin + this.change;
 }
 
  public function set finish(value:Number):void 
  {
    this.change = value - this.begin;
  }
  
  function Tween(obj:Object, prop:String, func:Function, begin:Number, finish:Number, duration:Number, useSeconds:Boolean=false) 
  {
    if (!arguments.length) return;
    this.obj = obj;
    this.prop = prop;
    this.begin = begin;
    this.position = begin;
    this.duration = duration;
    this.useSeconds = useSeconds;
    if (func is Function) this.func = func;
    this.finish = finish;
    this._timer = new Timer(100);
    this.start();
  }

  public function continueTo(finish:Number, duration:Number):void {
    this.begin = this.position;
    this.finish = finish;
    if (!isNaN(duration))
      this.duration = duration;
    this.start();
  }
  
  public function yoyo():void 
  {
    this.continueTo(this.begin, this.time);
  }

  protected function startEnterFrame():void 
  {
    if (isNaN(this._fps)) 
    {
      _mc.addEventListener(Event.ENTER_FRAME, this.onEnterFrame, false, 0, true);
    } 
    else 
    {
      var milliseconds:Number = 1000 / this._fps;
      this._timer.delay = milliseconds;
 this._timer.addEventListener(TimerEvent.TIMER, this.timerHandler, false, 0, true);
 this._timer.start();
    }
    this.isPlaying = true;
  }

  protected function stopEnterFrame():void 
  {
    if (isNaN(this._fps)) 
    {
      _mc.removeEventListener(Event.ENTER_FRAME, this.onEnterFrame);
    } 
    else 
    {
      this._timer.stop();
    }
    this.isPlaying = false;
  }
 
  public function start():void 
  {
    this.rewind();
    this.startEnterFrame();
    this.dispatchEvent(new TweenEvent(TweenEvent.MOTION_START, this._time, this._position));
  }
 
  public function stop():void 
  {
    this.stopEnterFrame();
    this.dispatchEvent(new TweenEvent(TweenEvent.MOTION_STOP, this._time, this._position));
  }

  public function resume():void 
  {
    this.fixTime();
    this.startEnterFrame();
    this.dispatchEvent(new TweenEvent(TweenEvent.MOTION_RESUME, this._time, this._position));
  }
 
  public function rewind(t:Number=0):void 
  {
    this._time = t;
    this.fixTime();
    this.update(); 
  }
 
  public function fforward():void 
  {
    this.time = this._duration;
    this.fixTime();
  }
 
  public function nextFrame():void 
  {
    if (this.useSeconds) 
      this.time = (getTimer() - this._startTime) / 1000;
    else 
      this.time = this._time + 1;
  }

  protected function onEnterFrame(event:Event):void 
  {
    this.nextFrame();
  }

  protected function timerHandler(timerEvent:TimerEvent):void 
  {
    this.nextFrame();
    timerEvent.updateAfterEvent();
  }

  public function prevFrame():void 
  {
    if (!this.useSeconds) this.time = this._time - 1;
  }
  
  private function fixTime():void 
  {
    if (this.useSeconds) 
      this._startTime = getTimer() - this._time*1000;
  }

  private function update():void 
  {
    this.setPosition(this.getPosition(this._time));
  }
  
}
}

不知大家看的如何,反正我现在来告诉你结果,你会发现,实际这个类很简单,他就做了一件事,就是每个时间变化每个不同的状态,而具体怎么变的,谁看到了?比如加速度,弹簧效果等都应该有算法,但是这里面并没有看到算法啊,只看到他每次更改时间time不管如何,总会update()一下,算法就在这,它会调用getPosition方法,而该方法返回的值是this.func (t, this.begin, this.change, this._duration)(插播参数讲解,func的4个参数分别是,当前运动到的time值,初始值即构造函数中第4个参数,要改变的值即结束值减初始值,总时间即构造函数中第6个参数)func方法得到的就是变化一下time之后的物体值,而这个func就是构造函数中第三个参数Regular.easeOut,这个参数是fl.transitions.easing包中的某个类的某个方法,如果使用方法,返回的值就是return -c * (t /= d) * (t - 2) + b;这个就是缓冲算法,fl.transitions.easing包中还有很多不同移动效果的算法,比如弹簧,加速度等。竟然看到这里,大家都知道了Tween只不过是调用这些算法的一个东西罢了,那么我们根据自我需求写一些简单的缓冲类,然后调用adobe的这些精髓算法呢?

先看看官方的算法源代码
adobe官方fl.transitions.easing.Regular类,源代码:
package fl.transitions.easing
{

public class Regular
{

  public static function easeIn(t:Number, b:Number,
                 c:Number, d:Number):Number
  {
    return c * (t /= d) * t + b;
  }

  public static function easeOut(t:Number, b:Number,
                 c:Number, d:Number):Number
  {
    return -c * (t /= d) * (t - 2) + b;
  }

  public static function easeInOut(t:Number, b:Number,
                   c:Number, d:Number):Number
  {
    if ((t /= d / 2) < 1)
      return c / 2 * t * t + b;

    return -c / 2 * ((--t) * (t - 2) - 1) + b;
  }
}

}

接下来看看,我为了某个项目,赶时间写出来针对显示对象一个非常简单的缓冲类,然后调用了官方的fl.transitions.easing包中的算法
package index.item.pairBumping{
  
  import flash.display.DisplayObject;
  import flash.events.Event;
  import flash.events.EventDispatcher;
  
  public class Motion extends EventDispatcher{
    
    private var _target:DisplayObject;
    private var proNum:Number;
    private var startNum:Number;
    private var endNum:Number;
    private var actionStr:String;
    private var num1:uint;
    private var num2:uint;
    private var func:Function;
    
    //构造函数与Tween基本上一样,只不过没有按时间计算,只有按帧运动
    //每个参数所表示的值也是一样的,fun:Function传入的参数和Tween一样,使用官方的fl.transitions.easing包
    public function Motion(target:DisplayObject,str:*,fun:Function,_start:Number = 0,_end:Number = 1,_pro:Number = 4){
      actionStr = str;
      _target = target;
      proNum = _pro;
      startNum = _start;
      endNum = _end;
      func = fun;
    }
    
    //创建Motion实例化后,并没有立即播放得执行play才播放,当然播放完一次,也能使用play继续播放
    public function play(){
      stop();
      num1 = 0;
      _target[actionStr] = startNum;
      _target.addEventListener(Event.ENTER_FRAME,fun1);
    }
    
    //顺走所执行事件
    private function fun1(e:Event){
      var t = num1 ++;//当前运行时间
      var d = proNum;//总时间
      var b = startNum;//开始值
      var c = endNum - startNum;//要改变的值
      _target[actionStr] = func(t,b,c,d);//调用官方算法,并且传入4个参数,进行计算!
      if(t > d){//判断是否时间到了
        stop();//ok,播放完毕,那么我们停止吧
        _target[actionStr] = endNum;//并且把参数强制性变成最终值
      }
    }
    
    //反过来播放一次
    public function back(){
      stop();
      num2 = 0;
      _target[actionStr] = endNum;
      _target.addEventListener(Event.ENTER_FRAME,fun2);
    }
    
    //反过来播放的执行事件
    private function fun2(e:Event){
      var t = num2 ++;
      var d = proNum;
      var b = endNum;
      var c = startNum - endNum;
      _target[actionStr] = func(t,b,c,d);
      if(t > d){
        stop();
        _target[actionStr] = startNum;
      }
    }
    
    //停止播放
    public function stop(){
      _target.removeEventListener(Event.ENTER_FRAME,fun1);
      _target.removeEventListener(Event.ENTER_FRAME,fun2);
      dispatchEvent(new Event("stop"));
    }
  }
}

分享到:
评论

相关推荐

    flash as3.0经典缓动函数TweenLite类文件

    flash as3.0动作脚本的一个很经典的缓动函数的as类文件,体积小且易用

    国外经典的31个flash as特效(as3.0)

    《国外经典的31个Flash AS特效(AS3.0)》 Flash ActionScript,简称AS,是Adobe Flash Professional中用于创建交互式内容的核心编程语言。AS3.0是该语言的一个重大更新,它引入了许多新的特性和改进,使得开发者...

    AS3.0中Tween类的基础

    在ActionScript 3.0(AS3.0)中,Tween类是动画处理的重要组成部分,它允许开发者平滑地在一段时间内改变对象的属性,如位置、大小、颜色等,从而实现动态效果。Tween(补间)技术是基于时间线的动画原理,通过计算...

    flash as3.0 课件 十二生肖的学习

    本教程将详细讲解如何利用Adobe Flash中的ActionScript 3.0(AS3.0)编程语言,创建一个以“十二生肖”为主题的互动学习课件。通过这个课件,学生不仅可以了解到十二生肖的基本知识,还能在互动过程中增强对汉字的...

    flash as3.0 实例

    9. **动作脚本与图形渲染**:利用AS3.0的绘图API,可以实现动态图形绘制,结合Tween类创建平滑过渡效果。 10. **错误处理**:通过try-catch语句,可以捕获并处理运行时错误,提高程序的健壮性。 在压缩包中的...

    Flash as3.0制作的拼图小游戏源码。

    6. **动画与时间轴控制**:AS3.0提供了强大的动画控制功能,可能通过Tween类或时间轴控制实现拼图块的移动动画。 7. **数据结构与算法**:拼图游戏的核心是拼图的生成与解决,这通常涉及矩阵操作和图论中的算法,如...

    as3.0+翻书效果

    AS3.0(ActionScript 3.0)是Adobe Flash平台上的编程语言,主要用于创建交互式网站、游戏、动画以及各种富互联网应用。在本项目中,“as3.0+翻书效果”指的是使用AS3.0实现的一种模拟真实书籍翻页效果的动态功能。...

    基于as3.0小游戏

    AS3.0(ActionScript 3.0)是Adobe Flash平台上的主要编程语言,用于创建交互式内容、动画以及丰富的互联网应用程序(RIA)。基于AS3.0的小游戏,利用了其强大的性能和丰富的功能,为用户提供有趣且引人入胜的游戏...

    Flash_AS3.0例子

    《深入探索Flash AS3.0:18个经典实例解析》 Flash ActionScript 3.0(AS3.0)是Adobe Flash平台的核心编程语言,它为开发者提供了强大的功能,用于创建互动式网页内容、游戏以及丰富的互联网应用程序(RIA)。在AS...

    flash as3.0二级菜单

    4. **优化交互**:为了提供更好的用户体验,可以考虑添加缓动效果,如渐变显示和隐藏,这可以通过TweenMax库或其他类似库实现,或者通过AS3.0的内置Tween类来完成。 在实际项目中,可能还需要处理其他细节,比如...

    flash as3.0 图片随机过渡效果

    在本文中,我们将深入探讨如何在Flash AS3.0中实现图片的随机过渡效果。这一技术主要用于提升用户体验,为数字媒体展示、网页设计或者互动应用增添动态视觉效果。以下是关于这个主题的一些关键知识点: 1. **AS3.0...

    AS 3.0中文帮助文档

    ActionScript 3.0(AS3.0)是Adobe Flash平台上的主要编程语言,用于创建交互式内容、动画以及富互联网应用程序(RIA)。这个“AS 3.0中文帮助文档”是一个网页形式的资源,旨在为中国的开发者提供关于AS3.0的详细...

    FLASH AS3.0实现自动滚动

    1. **时间轴控制**:AS3.0中的` Tween`类或`Timeline`类允许我们控制舞台上元件的动画效果。通过改变元件的位置、旋转或缩放属性,可以实现平滑的滚动效果。 2. **动作脚本编写**:在Flash Professional的...

    缓动 TweenMax 非常强大的as3.0缓动类

    在ActionScript 3.0(AS3.0)中,创建动态和流畅的动画效果是许多开发者关注的重点。`TweenMax` 是GreenSock Animation Platform (GSAP)的一部分,它是一个极其强大的缓动库,为AS3.0提供了丰富的动画解决方案。`...

    FLASH AS3.0缓动特效

    在IT行业中,动画效果是提升用户体验的...掌握缓动特效的原理和实现方法,可以提升Flash应用的视觉效果和用户体验,对于AS3.0开发者来说是必备技能。通过不断学习和实践,你可以创造出更多富有创意和吸引力的动画效果。

    as3.0图片切换随机效果(10种)

    AS3.0(ActionScript 3.0)是Adobe Flash Professional和Flex Builder等工具中使用的编程语言,用于创建交互式内容。以下是10种不同的图片切换随机效果,以及如何在AS3.0中实现它们的基本概念。 1. **淡入淡出**:...

    flash as3.0 音乐播放器引擎

    2. 动画和效果:利用Tween类或Timeline-based动画,可以创建平滑的界面过渡和视觉反馈。 四、音乐播放逻辑 1. 加载音乐:使用Sound类的load方法加载音乐文件,可以指定URL或从库中选择。 2. 播放控制:使用...

    AS3.0地图制作,很好的资源

    AS3.0(ActionScript 3.0)是Adobe Flash平台中的编程语言版本,它在2006年随着Flash Player 9一同发布,带来了显著的性能提升和更严格的面向对象编程模型。AS3.0的语法更加现代化,与ECMAScript 4紧密相关,提升了...

    zuma.zip_as3_as3 flash game_flash as3.0游戏_game as3_zuma

    4. 动画和物理效果:游戏中的运动效果和球之间的碰撞,可以通过AS3.0的Tween和物理引擎库来实现。 三、源码结构分析 在压缩包中的"zuma"文件夹中,我们可能看到以下关键文件: 1. Main.as:这是游戏的主入口点,...

    as3.0 翻转效果 翻牌效果

    要实现翻转效果,我们需要了解基本的AS3.0语法,如类、对象、事件处理和图形绘制。 2. **舞台与显示对象** 在AS3.0中,所有可视元素都是DisplayObject的实例,如MovieClip和Sprite。我们将创建一个或多个显示对象...

Global site tag (gtag.js) - Google Analytics