侦听器听不到AS3 DispatchedEvent

时间:2011-03-14 12:25:11

标签: flash actionscript-3

嘿所以我看了一些其他的帖子,但我仍然没有到达任何地方。

我有2个类,一个是Ticket_mc(),另一个是TicketPurchaserFSlider()。 TicketPurchaserFSlider()中存储了一个名为ticketsSelected的数字,它保存我选择的票数。现在我想要做的是能够从Ticket_mc()类中将该数字增加一。我如何设置它是为了创建一个dispatchEvent(新事件(“selectFromList”)),然后一个监听器和一个与该监听器连接的函数。不管它不起作用。这是我的代码:

    package com.spay.ticketpurchaser {

    import com.spay.ticketpurchaser.TicketPurchaserFSlider;
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.events.EventDispatcher;


    public class Ticket_mc extends MovieClip{
        public function Ticket_mc(){
            addEventListener(MouseEvent.CLICK, clickTicket);
        }

        public function clickTicket(event:MouseEvent){
            dispatchEvent(new Event("selectFromList"));
            gotoAndStop(2);
        }
    }
}

    package com.spay.ticketpurchaser{

    import com.spay.ticketpurchaser.Ticket_mc;
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.text.TextField;    

    public class TicketPurchaserFSlider extends MovieClip{

        public var ticketsSelected:Number = 0;
        private var ticket:Ticket_mc;

        public function TicketPurchaserFSlider(){           
            ticket = new Ticket_mc();
            ticket.addEventListener("selectFromList",addTicket , false,0,true);
            }

        private function addTicket(event:Event){
            ticket.removeEventListener("selectFromList", addTicket);
            ticketsSelected ++;
            trace("it works");
        }
   }
}

为澄清,这里是scenerio

我有一个ticketPurchaserFSlider类,用于保存我的ticketsSelected var。我在TicketPurchaserFSlider类中有其他方法可以增加和减少ticketsSelected var,它一切正常,然后我使用文档类addChild(ticketPurchaser)等等。

然后我需要票证,这些票证也需要也可以点击,并且还可以增加和减少ticketPurchaserFSlider类中的ticketsSelected var。要显示票证,我首先创建Ticket_mc并导出actionsctript。然后我创建了一个空的MovieClip,并为它提供了一个名为Ticket_Group的类,该类包含一个创建6个故障单实例的Array。然后我创建了另一个空的movieclip并创建了另一个类并将其命名为Ticket_Batch,它还包含一个Array并创建更多票证实例(以6的倍数表示),它创建的票证数量存储在ticketPurchaserFSlider类中,并称为maxTickets。我通过使用ticketPurchaserFSlider的一个实例并使用。来访问此数字。语法(ticketPurchaser.maxTickets)然后我使用Document类中的Ticket_Batch类的实例来添加孩子(门票),所以我从文档类中显示了所有的门票。

现在我不确定这是否是显示门票的最佳方式,但这对我来说是合乎逻辑的,并且门票将被单独选择并且可以被选择为6的倍数(使用单独的按钮)并且在我需要的两种情况下能够访问ticketPurchaserFSlider类中的ticketsSelected var。

它可以从clickTicket函数中激活。

我希望这已经解决了问题。如果您认为我需要更好的方法来设置我的课程,那么请说出来。

我已经在这里发布了这些文件:www.samuelpay.com/BingoClient.zip所以看看你是否也想要。

4 个答案:

答案 0 :(得分:0)

仅当目标位于显示列表中时才调用鼠标事件侦听器。您需要在显示列表中添加票证:

ticket = new Ticket_mc();
ticket.addEventListener("selectFromList",addTicket , false,0,true);
addChild(ticket);

答案 1 :(得分:0)

在你的这个功能中加入一个跟踪:

public function clickTicket(event:MouseEvent){
    dispatchEvent(new Event("selectFromList"));
    gotoAndStop(2);
}

让我们知道它是否会触发,即是否正在处理鼠标点击。然后我们会更多地了解问题所在。

干杯, 蒂莫

答案 2 :(得分:0)

是的,听起来这里有实例问题,你必须在特定实例上监听事件。一种解决方案可能是将Ticket_mc实例的数组传递给TicketPurchaserFSlider,以便为每个实例添加事件侦听器。另一种可能更好的方法是让Ticket_Batch监听点击,然后重新发送到TicketPurchaserFSlider。

答案 3 :(得分:0)

我就是这样做的(代码未测试,可能是拼写错误):

package com.spay.ticketpurchaser
{

    import com.spay.ticketpurchaser.Ticket_mc;
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.text.TextField;    

    public class TicketPurchaserFSlider extends MovieClip
    {

        //public var ticketsSelected:Number = 0;
        //private var ticket:Ticket_mc;
        private var _tickets:Array;

        public function TicketPurchaserFSlider(tickets:Array)
        {     
            _tickets = tickets;  
            setUpTicketListeners();  
            //ticket = new Ticket_mc();
            //ticket.addEventListener("selectFromList",addTicket , false,0,true);
            }

        private function setUpTicketListeners():void
        {
           for(var i:int = 0; i<_tickets.length; i++)
           {
               _tickets[i].addEventListener(MouseEvent.CLICK, onTicketClick);
           }
        }       

        private function onTicketClick(event:MouseEvent):void
        {
           var currentTicket:Ticket_mc = Ticket_mc(event.currentTarget);
           //do your stuff
        }

        //private function addTicket(event:Event)
        //{
           // ticket.removeEventListener("selectFromList", addTicket);
           // ticketsSelected ++;
           // trace("it works");
        //}
   }
}