سؤال

لدي MovieClip به وصورة بداخله يمكنني سحبها وتغيير حجمها وتدويرها.

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

كيف يمكنني استنساخ MovieClip في صورة أصغر، بحيث عندما أقوم بسحب الصورة أو تدويرها أو تغيير حجمها في MovieClip الرئيسي، سيتم تحديث الصورة الصغيرة بالتغييرات.

لقد قمت بتجربة رسم BitmapData()، ولكنه بطيء جدًا.

أي حل آخر؟

تحديث
إليك الرمز الذي أستخدمه حاليًا:

import flash.display.Bitmap;
import flash.display.BitmapData;

function createThumbnail() {
    var bmd:BitmapData = new BitmapData(mcBig.width, mcBig.height, false, 0xFFBC1C);    
    bmd.draw(mcBig);
    var b:Bitmap = new Bitmap(bmd);
    b.smoothing = true;
    b.scaleX = 0.2;
    b.scaleY = b.scaleX;
    mcSmall.addChild(b);
}

يتم استدعاء وظيفة createThumbnail عند كل عملية سحب أو تغيير حجم أو تدوير.

إذا كان لدى شخص طريقة أفضل/أسرع، اسمحوا لي أن أعرف؛)

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

المحلول

رسم BitmapData سريع للغاية.يجب أن تحاول تعديل createThumbnail الخاص بك لإعادة استخدام الصورة النقطية وإعادة الرسم فيها.يعد إنشاء مثيل للكائن نجاحًا كبيرًا، لذلك إذا كنت تقوم بإنشاء BitmapData وBitmap جديدين في كل إطار، فمن المحتمل أن يكون هذا هو مصدر مشكلتك.

import flash.display.Bitmap;
import flash.display.BitmapData;

private var _myThumb:Bitmap;            // you'll probably want to have one of these for each mcSmall instance, instead of a class-level variable - this is just here for sample reference
private var _myThumbData:BitmapData;

function createThumb() {
    _myThumbData = new BitmapData(mcBig.width, mcBig.height, false, 0xFFBC1C);
    _myThumb = new Bitmap(_myThumbData);
    _myThumb.smoothing = true;
    _myThumb.scaleX = _myThumb.scaleY = 0.2
    mySmall.addChild(_myThumb);
}

createThumb();    // call this just once per thumbnail

function createThumbnail() {    //call this every draw frame
        _myThumbData.draw(mcBig);
}

نصائح أخرى

كان الحل الأول هو BitmapData.draw() لكنك قلت أن ذلك بطيء جدًا.الطريق الآخر الوحيد الذي أعتقده هو نشر مظهره في مقطع فيلم آخر، على سبيل المثال.احصل على مستمعي الأحداث عندما تقوم بتدويرها، وقم بتعيين التدوير على الصورة المصغرة للمطابقة، اعتمادًا على مقدار التغيير الذي يمكنك تغييره، قد يستغرق هذا الكثير من العمل.لذلك قد يكون BitmapData.draw هو خيارك الأفضل.لقد استخدمت BitmapData.draw من قبل ولم يبدو أن الأداء بطيء بالنسبة لي.

إذا كان من الممكن إنشاء MovieClip الخاص بك باستخدام مُنشئ فقط، فيمكنك تجربة ما يلي:

//(stolen from http://www.dannyburbol.com/2009/01/movieclip-clone-flash-as3/)
public function duplicateDisplayObject(
                                source:DisplayObject,
                                autoAdd:Boolean = false
                                ):DisplayObject
{
    // create duplicate
    var sourceClass:Class = Object(source).constructor;
    var duplicate:DisplayObject = new sourceClass();

    // duplicate properties
    duplicate.transform = source.transform;
    duplicate.filters = source.filters;
    duplicate.cacheAsBitmap = source.cacheAsBitmap;
    duplicate.opaqueBackground = source.opaqueBackground;
    if (source.scale9Grid) {
        var rect:Rectangle = source.scale9Grid;
        // WAS Flash 9 bug where returned scale9Grid is 20x larger than assigned
        // rect.x /= 20, rect.y /= 20, rect.width /= 20, rect.height /= 20;
        duplicate.scale9Grid = rect;
    }

    // add to source parent’s display list
    // if autoAdd was provided as true
    if (autoAdd && source.parent) {
        source.parent.addChild(duplicate);
    }
    return duplicate;
}

إنه ليس مثاليًا (إذا كان مُنشئك يحتاج إلى وسيطات، أو إذا تم تعديل المقطع)، ولكنه أفضل حل رأيته.

لا توجد طريقة واضحة في الفلاش لاستنساخ MC.:-(

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top