actionscript 3 - لا نهاية لها تكرار التمرير الخلفية as3 أدوبي الهواء




actionscript-3 flash (2)

أنا جديد على النص البرمجي العمل. حاولت إنشاء خلفية التمرير التي لا نهاية لها التي تذهب من أعلى إلى أسفل المسرح، عموديا بالطبع. حاولت أن تفعل ذلك مع إنشاء مقطع الفيلم، ووضع الصورة في مقطع الفيلم وتطبيق بعض التعليمات البرمجية، وأنها عملت مثل سحر، ولكن لاحظت بعض التسريبات. لذلك حاولت طريقة أخرى وجدت في لجنة المكدس، التي اقترحت استخدام أسلوب نيوبيتمابداتا. السؤال الذي وجدت أن خلفية سوف تتحرك من اليسار إلى اليمين، حاولت ذلك، كان مثاليا.
حاولت فهم جميع المتغيرات والعوامل في ذلك من أجل تغييره وجعله التمرير من أعلى إلى أسفل، ولكن أتعثر في كل مرة مع سلوك غريب من ملف الفلاش. أنا متأكد من أنني أفعل شيئا خاطئا. وأود أن نقدر مساعدة .. أنا حريصة على التعلم.
هذا هو كومة مصدر لجنة الارتباط حصلت على الجواب من:
الرابط والجواب

هنا هو نفس التعليمات البرمجية التي أحاول تنفيذها، نسخها من الرابط:

package  {
    import flash.display.MovieClip;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.events.Event;
    import flash.geom.Rectangle;
    import flash.geom.Point;


    public class EndlessBG extends MovieClip{
        //this one stays stationary, we're getting the pixels for the right side of the pic from here
        private var _source:BitmapData;
        //this is the one moving to the left (the pixels for the right side are not visible except for once a cycle);
        private var _movingPixels:BitmapData;
        private var _canvas:Bitmap;
        private var _xOffset:int = 0;
        private var _rect:Rectangle = new Rectangle();;
        private var _point:Point = new Point();

        public function EndlessBG() {
            super();
            _source = new BathroomStillLife();
            _canvas = new Bitmap(new BitmapData(_source.width, _source.height));
            _canvas.bitmapData.draw(_source);
            _canvas.x = stage.stageWidth/2 - _canvas.width/2;
            _canvas.y = 5;
            addChild(_canvas);
            addEventListener(Event.ENTER_FRAME, gameLoop);
            setGeometryDefaults();
            _movingPixels = new BitmapData(_source.width, _source.height);
            _movingPixels.copyPixels(_source, _rect, _point);
            //turn this on to watch red pixels be drawn where the source pixels are coming in
            //_source = new BitmapData(_source.width, _source.height, false, 0xFF0000);
        }

        private function gameLoop(e:Event):void {
            _xOffset--;//where the background is moving to
            if (_xOffset < -_source.width) {
                _xOffset = 0;
                //this doesn't seem to work correctly:
                //_movingPixels.scroll(_source.width, 0);
                _movingPixels = new BitmapData(_source.width, _source.height);
                _movingPixels.copyPixels(_source, _rect, _point);
            }
            trace(_xOffset);
            setGeometryDefaults();
            _movingPixels.scroll(-1, 0);
            //draw the moved part of the canvas
            _canvas.bitmapData.copyPixels(_movingPixels, _rect, _point);
            //If we stop here, we get a smear to the right
            //so, get the remaining pixels directly from the source
            //1) reset our rect and point to be to the right side
            _rect.x = 0;
            _rect.width = -_xOffset;
            _point.x = _source.width + _xOffset;
            //2) copy from the source
            _canvas.bitmapData.copyPixels(_source, _rect, _point);
        }
        private function setGeometryDefaults():void {
            _rect.x=0;
            _rect.y=0;
            _rect.width = _source.width;
            _rect.height = _source.height;
            _point.x = 0;
            _point.y = 0;
        }

    }

}

أنا حقا نقدر المساعدة ... حريصة على التعلم.


أنا لست مألوفة جدا مع أدوبي الهواء، ولكن كان هذا مشكلة كان لي أيضا. أنا باستخدام فلاشديفيلوب، على الرغم من ذلك، جنبا إلى جنب مع مكتبة فلاشبونك (كلاهما مجانا تماما) ووجدت حلا هنا .

حظا سعيدا!


بشكل عام، لا تريد سوى نقل الصور النقطية أو إظهارها وإخفائها عند تشغيل الرسم المتحرك. يجب عدم رسم أو كوبيبيكسلز عند تشغيل الرسوم المتحركة. يمكنك القيام بهذه الأشياء أثناء "تحميل" لأنه يمكن أن يبطئ إطارا في الثانية الخاص بك. تحويل كل شيء إلى الصور النقطية والتخلص من جميع الرسومات المصدر (جبغ، بابوا نيو غينيا، والنص، والصور ناقلات) قبل بدء الرسوم المتحركة الخاصة بك.

للحصول على خلفية التمرير، يجب استخدام نسختين من الصورة النقطية في موفيكليب ونقل موفيكليب.

يجب وضع صورة الخلفية القابلة للتكرار (جبغ، بابوا نيو غينيا) في موفيكليب أو يخلق الخلفية في موفيكليب باستخدام ناقلات. رسم ذلك موفيكليب إلى صورة نقطية. إزالة موفيكليب الأصلي. جعل نسختين من بيتمابداتا. كومة اثنين من النهاية إلى النهاية في موفيكليب. ثم انتقل موفيكليب طول صورة الخلفية - تبدأ في 0 وتمرير حتى النسخة الثانية من الخلفية تصل 0. ثم إعادة تعيين الأول إلى 0.

في ما يلي شفرة المثال التي تم ذكرها أعلاه:

public function Main() {

    nBackgroundSpeed = 1;

    iBitmapWidth = mcBackground.mcBackgroundSource.width;
    iBitmapHeight = mcBackground.mcBackgroundSource.height;

    var bdBackground: BitmapData = new BitmapData(iBitmapWidth, iBitmapHeight, true, 0x00000000);
    bdBackground.draw(mcBackground.mcBackgroundSource, null, null, null, null, true);
    var bmpBackground0: Bitmap = new Bitmap(bdBackground, "auto", false);
    var bmpBackground1: Bitmap = new Bitmap(bdBackground, "auto", false);

    mcBackground.removeChild(mcBackground.mcBackgroundSource);
    mcBackground.mcBackgroundSource = null;

    mcBackground.addChild(bmpBackground0);
    bmpBackground0.x = 0;
    bmpBackground0.y = 0;

    mcBackground.addChild(bmpBackground1);
    bmpBackground1.x = 0;
    bmpBackground1.y = iBitmapHeight;

    addEventListener(Event.ENTER_FRAME, fEnterFrame);
}


private function fEnterFrame(event: Event): void {
    if (mcBackground.y > (0 - iBitmapHeight)) {
        mcBackground.y -= nBackgroundSpeed;
    } else {
        mcBackground.y = 0;
    }
}

واسمحوا لي أن أعرف من أي أسئلة.