【问题标题】:Actionscript 3 - Custom Event not being receivedActionscript 3 - 未收到自定义事件
【发布时间】:2010-10-20 09:33:16
【问题描述】:

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;
}

}

“方格”与我的主应用程序(扩展 sprite)的棋盘格相关。棋盘显示并具有我想要的所有行为,但是当我单击正方形时,单击事件会触发并调度自定义事件,但从未收到自定义事件。

这应该是所需的所有代码,其余代码只是创建一个网格并将随机数放入正方形中,效果很好。

任何建议表示赞赏! :)

根据每个具有“自定义事件教程”的网站,我似乎拥有收听事件所需的一切,但它只是没有发生 :(

【问题讨论】:

  • addEventListener() 和 HandleMouseClick() 调用是否定义在同一个类中?
  • 是的,同一个类,派生自精灵。代码如下,不适合评论。

标签: actionscript-3 events


【解决方案1】:

为了回答您的问题,我们需要知道谁在调度事件以及您在何处/何时添加事件侦听器。

为什么你的 HandlePlayerMove 监听器是一个公共函数?

您可以尝试另一种方法,在 Square 类中使用调度程序,该调度程序将侦听棋盘类中的自定义事件。

// 在您的主类中,您创建一个 EventDispatcher 的新实例 // 并将其作为参数传递给孩子 公共类 Main 扩展 Sprite { 私有 var 调度程序:EventDispatcher; 公共函数 Main() { 调度员 = 新的 EventDispatcher(); dispatcher.addEventListener(PlayerMoveFinishedEvent.MOVE_FINISHED, 手柄播放器移动) } // 稍后在您的代码中创建 Square 时 var square = new Square(dispatcher); } 公共类 Square 扩展 Sprite { 私人 var _dispatcher:EventDispatcher; 公共函数 Square(调度程序:EventDispatcher):无效 { this._dispatcher = 调度员; } //ETC.... 私有函数 HandleMouseClick( e:Event ):void { //....你的代码在这里 _dispatcher.dispatchEvent(evt); //....你的代码在这里 } }

【讨论】:

  • 它是公开的,因为在来到这个地方之前,我尝试了所有我能想到的可能会影响直接从文档中获取的代码,但不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多