ฟังเหตุการณ์ที่กำหนดเองบนคลาสหลัก AS3

นี่คือปัญหาเล็กน้อยของฉันใน actionscript เพื่อความเรียบง่าย ฉันจึงรวบรวมคลาสเล็กๆ สองคลาสไว้ด้วยกันเพื่อแสดงปัญหาของฉัน

ดังนั้นจาก RedState.as ที่ฉันส่งเหตุการณ์ที่กำหนดเอง แม่มดจะส่งสตริงไปยังผู้ฟัง ฉันต้องการฟังเหตุการณ์นี้และคว้าสตริงที่ส่งผ่านในคลาสรูท

ถ้าฉันฟังเหตุการณ์เดียวกันในคลาสอื่น ทุกอย่างดูโอเค แต่คลาสหลักไม่มีปฏิกิริยา :( :D

package 
{
    import assets.ButtonController;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;


    public class Main extends Sprite 
    {

        public var nameCollection:Array
        public var sManager:SceneManager
        public var cText:TempClass
        public var bManager:ButtonController;

        public var red:RedState
        public function Main():void 
        {   
            addEventListener(Event.ADDED_TO_STAGE, init);
        }
        public function init (e:Event):void {
            red = new RedState();
            addChild(red);
            addEventListener(TextDispatcher.SEND_TEXT, red_sendText);

        }

        public function red_sendText(e:TextDispatcher):void 
        {   trace ("Something")
            trace (e.url)
        }





    }

}


package  
{
    import flash.display.Sprite;

    public class RedState extends Sprite 
    {
        [Embed(source = "assets/states/red.png")]
        public var Red:Class;

        public var red:Sprite;

        public function RedState() 
        {
            red = new Sprite();
            red.addChild(new Red());
            addChild(red);
            dispatchEvent(new TextDispatcher(TextDispatcher.SEND_TEXT, "I wanna Sing!!"))

        }

    }

}

person lmetreveli    schedule 01.01.2014    source แหล่งที่มา


คำตอบ (1)


หากฉันเข้าใจคุณถูกต้อง คุณกำลังพยายามส่ง TextDispatcher.SEND_TEXT จากคลาส RedState สมมติว่าทุกอย่างได้รับการตั้งค่าอย่างถูกต้อง มี 2 สาเหตุที่ทำให้กิจกรรมไม่ถูกส่ง อย่างแรกคือคุณไม่ได้เพิ่ม Listener ไปยังอินสแตนซ์ RedState นั่นคือ:

public function init (e:Event):void {
    red = new RedState();
    red.addEventListener(TextDispatcher.SEND_TEXT, red_sendText);
    addChild(red);
}

การเพิ่มซึ่งจะทำให้ DispatchEvent ทำงานตั้งแต่ RedState เนื่องจากตอนนี้อินสแตนซ์ RedState กำลังรับฟังอยู่ แต่มีปัญหาอื่นในตัวสร้าง RedState:

public function RedState() {
    red = new Sprite();
    red.addChild(new Red());
    addChild(red);
    //trying to dispatch here will not work
    dispatchEvent(new TextDispatcher(TextDispatcher.SEND_TEXT, "I wanna Sing!!"))
 }

คุณกำลังพยายามจัดส่งกิจกรรมก่อนที่จะเพิ่มผู้ฟัง ขณะนี้ไม่มีวัตถุใดที่มี Listener สำหรับเหตุการณ์นี้ ดังนั้นจึงไม่สามารถเรียกใช้ red_sendText() ได้

ดังนั้นคุณควรทำสิ่งนี้แทน:

public function init(e:Event):void {
    red = new RedState();
    red.addEventListener(TextDispatcher.SEND_TEXT, red_sendText);
    red.runText();
    addChild(red);
}

จากนั้นใน RedState ของคุณ:

public function RedState() {
    red = new Sprite();
    red.addChild(new Red());
    addChild(red);
}

public function runText():void {
    dispatchEvent(new TextDispatcher(TextDispatcher.SEND_TEXT));
}

ตอนนี้อินสแตนซ์ RedState ของคุณจะรับฟังเหตุการณ์ก่อนที่คุณจะโทร runText()

person Bennett Yeates    schedule 01.01.2014