0

SelectEvent というイベントがあります。バイヤーをクリックするたびに、選択イベントが開始されます。しかし、それは起こっていることではありません。

ベースの私のコード:

package 
{

    import flash.display.MovieClip;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.MouseEvent;

    public class FashionFrenzy extends MovieClip
    {

        public var Buyer_mc:Buyer;
        public var Buyers:Array;
        private var BuyerNumber:Number;
        public var xpositions:Array;
        public var ypositions:Array;
        public var SelectedBuyer:Number;

        public function FashionFrenzy()
        {

            GameTimeController();

            xpositions=new Array();
            xpositions.push(523,563,603);

            ypositions=new Array();
            ypositions.push(377,377,377);

            Buyers = new Array  ;
            BuyerNumber=0;


            Time_mc.gameTimer.addEventListener(TimerEvent.TIMER,GenerateBuyers);
            addEventListener(SelectEvent.BUYERSELECT,showselectbuyer);


        }


        public function GameTimeController()
        {
            Time_mc.StartGame();

        }
        public function showselectbuyer(event:SelectEvent):void
        {
            trace("Bamba");         
        }
        public function GenerateBuyers(event:TimerEvent):void
        {
            if(BuyerNumber<6)
            {
                if (Math.random() < 0.01)
                {
                    var position:Number = Math.floor(Math.random()*3);
                    var newBuyer_mc = new Buyer(xpositions[position],ypositions[position],BuyerNumber);
                    ypositions[position]-=40;
                    Buyers.push(newBuyer_mc);
                    addChild(newBuyer_mc);

                    BuyerNumber++;

                }
            }

                for each (var buyer_mc:Buyer in Buyers)
                {
                    if(buyer_mc.walking==true)
                    {

                        buyer_mc.Enter();


                    }


                }


        }








    }

}

購入者の私のコード:

package 
{

    import flash.display.MovieClip;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.MouseEvent;

    public class Buyer extends MovieClip
    {
        public var buyerTimer:Timer;
        public var walking:Boolean;
        public var stopposition:Number;
        public var buyerCode:Number;



        public function Buyer(startx:Number, stopy:Number, code:Number)
        {
            x=startx;
            stopposition=stopy;
            walking=true;
            buyerCode=code;

            BuyerProperties();

        }
        public function Enter():void
        {

            if(y>stopposition)
            {

                walking=false;
                StartFunction();

            }
            else
            {
                y= y+3;
            }
        }
        public function BuyerProperties():void
        {
            buyerTimer = new Timer( 25 );
            trace(" I am generated");

        }
        public function StartFunction():void
        {

            buyerTimer.start();
            addEventListener(MouseEvent.CLICK,Select);

            trace("My timer starts now within Buyer.as");
        }
        public function Select(event:MouseEvent):void
        {
            trace(buyerCode);
            dispatchEvent( new SelectEvent(SelectEvent.BUYERSELECT));
        }




    }

}

バイヤーをクリックすると、MouseEvent.CLICK がアクティブになり、buyer.as で、buyercode が画面上でトレースされます。しかし、イベントはディスパッチされていないか、ディスパッチされていますが、イベントリスナーはコードを実行していません。実行時エラーは発生しません。関数「showselectbuyer」は起動すらされません。

どのように解決すればよいですか?

4

2 に答える 2

1

受け入れられた答えは正しくありません。提供されたソリューションは機能しますが、間違った理由があります。カスタムイベントをリッスンするオブジェクトへの直接的な依存関係を作成し、そのオブジェクトをディスパッチャーにします。全体として、これにより、イベント/カスタム イベントを使用するという全体的な考えがせいぜい不必要になります。その場合、単純なコールバックが同様に機能するからです。代わりに useCapture フラグを使用すると、システム全体が期待どおりに機能します。

addEventListener(SelectEvent.BUYERSELECT,showselectbuyer, true);

受け入れられている解決策は、DisplayObject 以外のイベントの伝播を処理する逆の方法でもあります。ディスパッチャーはリスナーにする必要があり (依存関係なし)、リスナーをディスパッチャーにする必要はありません (依存関係が必要です)。

于 2015-05-04T12:12:29.693 に答える