actionscript 3 - "चेतावनी: 10 9 0: प्रवासन मुद्दा" स्पष्ट रूप से ईवेंट हैंडलर को दर्ज करने के बावजूद



actionscript-3 flash (1)

मेरे पास एक खेल इंजन वर्ग है जो मूवी क्लिप से संभालता है और एक निजी इंस्टेंस विधि में माउसडाउन ईवेंट्स को संभालता है I सादगी के लिए, मैं onMouseDown ईवेंट हैंडलर का नाम onMouseDown । यह इस तरह दिख रहा है:

private function onMouseDown(e:MouseEvent):void
{
    if (_isEnginePlaying)
    {
        _player.attack();
    }
}

मैं इसे इंजन श्रेणी के init पद्धति में पंजीकृत करता हूं (स्वयं एक जोड़ाटॉटेज हेन्डलर) जो इस तरह दिखता है:

private function init(e:Event):void
{
    removeEventListener(Event.ADDED_TO_STAGE, init);
    // ...
    stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
    // ...
}

यह संकलन करता है और ठीक से काम करता है, लेकिन संकलक चेतावनी देता है:

चेतावनी: 10 9 0: माइग्रेशन समस्या: ऑन-माउसडाउन इवेंट हैंडलर स्वचालित रूप से फ्लैश प्लेयर द्वारा एक्शन स्क्रिप्ट 3.0 में रन टाइम पर ट्रिगर नहीं हुआ है। आपको पहली बार addEventListener ('mouseDown', callback_handler) का उपयोग करके इस हैंडलर को पंजीकृत करना होगा।

लेकिन, जैसा कि दिखाया गया है, मैंने addEventListener() का उपयोग करते हुए हेन्डलर को पंजीकृत किया था । कंपाइलर अभी भी इस चेतावनी का उत्सर्जन क्यों करता है और चेतावनी को दूर करने के लिए मैं क्या कर सकता हूं?


इसका कारण यह है कि हेन्डलर एक अलग उदाहरण के साथ पंजीकृत था, न कि गेम इंजिन उदाहरण ( this )। याद रखें कि एएस 2 में इवेंट हैंडलर्स को उन घटनाओं पर प्रॉपर्टी के रूप में निर्दिष्ट करके पंजीकृत किया गया था, जिन्हें संबंधित घटनाओं को संभालना चाहिए और जब जरूरत पड़ने पर स्वचालित रूप से आग लग जाए चेतावनी है डेवलपर को सूचित करने के लिए कि वे AS3 में स्वचालित रूप से आग न लगाए।

तो कंपाइलर सतर्कता के पक्ष में भर्त्सना करता है, मानता है कि मैं गेम इंजिन उदाहरण के साथ एक क्लिक हैंडलर को पंजीकृत करने की कोशिश कर रहा हूं (भले ही मैंने इसे मंच के साथ पहले से पंजीकृत कर लिया है) और मुझे उस प्रभाव के बारे में चेतावनी दी है

चेतावनी को दूर करने के कई तरीके हैं:

  1. बस onMouseDown हैंडलर का नाम बदलें "पर-" सम्मेलन AS2 से एक होल्ड होल्ड है और कंपाइलर केवल इस नामकरण सम्मेलन के बाद ही हैंडलर के लिए चेतावनियों का उत्सर्जन करता है; यदि आप एक अलग सम्मेलन के लिए सुलझाने के लिए सुविधाजनक हैं, तो यह अनुशंसित समाधान है। एडोब में प्रयुक्त कन्वेंशन "-हाण्डलर" (स्रोत 1 2 3 ) है, इसलिए onMouseDown बन जाता है:

    private function init(e:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // ...
        stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
        // ...
    }
    
    private function mouseDownHandler(e:MouseEvent):void
    {
        if (_isEnginePlaying)
        {
            _player.attack();
        }
    }
  2. यदि this ईवेंट के लिए सुन सकता है, तो उसके साथ ईवेंट को पंजीकृत करें:

    private function init(e:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // ...
        addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        // ...
    }

    अगर इरादा this लिए घटना के लिए सुनने के लिए था, तो एक अलग उदाहरण के साथ हेन्डलर को पंजीकृत करना अनुचित था।

  3. यदि आपको एक अलग उदाहरण के साथ हैंडलर को पंजीकृत करने की आवश्यकता है, लेकिन आप यह सुनिश्चित कर रहे हैं कि यह परिभाषा है कि यह कहाँ होना चाहिए, आपको हैंडलर का नाम बदलना होगा यदि आपके सभी ईवेंट हैंडलर्स में नामकरण सम्मेलन को बदलते हुए किसी भी कारण के लिए कोई विकल्प नहीं है, तो कम से कम आपको करना चाहिए जो भी आप पंजीकृत कर रहे हैं, उसका नाम उपसर्ग है, इसलिए यह स्पष्ट है कि इस हैंडलर का पंजीकरण करने का इरादा नहीं है this , लेकिन एक अलग उदाहरण के साथ:

    private function stage_onMouseDown(e:MouseEvent):void
    {
        if (_isEnginePlaying)
        {
            _player.attack();
        }
    }
  4. यदि आप चीजों को जिस तरह से रखते हैं, उस पर ध्यान देने पर जोर देते हैं, तो आप पूरी तरह से चेतावनी को दबा सकते हैं , लेकिन जाहिर है यह आपके लिए कुछ नहीं करना चाहिए जब तक कि आपके पास बहुत अच्छा कारण नहीं है।