Actionscript 3 - пользовательское событие не получено - PullRequest
0 голосов
/ 20 октября 2010

ActionScript 3, только изучаю AS3, но знаю несколько других языков.

Что может привести к тому, что событие, которое вызов прослушивания будет выполнен без выдачи ошибки и был успешно отправлен, не будет прослушиваться? диспетчерский вызов (запускается):

private function HandleMouseClick( e:Event ):void{
if ( m_MouseState == MOUSE_STATE_SELECTED )
    m_MouseState = MOUSE_STATE_NONE;
else
{
    m_MouseState = MOUSE_STATE_SELECTED;
    var evt:PlayerMoveFinishedEvent =  new PlayerMoveFinishedEvent( m_uiValue, Operation.ADDITION );
    var result:Boolean = dispatchEvent( evt );
    trace(result);
}

m_bDirty = true;

}

Прослушивание вызова (это выполняется):

addEventListener( PlayerMoveFinishedEvent.MOVE_FINISHED, HandlePlayerMove );

Обработчик (никогда не вызывается):

public function HandlePlayerMove( e:PlayerMoveFinishedEvent ):void{trace("received!");}

Сообщение:

public class PlayerMoveFinishedEvent extends Event 
{
    public static const MOVE_FINISHED:String = "MoveFinished111wefsdsdvs";
    private var m_uiValue:uint;
    public var m_Operation:uint;

    public function PlayerMoveFinishedEvent( _uiValue:uint, _Operation:uint ) 
    { 
        super( PlayerMoveFinishedEvent.MOVE_FINISHED);

        m_uiValue = _uiValue;
        m_Operation = _Operation;

    } 

    public function get Value():uint 
    {
        return m_uiValue;
    }

    public function get Operation():uint
    {
        return m_Operation;
    }

    public override function clone():Event 
    { 
        return new PlayerMoveFinishedEvent( m_uiValue, m_Operation );
    } 

    public override function toString():String 
    { 
        return formatToString("PlayerMoveFinishedEvent", "type", "bubbles", "cancelable", "eventPhase"); 
    }

}

(извините за форматирование, я виню за предварительный просмотр)

обновление: хорошо, вот полный класс слушателя:

public class MoveTracker extends Sprite
{
    private var m_kCurrentOperation:Operation = null;
    private var m_uiTotalMoves:uint = 0;

    public function MoveTracker() 
    {
        super();
        var s:String = PlayerMoveFinishedEvent.MOVE_FINISHED;
        addEventListener( s, HandlePlayerMove );
    }

    public function HandlePlayerMove( e:PlayerMoveFinishedEvent ):void
    {
        var runningTotal:uint = 0;
        if ( m_kCurrentOperation != null )
            runningTotal = m_kCurrentOperation.RunningTotal;

        m_kCurrentOperation = new Operation( runningTotal, e.Value, e.Operation, m_kCurrentOperation );
        // draw in the right spot.
        m_kCurrentOperation.y = m_uiTotalMoves * m_kCurrentOperation.y;
        m_uiTotalMoves++;
        addChild( m_kCurrentOperation );
    }


}

теперь класс места, где его добавлено, можно вернуть к необходимому:

public class Square extends Sprite{     
private static var MOUSE_STATE_NONE:uint = 0;
private static var MOUSE_STATE_HOVER:uint = 1;
private static var MOUSE_STATE_SELECTED:uint = 2;

... здесь другие переменные ...

public function Square(_x:Number, _y:Number, fWidth:Number, fHeight:Number, colour:uint, value:uint) 
{   
    super();
    x = _x;
    y = _y;


    m_kSize = new Point( fWidth, fHeight );
    m_uiColour = colour;
    m_uiSelectedColour = 0xFF80C0;
    m_uiHoverColour = 0x9BDB88;
    m_uiValue = value;


    var kTextDisplay:Bitmap;
    var kTextDisplayData:BitmapData;            
    kTextDisplayData = new BitmapData(m_kSize.x, m_kSize.y, true, 0x00FFFFFF);
    DText.draw( kTextDisplayData, m_uiValue.toString(), 0, 0, DText.LEFT );
    kTextDisplay = new Bitmap( kTextDisplayData );

    // position the number in the centre of the square.
    kTextDisplay.x = m_kSize.x * 0.5 - ( 8 * ( m_uiValue.toString().length * 0.5 ) ) ;
    kTextDisplay.y = m_kSize.y * 0.5 - 8;
    addChild( kTextDisplay );

    m_MouseState = MOUSE_STATE_NONE;

    addEventListener(MouseEvent.MOUSE_OVER, HandleMouseEnter);
    addEventListener(MouseEvent.MOUSE_OUT, HandleMouseExit);

    addEventListener(MouseEvent.CLICK, HandleMouseClick );

    addEventListener(Event.RENDER, Draw );

    m_bDirty = true;
}
private function HandleMouseClick( e:Event ):void 
{
    if ( m_MouseState == MOUSE_STATE_SELECTED )
        m_MouseState = MOUSE_STATE_NONE;
    else
    {
        m_MouseState = MOUSE_STATE_SELECTED;
        var evt:PlayerMoveFinishedEvent =  new PlayerMoveFinishedEvent( m_uiValue, Operation.ADDITION );
        var result:Boolean = dispatchEvent( evt );

    }

    m_bDirty = true;
}

}

"Квадраты" прикреплены к шахматной доске, которая прикреплена к моему основному приложению (которое расширяет спрайт). шахматная доска отображает и имеет все поведение, которое я хочу, но когда я щелкаю квадрат, событие щелчка запускает и отправляет пользовательское событие, но пользовательское событие никогда не принимается.

это должен быть весь необходимый код, остальная часть кода предназначена только для создания сетки и помещения случайных чисел в квадраты, что прекрасно работает.

приветствуется любой совет! :)

в соответствии с каждым веб-сайтом, на котором есть «учебник по пользовательскому событию», может показаться, что у меня есть все необходимое для прослушивания события, его просто не происходит: (

1 Ответ

0 голосов
/ 20 октября 2010

Чтобы ответить на ваш вопрос, нам нужно знать, кто отправляет событие и где / когда вы добавляете прослушиватель событий.

Почему ваш слушатель HandlePlayerMove является публичной функцией?

Вы можете попробовать другой подход, при котором вы будете использовать диспетчер в классе Square, который будет прослушивать пользовательское событие в классе шахматной доски.

// In your Main Class, you create a new instance of an EventDispatcher
// and pass it as a parameter to the children
public class Main extends Sprite
{
    private var dispatcher:EventDispatcher;

    public function Main()
    {
       dispatcher = new EventDispatcher();
       dispatcher.addEventListener( PlayerMoveFinishedEvent.MOVE_FINISHED, 
                HandlePlayerMove )
    }
    // later in your code when you create a Square
    var square = new Square(dispatcher );
}

public class Square extends Sprite
{
     private var _dispatcher:EventDispatcher;

     public function Square(dispatcher:EventDispatcher):void
     {
         this._dispatcher = dispatcher;
     }

     //etc....

     private function HandleMouseClick( e:Event ):void 
     {
       //.... your code here
        _dispatcher.dispatchEvent( evt );
       //.... your code here
     }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...