كيف يمكنني إدارة رموز المكتبة مع فصول مرتبطة في Flash CS4 لتجميع/تصحيح في فلاش باني 4؟

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

سؤال

أقوم بإنشاء مشغل فيديو باستخدام Flash CS4 (يشار إليه هنا باسم "Flash") لإنشاء رموز الرسوم وتجميع وتصحيح الأخطاء مع Flash Builder 4 ("FB4"). فيما يلي الخطوات التي أتخذها في سير العمل الحالي:

-خلق الرموز الرسومية في فلاش. لقد قمت بإنشاء بعض الرموز المختلفة للاعب ، لكنني سأركز على زر التشغيل/الإيقاف المؤقت فقط ("PPBUTTON") هنا.

-في لوحة المكتبة ، أذهب إلى خصائص ربط رمز PPBUTTON والارتباط بفصل يسمى Assets.PlayPaushButtonasset الذي يمتد MovieClip. ليس لدي بالفعل حزمة أصول ولا أملك ملف فئة لـ PlayPauseButtonasset لأن Flash سوف يقوم بإنشائها لي عند النشر.

-في إعدادات نشر Flash ، قمت بتعيين المشروع لتصدير SWC الذي سيتم استخدامه في FB4 ، يسمى VideopLayerAssets.swc.

-بعد إنشاء SWC ، أقوم بإنشاء مشروع FB4 الذي يسمى "videoplayer" وأضف SWC إلى طريقي. يقوم FB4 بإنشاء فئة Videoplayer في الحزمة الافتراضية تلقائيًا.

-في videoplayer.as ، أنا استيراد الأصول.*، والتي تستورد جميع فئات الرموز التي قمت بإنشائها في Flash ومتوفر عبر videoplayerassets.swc. يمكنني الآن إنشاء إنشاء PPBUTTON وإضافة إلى المسرح ، مثل هذا:

var ppbutton:PlayPauseButtonAsset = new PlayPauseButtonAsset();
addChild(ppbutton);

في هذه المرحلة ، ليس لدى PPButton أي وظيفة لأنني لم أقم بإنشاء أي رمز لذلك. لذلك أقوم بإنشاء فصل جديد يسمى video.controls.playpausebuttonlogic الذي يمتد Assets.playPauseButtonasset. أقوم بإضافة بعض المنطق ، والآن يمكنني استخدام هذه الفئة الجديدة لوضع ppbutton عاملة على المسرح:

var ppbutton:PlayPauseButtonLogic = new PlayPauseButtonLogic();
addChild(ppbutton);

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

لذا ، أخيرًا ، هذه هي المشكلة التي أواجهها:

-حيث يصبح التصميم أكثر تعقيدًا ، يقوم المصمم بإعداد رموز لوضع أدوات التحكم في الفيديو على شريط التحكم. انه ينشئ رمز شريط التحكم ويربطه بالأصول. controlbarasset. يحتوي رمز ControlBar على رمز Ppbutton.

-ينشر المصمم SWC و ControlBarasset متاح الآن في FB4. أقوم بإنشاء فئة جديدة تسمى video.controls.controlbarlogic التي تمتد الأصول.

var controlbar:ControlBarLogic = new ControlBarLogic();
addChild(controlbar);

-هذا يعمل ، لكن Ppbutton لا يفعل أي شيء. ذلك لأن Ppbutton ، بينما داخل ControlBar ، لا يزال مرتبطًا فقط بـ PlaypauseButtonasset ، الذي لا يحتوي على أي منطق. لم أعد أقوم بتسهيل كائن PPBUTTON لأنه جزء من شريط التحكم.

هذا هو المكان الذي عالق اليوم. لا يمكنني ببساطة إعادة صياغة PPBUTTON من PPBUTTON من PlayPauseButtonLogic حيث أحصل على خطأ في النوع. وأنا لا أريد أن أجعل فصلًا يجب أن يقوم بتثبيت كل من عناصر تحكم مشغل الفيديو ، وضعهم في قيم x و y على المسرح وفقًا لكيفية وضعها المصمم ، لأن ذلك يتطلب مني أن أفتح .fla وتحقق من خصائص مختلفة للرمز ، ثم أضف تلك القيم إلى الكود. إذا قام المصمم بتغيير ، فيجب أن أذهب إلى الكود في كل مرة فقط لتحديث تلك الخصائص في كل مرة. ليست جيدة.

كيف يمكنني إعادة صياغة الرموز المتداخلة لاستخدام فئات المنطق التي أقوم بإنشائها التي تمد فئات الأصول؟ تذكر أن الحل ليس ربط رموز الفلاش بالفئات الفعلية ، لذا لا يتعين علي الاستمرار في إعادة تجميع SWC ، ما لم تكن هناك طريقة للقيام بذلك دون الحاجة إلى إعادة ترجمة SWC. أريد أن يفعل المصمم شيئًا له ، وأن ينشر SWC ، ويتم ذلك. ثم يمكنني أخذ SWC الخاص به ، وتطبيق منطقي على أصوله ، وأن أكون قادرًا على تصحيح وتجميع SWF النهائي.

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

المحلول

هذا هو الحل الذي أستخدمه أحيانًا:

بدلا من صنع PlayPauseButtonLogic يمتد PlayPauseButtonAsset, ، استخدم هذا الفئة باعتبارها واربر من palypausebuttonasset ، واستخدم التكوين بدلاً من الميراث! ؛ ).

ستحصل على شيء مثل هذا في فئة ControlBarlogic:

//constructor exemple
public function ControlBarLogic(){
     //all logic of PPButton is inside PlayPauseButtonLogic
     //you just pass a reference to the PlayPauseButtonAsset button contained inside ControlBarAsset
     var ppButtonLogic: PlayPauseButtonLogic=new PlayPauseButtonLogic(refToButtonAsset)
     //the warper class can extends EventDispatcher so you will be able to listen to custom or redisatched events
     ppButtonLogic.addEventListener("ppPause",onPause)
}

أتمنى أنها تساعدك

نصائح أخرى

يمكن أن يكون لديك فئتان ، وظائف عقد واحدة والآخر يوفر تنفيذها الرسومي (الأصول/الجلد)

لديك playpausebuttonlogic تمديد الأصول.

طريقة بسيطة لحل مشكلتك فيما يتعلق بمستمعي الأحداث ، يمكنك القيام بما يلي:

package {

    import flash.display.DisplayObjectContainer;
    import flash.events.Event;
    import flash.events.IEventDispatcher;

    public class AssetWrapper implements IEventDispatcher {
        private var _skin:DisplayObjectContainer;

        public function AssetWrapper( skin:DisplayObjectContainer = null ) {
            if ( skin ) setSkin(skin);
        }

        public function setSkin(skin:DisplayObjectContainer):void{
            _skin = skin;           
        }


        public function dispatchEvent(event:Event):Boolean{
            _skin.dispatchEvent(event);
        }

        public function hasEventListener(type:String):Boolean{
            return _skin.hasEventListener(type);
        }

        public function willTrigger(type:String):Boolean{
            return _skin.willTrigger(type);
        }

        public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void{
            _skin.removeEventListener(type, listener, useCapture);
        }

        public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{
            _skin.addEventListener(type, listener, useCapture, priority, useWeakReference);
        }


    }
}

تحرير: يمكنك بعد ذلك ، بالطبع ، إضافة أكبر عدد ممكن من الخصائص/الأساليب إلى AssetWrapper التي تولد إلى DisplayObject (Skin) كما تحتاج. كما أنه يمنحك المزيد من التحكم في تلك الخصائص/الأساليب. بمعنى آخر:

public function get x( ):Number {
    return _skin.x;
}

public function set x( v:Number ):void {
    if ( _skin.x = v ) return;
    if ( _useWholePixels ) _skin.x = Math.round(v);
    else _skin.x = v;
}

وبهذه الطريقة ، على سبيل المثال ، يمكنك توين مثيل AssetWrapper مباشرة. أيضًا ، يمكنك التحكم إذا كنت تريد وضعها بأرقام مستديرة (x = 100) أو لا (x = 100.5)

للطرق ، نفس الفكرة فقط:

public function addChild( child:DisplayObject ):DisplayObject {
    return _skin.addChild( child );
}

ثم لاستخدامه ، يمكنك تمديد AssetWrapper وتنفيذ سلوك ملموس:

package {
    import flash.display.DisplayObjectContainer;
    import flash.events.MouseEvent;


    public class SimpleButton extends AssetWrapper {


        public function SimpleButton( skin:DisplayObjectContainer = null ) {
            super(skin)
        }

        override public function setSkin( skin:DisplayObjectContainer):void {
            super.setSkin( skin );      
            addEventListener(MouseEvent.ROLL_OVER, _onRollOver );
            addEventListener(MouseEvent.ROLL_OUT, _onRollOut );         
        }

        protected function _onRollOver(e:MouseEvent):void {
            _skin.alpha = .5;
        }
        ...
}

وسوف تستخدمه على النحو التالي:

//you can get your graphical assets in many different ways
var buttonSkin:Sprite = new LibraryButtonSkin
//or
var ButtonSkinClass:Class = this.loaderInfo.applicationDomain.getDefinition("SimpleButtonSkin") as Class;
buttonSkin = new ButtonSkinClass;

var button:SimpleButton = new SimpleButton(buttonSkin);
button.addEventListener(MouseEvent.CLICK, _handleButton);

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

واو كل التدفق وغرقت في خط النهاية ....

حسنًا ، ماذا عن شيء من هذا القبيل

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

ممكن ان يكون؟.

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