Замедление и остановка фрагмента ролика во флэш-памяти AS3? - PullRequest
1 голос
/ 08 декабря 2011

Мне нужно замедлить, а затем остановить анимацию клипа, используя AS3.Замедление будет вызвано нажатием кнопки остановки.

Кто-нибудь знает хорошую технику для этого?Я не могу использовать твининговые движки для этого эффекта, так как это школьный проект, который запрещает этот тип библиотек.

Ответы [ 3 ]

1 голос
/ 09 декабря 2011

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

Вот класс, который вы можете использовать

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 голосов
/ 09 декабря 2011

Самый простой и логичный способ добиться этого - иметь свойство 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 градусов прямо на восток)

0 голосов
/ 08 декабря 2011

Вы можете уменьшить частоту кадров:

stage.frameRate = N;

Но учтите, что это уменьшит частоту кадров всего вашего SWF.

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