flash كتاب - أحداث فلاش على الماوس فوق




3 Answers

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

لذا، سيكون الحل القصير التالي:

  1. تحميل سوف تريد معرفة اسم معالج التمرير / تمرير الماوس. *
  2. إضافة معالج تمرير (مع تعيين الفقاعات إلى ترو)
  3. في حلقة معالج التمرير من خلال الكائنات تحت الماوس التي لديها معالجات التمرير / تمرير الماوس والحصول على تفاصيلها.

ملحوظة! يعمل جيتوبجيكتسندربوانت () إذا كان لدى سوف تحميل أذونات من المجال استضافة سوف تحميل. طريقة واحدة للعثور على أريناكسيبلوبجيكتسندربوانت () . إذا كنت تملك سوف سوف تحميل لا ينبغي أن يكون هناك أي مشاكل. وإلا فإنك تحتاج إلى crossdomain.xml على المجال الذي يستضيف صندوق سوف الذي تم منحه حق الوصول إلى نطاق new LoaderContext(true) ويجب أن يقوم new LoaderContext(true) بتمرير new LoaderContext(true) كمعلمة ثانية لطريقة التحميل () لوحدة التحميل لويدر) أو استخدام الخادم الجانب النصي في اللغة التي تختارها إلى وكيل / نسخة فوق سوف تحميلها أولا.

وهنا مثال أساسي على ما أعنيه:

package{
    import flash.display.*;
    import flash.events.*;
    import flash.geom.Point;
    import flash.net.URLRequest;
    import flash.sampler.getMemberNames;

    public class BasicInfoTest extends Sprite{

        private var cursor:Point = new Point();

        public function BasicInfoTest(){
            init();
        }
        private function init():void{
            var loader:Loader = addChild(new Loader) as Loader;
            loader.load(new URLRequest('B.swf'));
            addEventListener(MouseEvent.ROLL_OVER,onOver);
        }
        private function onOver(event:MouseEvent):void{
            cursor.x = mouseX;cursor.y = mouseY;
            var obj:Array = getObjectsUnderPoint(cursor);
            var numObj:int = obj.length; 
            for(var i:int = 0 ; i < numObj ; i++){//look for objects under cursor that have rollover/mouseover event handlers
                if(obj[i].hasEventListener(MouseEvent.ROLL_OVER) || obj[i].hasEventListener(MouseEvent.MOUSE_OVER)){
                    var members:Object = getMemberNames(obj[i]);//use @rvmook's method to get listeners
                    for each (var name:QName in members){
                        if (name.localName == "listeners"){
                            for (var j : int = 0; j < obj[i][name].length; j++){
                                var func:Function = obj[i][name][j];
                                try{
                                    func.call();
                                }catch(error:Error){
                                    trace('Methods called on mouse over:',error.message.split('on ')[1].split('.')[0]);//parse error message, you might need to adapt this
                                    trace('StackTrace',error.getStackTrace()); 
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

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

هنا هو التكيف من المثال السابق الذي يستخدم مكتبات as3-كومونس (بيتيكود، لانغ ، تسجيل وعكس ) لعرض توقيع الطريقة والجسم (كما تعليمات AVM2):

package{
    import flash.display.*;
    import flash.events.*;
    import flash.geom.Point;
    import flash.net.*;
    import flash.sampler.getMemberNames;
    import flash.utils.ByteArray;

    import org.as3commons.bytecode.swf.SWFFile;
    import org.as3commons.bytecode.swf.SWFFileIO;
    import org.as3commons.bytecode.tags.DoABCTag;

    public class AdvancedInfo extends Sprite{

        private var cursor:Point = new Point();
        private var methodInfo:Array;

        public function AdvancedInfo(){
            init();
        }
        private function init():void{
            var byteLoader:URLLoader = new URLLoader(new URLRequest('B.swf'));
            byteLoader.dataFormat = URLLoaderDataFormat.BINARY;
            byteLoader.addEventListener(Event.COMPLETE,bytesLoaded);
        }
        private function bytesLoaded(event:Event):void{
            var ba:ByteArray = event.target.data as ByteArray;//get swf bytes
            var swfFile:SWFFile = new SWFFileIO().read(ba);//read the bytes using as3-commons
            var abcTags:Array = swfFile.getTagsByType(DoABCTag);//get actionscript bytecode (ABC) tags
            for each(var tag:DoABCTag in abcTags) methodInfo = tag.abcFile.methodInfo;//loop though tags and get method information
            //display and rollOver
            var d:Loader = addChild(new Loader()) as Loader;
            d.loadBytes(ba);
            addEventListener(MouseEvent.ROLL_OVER, rolledOver,true,0,true);
        }
        private function getMethodDetails(methodName:String):String{
            var result:String = '';
            for(var i:int = 0 ; i < methodInfo.length; i++){
                if(methodInfo[i].methodName == methodName){
                    result += 'signature:\t'+methodInfo[i]+'\n';
                    result += 'body:\t'+methodInfo[i].methodBody;
                    return result;
                }
              }
            return result;
        }
        private function rolledOver(event:MouseEvent):void{
            cursor.x = mouseX;cursor.y = mouseY;
            var obj:Array = getObjectsUnderPoint(cursor);
            var numObj:int = obj.length; 
            for(var i:int = 0 ; i < numObj ; i++){
                if(obj[i].hasEventListener(MouseEvent.ROLL_OVER) || obj[i].hasEventListener(MouseEvent.MOUSE_OVER)){
                    var members:Object = getMemberNames(obj[i]);
                    for each (var name:QName in members){
                        if (name.localName == "listeners"){
                            for (var j : int = 0; j < obj[i][name].length; j++){
                                var func:Function = obj[i][name][j];
                                try{
                                    func.call();
                                }catch(error:Error){
                                    var methodName:String = error.message.split('on ')[1].split('.')[0].split('/')[1].split('()')[0]; 
                                    trace(getMethodDetails(methodName));
                                }
                            }
                        }
                    }
                }
            }
        }

    }
}

لأغراض التوثيق، ستجد هنا رمز ملف سوف الذي تم تحميله:

package {
    import flash.events.*;
    import flash.display.*;

    public class B extends Sprite {
        public function B() {
            addEventListener(Event.ADDED_TO_STAGE, init)
        }
        private function init(event:Event = null) : void {
            for (var i : int = 0; i < 1000 ; i++) {
                var b:Sprite = addChild(new Sprite()) as Sprite;
                b.graphics.lineStyle(Math.random()*3);
                b.graphics.drawCircle(-3, -3, 3);
                b.x = 3+Math.random() * stage.stageWidth - 6;
                b.y = 3+Math.random() * stage.stageHeight - 6;
                b.buttonMode = true;
                b.addEventListener(MouseEvent.ROLL_OVER, onRollOver);
            }
        }
        private function onRollOver(event : MouseEvent) : void {
            event.currentTarget.scaleX = event.currentTarget.scaleY = .1 + Math.random() * 2.1;
        }
    }
}

وهنا عينة من طريقة تتبع التفاصيل باستخدام جيتمثوديتايلز في مثال أدفانسدينفو:

signature:  private function QName[Namespace[private::B]:onRollOver](QName[Namespace[public::flash.events]:MouseEvent]) : QName[Namespace[public]:void]
body:   
    private function QName[Namespace[private::B]:onRollOver](QName[Namespace[public::flash.events]:MouseEvent]) : QName[Namespace[public]:void]
    {   
        //maxStack=5, localCount=3, initScopeDepth=9, maxScopeDepth=10
        0:debugfile     [/Users/george/Documents/Flex Builder 3/Del/src;;B.as]:2
        2:debugline     [28]:4
        4:getlocal_0        :5
        5:pushscope     :6
        6:debug     [1, 18, 0, 28]:11
        11:debugline        [29]:13
        13:getlocal_1       :14
        14:getproperty      [QName[Namespace[public]:currentTarget]]:16
        16:getlocal_1       :17
        17:getproperty      [QName[Namespace[public]:currentTarget]]:19
        19:pushdouble       [0.1]:21
        21:getlex       [QName[Namespace[public]:Math]]:23
        23:callproperty     [QName[Namespace[public]:random], 0]:26
        26:pushdouble       [2.1]:28
        28:multiply     :29
        29:add      :30
        30:dup      :31
        31:setlocal_2       :32
        32:setproperty      [Multiname[name=scaleY, nsset=[Namespace[private::B], Namespace[public], Namespace[private::B.as$25], Namespace[packageInternalNamespace], Namespace[namespace::http://adobe.com/AS3/2006/builtin], Namespace[protectedNamespace::B], Namespace[staticProtectedNamespace::B], Namespace[staticProtectedNamespace::flash.display:Sprite], Namespace[staticProtectedNamespace::flash.display:DisplayObjectContainer], Namespace[staticProtectedNamespace::flash.display:InteractiveObject], Namespace[staticProtectedNamespace::flash.display:DisplayObject], Namespace[staticProtectedNamespace::flash.events:EventDispatcher], Namespace[staticProtectedNamespace::Object]]]]:34
        34:getlocal_2       :35
        35:kill     [2]:37
        37:setproperty      [Multiname[name=scaleX, nsset=[Namespace[private::B], Namespace[public], Namespace[private::B.as$25], Namespace[packageInternalNamespace], Namespace[namespace::http://adobe.com/AS3/2006/builtin], Namespace[protectedNamespace::B], Namespace[staticProtectedNamespace::B], Namespace[staticProtectedNamespace::flash.display:Sprite], Namespace[staticProtectedNamespace::flash.display:DisplayObjectContainer], Namespace[staticProtectedNamespace::flash.display:InteractiveObject], Namespace[staticProtectedNamespace::flash.display:DisplayObject], Namespace[staticProtectedNamespace::flash.events:EventDispatcher], Namespace[staticProtectedNamespace::Object]]]]:39
        39:debugline        [30]:41
        41:returnvoid       :42
    }
traits=(no traits)

لمزيد من المعلومات حول تعليمات AVM2 قم بزيارة الوثائق أو مواصفات تنسيق ملف سوف (رابط بدف).

الخيارات الأخرى التي تتضمن برامج الطرف الثالث والتي لم يتم استكشافها بشكل كامل ستكون:

  1. باستخدام فلاشفيريبوج - شخصيا أنا لم تمكنت من الحصول على تشغيله، ربما لم أكن الإعداد بشكل صحيح.
  2. استخدم جيتوبجيكتسوندربوانت لتتبع المعلومات عن الكائنات (اسم المثيل / الخ) مع معالجات التمرير / تمرير الماوس ثم استخدم ديكومبيلر التجاري للبحث عن المعالج باستخدام المعلومات المكتسبة.

HTH

شرح ماهو

هل هناك أي طريقة لمعرفة ما هي الأساليب التي يتم استدعاؤها عند تحريك الماوس فوق كائن في مشروع فلاش؟




لا، فإنه ليس من الممكن إلا إذا كنت تجاوز addEventListener وتتبع المستمعين المضافة نفسك.

الطريقة الوحيدة المماثلة التي تقدمها إيفنتديسباتشر الأصلي هو hasEventListener التي من شأنها أن تسمح لك فقط للتحقق ما إذا كان أو لم يكن هناك مستمع مسجل لنوع الحدث معين.




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

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




Related

flash actionscript-3 actionscript