2010-01-28 2 views
0

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

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

Бегин-и-конец моего фильма должен быть объект это я. Моему фильму нужно будет управлять временем и продолжительностью для заданного количества кадров. Комментарий, если у вас есть идеи.

МЕТКИ

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; 
    } 
+0

Ваш вопрос не относится к Flex Framework, я удалил эту метку – invertedSpear

+0

Где вы поставить этот код? это в классе? Не забудьте положить ваш геттер и сеттер в качестве публичного поля. – Patrick

ответ

0

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

Для этого примера я использую флэш-память 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

Посмотрите, имеет ли смысл то, что я делаю – 2010-03-06 22:46:38

0

общая идея , не из готового решения:]

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 is calle d либо на enterframe, либо, если фильм остановлен на каждом тике частоты кадров (это делает его масштабируемым). playPart устанавливает воображаемый Play() и на каждом тике мы контролируем, есть ли движение, которое мы должны делать или нет. Довольно просто :)

+0

Спасибо. Я получаю синтаксическую ошибку в строке 2 Boolean = false ;. Есть ли что-то, что я предполагаю иначе. -VideoDnd – 2010-01-29 14:59:24

+0

Кто-нибудь испытал это? – 2010-02-03 18:44:45

+0

Нет, сказал, что это общая идея ... но, смотря на код, кажется, что в as3 вы не можете определить переменную thre через один var, поэтому вам нужно поставить var перед каждым определением переменной (первые три линии) –

0

Используйте недокументированный метод 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

Спасибо, я проверю это. – 2010-01-29 15:00:20

+0

У кого-нибудь есть это, чтобы работать – 2010-02-03 18:45:26

+0

yip, работает отлично! Просто сделайте тестовый пример. Это то, что делают крутые дети, и это лучший способ убедиться, что что-то работает.Создайте новый FLA (вам даже не нужно его сохранять). поместите функцию на корневую шкалу времени (без «частного»). Создайте мувиклип с анимацией и анимацией. Также поставьте его на корневую шкалу времени. Дайте ему имя экземпляра (например, «foo_mc»). Затем под функцией просто позвоните. gotoAndPlayRange (foo_mc, 10, 40); –