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;
}
}
"Квадраты" прикреплены к шахматной доске, которая прикреплена к моему основному приложению (которое расширяет спрайт). шахматная доска отображает и имеет все поведение, которое я хочу, но когда я щелкаю квадрат, событие щелчка запускает и отправляет пользовательское событие, но пользовательское событие никогда не принимается.
это должен быть весь необходимый код, остальная часть кода предназначена только для создания сетки и помещения случайных чисел в квадраты, что прекрасно работает.
приветствуется любой совет! :)
в соответствии с каждым веб-сайтом, на котором есть «учебник по пользовательскому событию», может показаться, что у меня есть все необходимое для прослушивания события, его просто не происходит: (