Flash CS4 AS3 хоризонтално превъртане на видеоклип с движение на мишката

Нов съм в AS3 и работя върху управлявана от XML навигационна система, написана на AS3.

В момента импортирах съдържанието на XML файл и го начертах вътре в съдържащ MovieClip, създаден на основно ниво динамично на сцената. Този MovieClip се нарича „контейнер“.

Това, което искам да постигна, е плавен, ускоряващ/забавящ ефект, който анимира филмовия клип на контейнера по оста X в зависимост от това къде е курсорът на мишката спрямо средата на сцената.

Моят код може да бъде намерен тук: http://pastie.org/521432

Ред 87 нататък е кодът, който използвам в момента, за да накарам филмовия клип да се превърта наляво и надясно.

Това, което имам, върши работа, но е тромаво, но върши работа - просто искам да е малко по-полирано и съм нарисувал празно с Google. Тъй като искам MovieClip да продължи да превърта с текущата относителна скорост, дори когато мишката спре да се движи, използвах екземпляр на класа Timer.

Може ли някой да предложи подобрения? Благодаря предварително.


person BeesonBison    schedule 23.06.2009    source източник


Отговори (1)


Трябва да разделите вашите изчисления и вашите методи за рисуване. Затова го накарайте да направи всички изчисления в манипулатор onMouseMove, но всъщност да начертае промените в манипулатор onEnterFrame.

Също така мисля, че вашият алгоритъм може да бъде много по-прост и никой няма да забележи. Направих бърз пример за това как можете да го направите. поставете този код в AS3 файл, наречен Main.as, и го направете документен клас на нов FLA.

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

    public class Main extends Sprite 
    {
        private const boxCount:int = 10;
        private const boxWidth:int = 45;
        private const boxMargin:int = 5;
        private const startPoint:int = 150;
        private const boxesWidth:int = boxCount * (boxWidth + boxMargin);
        private const endPoint:int = boxesWidth + startPoint;
        private const zeroPoint:int = boxesWidth / 2 + startPoint;

        private var container:MovieClip;
        private var targetX:Number;
        private var speed:Number = 0;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            container = new MovieClip();
            addChild(container);
            container.x = 150;
            container.y = 300;
            for (var i:int = 0; i < boxCount; i++) 
            {
                container.graphics.beginFill(Math.random() * 0xFFFFFF);
                container.graphics.drawRect(i*(boxWidth+boxMargin), 0, boxWidth, boxWidth);
            }

            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
        }

        private function mouseMoveHandler(e:MouseEvent):void 
        {
            var distanceFromCenter:int = stage.mouseX - zeroPoint;
            speed = distanceFromCenter * -0.01; // Bring number into a good range, and invert it.
        }

        private function enterFrameHandler(e:Event):void 
        {
            container.x += speed;
        }
    }
}
person Adam Harte    schedule 25.06.2009
comment
Благодаря много за този код. Работи наистина добре! Не съм използвал настройката DocumentClass преди - харесвам начина, по който можете да отделите ActionScript от FLA. В момента променям кода - единственият проблем, който изпитвам, е с изчисленията на zeroPoint и distanceFromCenter... изглежда, че превъртането наляво работи добре, но ако добавя още полета и се опитам да превъртя надясно, скоростта става не се увеличава? - person BeesonBison; 10.07.2009
comment
Всъщност игнорирайте горното, поправих го - промених декларацията на 'const zeroPoint' (ред 16) на: private const zeroPoint:int = stage.stageWidth / 2 + startPoint - person BeesonBison; 10.07.2009
comment
Как може този код да бъде променен, така че да работи като въртележка - автоматично рисуване на първото поле, след като се превърти до последното поле? Може ли това също да се направи така, че да превърта автоматично, когато мишката не е вътре в сцената? - person BeesonBison; 10.01.2011
comment
Успях да направя това! Вероятно не е най-добрият начин, който знам, но моля, вижте моя код: pastie.org/579689 - person BeesonBison; 10.01.2011