2011-12-08 56 views
1

我需要放慢速度,然後停止一個影片剪輯動畫us3 AS3。 單擊停止按鈕將觸發減速。減慢並停止閃存AS3中的影片剪輯?

任何人都知道一個很好的技術呢?我不能使用補間引擎來達到這種效果,因爲這是一個否認這種類型的圖書館的學校項目。

+0

時間線補間允許您設置緩動量。 –

+0

你不能只使用ActionScript自己的Tween類? – weltraumpirat

回答

0

可以降低幀率:

stage.frameRate = N; 

但是考慮到,這會降低你的整體SWF的幀率。

+0

對我來說足夠簡單,使用這種方法 –

1

您可以控制MovieClip,而不是讓它自由播放。

這裏是你可以使用一個類

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 

    public class MovieClipController 
    { 
     private var _mc:MovieClip; 
     private var _playing:Boolean; 
     private var _speed:Number; 
     private var _currentFrame:Number; 

     public function MovieClipController(mc:MovieClip) 
     { 
      _mc = mc; 
      _mc.stop(); 
      _currentFrame = _mc.currentFrame; 
     } 

     public function play(speed:Number = 1):void 
     { 
      if(!_playing) _mc.addEventListener(Event.ENTER_FRAME, handleEnterFrame); 
      _playing = true;    
      _speed = speed; 
     } 

     public function stop():void 
     { 
      if(_playing) _mc.removeEventListener(Event.ENTER_FRAME, handleEnterFrame); 
      _playing = false;   
      _mc.stop(); 
     } 

     public function get speed():Number 
     { 
      return _speed; 
     } 

     private function handleEnterFrame(e:Event):void 
     { 
      if (_playing) 
      { 
       _currentFrame += _speed; 
       _mc.gotoAndStop(Math.round(_currentFrame % _mc.totalFrames));    
      } 
     } 


    } 

} 

用法(假設myAnimation已經添加到舞臺):解決這個

var myController:MovieCLipController = new MovieClipController(myAnimation); 

... 

myController.play(1.00); // plays animation at 100% speed 

... 

myController.play(0.50); // plays animation at 50% speed 

... 

myController.play(0.10); // plays animation at 10% speed, etc 

... 

myController.play(myController.speed * 0.90); // decrease speed by 10 percent. 

... 

myController.play(myController.speed - 0.10); // decrease speed by 10 percentage points 
+0

沒有爲我工作,'myController.play(1.00)'剛剛顯示第一幀,根本沒有播放。 –

+0

我已經更新了代碼。現在它適用於我。請注意,我刪除了這一行中的最後一個trhee參數。 請替換: if(!_ playing)_mc.addEventListener(Event.ENTER_FRAME,handleEnterFrame,false,0,true); with: if(!_ playing)_mc.addEventListener(Event.ENTER_FRAME,handleEnterFrame); – JulianG

+0

我現在還編輯了一行來支持循環動畫片段。 更改此行: _mc.gotoAndStop(Math.round(_currentFrame)); with: _mc.gotoAndStop(Math.round(_currentFrame%_mc.totalFrames)); – JulianG

0

最簡單和最合理的方式是有velocity屬性你可以減少。下面是可能包含這樣的屬性的類:

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.Event; 

    public class PhysicsMovieClip extends MovieClip 
    { 
     // Properties 
     private var _velocity:Number = 0; 
     private var _angle:Number = 0; 
     public var velocityTarget:Number = 0; 


     /** 
     * Constructor 
     */ 
     public function PhysicsMovieClip() 
     { 
      addEventListener(Event.ENTER_FRAME, _handle); 
     } 


     /** 
     * ... 
     * @param e Event.ENTER_FRAME 
     */ 
     private function _handle(e:Event):void 
     { 
      _velocity -= (_velocity - velocityTarget)/10; 

      x += Math.cos(_angle) * _velocity; 
      y += Math.sin(_angle) * _velocity; 
     } 


     /** 
     * Getters & Setters 
     */ 
     public function get angle():Number{ return _angle * 180/Math.PI; } 
     public function set angle(value:Number):void 
     { 
      _angle = value/180 * Math.PI; 
     } 
    } 
} 

上述會讓你改變velocityTarget屬性,它會減慢或加快你的對象。

實施例:

var mc:PhysicsMovieClip = new PhysicsMovieClip(); // assign graphics somewhere 
addChild(mc); 


mc.velocityTarget = 10; // the MovieClip will speed up 

您可以通過設置上述像這樣angle屬性來改變移動的方向:

mc.angle = 90; // movement is now directly south 
mc.angle = 270 // movement is now directly north 

(0度是直接東閃光)