يتم تمرير مقطع الفيلم الأفقي Flash CS4 AS3 بتحريك الماوس

StackOverflow https://stackoverflow.com/questions/1031986

سؤال

أنا جديد على AS3 وأعمل على نظام ملاحة يعتمد على XML ومكتوب بلغة AS3.

في الوقت الحالي، قمت باستيراد محتويات ملف XML ورسمته داخل ملف MovieClip الذي تم إنشاؤه على مستوى الجذر ديناميكيًا على المسرح.يُطلق على MovieClip هذا اسم "الحاوية".

ما أريد تحقيقه هو تأثير سلس ومتسارع / متباطئ يحرك مقطع الفيلم الخاص بالحاوية على طول المحور X اعتمادًا على مكان وجود مؤشر الماوس بالنسبة لمنتصف المرحلة.

يمكن العثور على الكود الخاص بي هنا: http://pastie.org/521432

السطر 87 فصاعدًا هو الرمز الذي أستخدمه الآن لجعل مقطع الفيلم ينتقل إلى اليسار واليمين.

ما لدي يعمل بالفعل ولكنه عالي الكعب ولكنه يعمل - أريد فقط أن يكون مصقولًا أكثر قليلاً وأن يكون فارغًا مع Google.لأنني أريد أن يستمر MovieClip في التمرير بالسرعة النسبية الحالية حتى عندما يتوقف الماوس عن الحركة، فقد استخدمت مثيلًا لفئة Timer.

يمكن لأي شخص أن يقترح التحسينات؟شكرا لك مقدما.

هل كانت مفيدة؟

المحلول

يجب عليك فصل حساباتك وطرق الرسم الخاصة بك.لذا اجعلها تفعل كل الحسابات في 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;
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top