Начало и конец кадра AS3 - PullRequest
0 голосов
/ 29 января 2010

Моя анимация - всего 100 кадров. Я хочу установить диапазон кадров. Есть ли команда проигрывать только кадры от 50 до 75? Я хочу, чтобы начальный и конечный кадры находились в объекте, к которому я могу обратиться позже. Должен быть «лучший» способ сделать это!

100 всего кадров <== играть от 50 до 75 ==>

ОБРАЗЕЦ

    These commands work, but I would end up adding labels and stop();

//start playing at given frame
Play at 9950.00
gotoAndPlay(4990,"Scene 1");

//advance and stop at given frame
my_mc.gotoAndStop(my_mc.currentFrame + 10);

//control frame rate on stage
Frame rate command
stage.frameRate = 90;

USE

Начало и конец моего фильма должны быть самим собой. Мой фильм должен контролировать время и продолжительность для заданного количества кадров. Прокомментируйте, если у вас есть идеи.

TAGS

AS 3.0, класс таймера, дисплей, масштабирование времени

Патрик пример изменен "Я играю со значениями, но без эффекта или ошибки"

  import flash.display.MovieClip; 
  import fl.transitions.Tween; 
  import fl.transitions.easing.*; 

    //... 

    function playFromTo(from:int, to:int, duration:Number):Tween { 

      return new Tween(this, "tweenFrame", None.easeNone, from, to, duration, true); 
    } 

    //instance of tweenFrame on stage
    var _tweenFrame:Number; 
    function set tweenFrame(value:Number):void{ 

    //what about value?
      _tweenFrame = value; 
      gotoAndStop(int(value)); 
    } 
    function get tweenFrame():Number{ 
      return _tweenFrame; 
    } 

Ответы [ 3 ]

0 голосов
/ 29 января 2010

Используйте недокументированный метод addFrameScript (), чтобы добавить код во фрейм.И пример функции может быть примерно таким:

private function gotoAndPlayRange(target:MovieClip, startFrame:uint, endFrame:uint):void 
{
    target.addFrameScript(endFrame - 1, function():void 
    {
        target.stop();
        target.addFrameScript(endFrame - 1, null, false, false);
    });
    target.gotoAndPlay(startFrame);
}

Первый параметр addFrameScript - это номер кадра, но он основан на нуле.Вот причина для -1 .

0 голосов
/ 07 марта 2010

Если вы хотите контролировать время, ускорение и т. Д. Вы можете использовать анимацию для продвижения игровой головки, добавьте геттер и сеттер, которые изменят игровую голову.

В этом примере я использую flash tweening , но вы можете использовать любую нужную библиотеку.

package  {
  import flash.display.MovieClip;
  import fl.transitions.Tween;
  import fl.transitions.easing.*;

  public class MyMC extends MovieClip { 
    //...

    public function playFromTo(from:int, to:int, duration:Number):Tween {
      // add a tween with no acceleration and a duration in second
      return new Tween(this, "tweenFrame", None.easeNone, from, to, duration, true);
    }

    private var _tweenFrame:Number;
    public function set tweenFrame(value:Number):void{
      _tweenFrame = value;
      gotoAndStop(int(value));
    }
    public function get tweenFrame():Number{
      return _tweenFrame;
    }
  }
}

или используя композицию, если вы не можете изменить мувиклип:

package  {
  import flash.display.MovieClip;
  import fl.transitions.Tween;
  import fl.transitions.easing.*;

  public class TweenableMC {
    private var _target:MovieClip;

    public function TweenableMC(target:MovieClip):void {
      _target=target;
    }

    public function playFromTo(from:int, to:int, duration:Number):Tween {
      // add a tween with no acceleration and a duration in second
      return new Tween(_target, "tweenFrame", None.easeNone, from, to, duration, true);
    }

    private var _tweenFrame:Number;
    public function set tweenFrame(value:Number):void{
      _tweenFrame = value;
      gotoAndStop(int(value));
    }
    public function get tweenFrame():Number{
      return _tweenFrame;
    }
  }
}

//...
var tm:TweenableMC=new TweenableMC(myMc);
tm.playFromTo(50, 75, 1); // play from 50 to 75 in 1 second
0 голосов
/ 29 января 2010

общая идея, а не из коробки решение:]

var _isPlaying:Boolean=false;
    _timelineMovement:Boolean=false;
    _stopMovementOn:Number;

addEventListener(Event.ENTER_FRAME, playTimeline);

function playTimeline(e:Event):void{
  if (currentFrame == _stopMovementOn) { _isPlaying = false; }
  if (!_isPlaying) { return false; }
  gotoAndStop (currentFrame + _timelineMovement);
}

function playPart(from,to:Number):void{
  if (_isPlaying) { doSomething(); }
  if (to > from) { _timelineMovement= 1; } else { _timelineMovement = -1; }
  _stopMovementOn = to;
  _isPlaying = true;
}

OnEnterFrame вызывается либо на enterframe, либо, если фильм останавливается на каждом такте частоты кадров (это делает его масштабируемым). playPart устанавливает мнимое Play() и на каждом тике, который мы контролируем, есть движение, которое мы должны делать или нет. Довольно просто:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...