![]() |
|
||||||||||
|
|||||
|
стервочка (я мужик)
|
Вот написал класс, который генерит события у Stage, если мышка его покинула или вернулась.
Может конечно коряво, поэтому прошу внести корективы, если у кого-то есть замечания. ASdocs недописаны так ... набросал ...package game.utils {
import flash.display.Stage;
import flash.events.Event;
import flash.events.MouseEvent;
public final class StageUtils {
public static function registerEvents(stage:Stage):void {
_stage = stage;
_stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveEventHandler);
_stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler);
// при создании сразу диспатчим событие
if ( _stage.mouseX <= 0 || _stage.mouseX >= _stage.stageWidth || _stage.mouseY <= 0 || _stage.mouseY >= _stage.stageHeight ) {
dispatchStageMouseOutEvent();
// если мы уже находимся за пределами, надо назначить новое событие
_stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
} else {
dispatchStageMouseOverEvent();
}
}
public static function unRegisterEvents(stage:Stage):void {
_stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler);
_stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
_stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
_stage.removeEventListener(Event.MOUSE_LEAVE, mouseLeaveEventHandler);
}
//--------------------------------------------------------------------------
//
// Class variables
//
//--------------------------------------------------------------------------
/**
* @private
* Нужно ли удалить листенер при возвращениии мышки в окно?
*/
private static var _removeMouseMove:Boolean;
/**
* @private
* Наш стэйдж храним тут.
*/
private static var _stage:Stage;
//--------------------------------------------------------------------------
//
// Class properties
//
//--------------------------------------------------------------------------
/**
* @private
*/
private static var _stageLeave:Boolean;
public function get stageLeave():Boolean {
return _stageLeave
}
//--------------------------------------------------------------------------
//
// Private class methods
//
//--------------------------------------------------------------------------
/**
* @private
* Диспатчим событие выхода за пределы.
*/
private static function dispatchStageMouseOutEvent():void {
if (_stageLeave) return;
_stageLeave = true;
_stage.dispatchEvent(new Event("stageMouseOut"));
// trace("mouseOut");
}
/**
* @private
* Диспатчим событие входа обратно.
*/
private static function dispatchStageMouseOverEvent():void {
if (!_stageLeave) return;
_stageLeave = false;
_stage.dispatchEvent(new Event("stageMouseOver"));
// trace("mouseIn");
}
//--------------------------------------------------------------------------
//
// Event handlers
//
//--------------------------------------------------------------------------
/**
* @private
* Нажали мышку. Обработчик выбегания за границу срабатывает только по отпусканию мыши,
* поэтому устанавливаем слежение за движением мыши и удаляем обработчик.
*/
private static function mouseDownEventHandler(event:MouseEvent):void {
event
_stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
_stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
}
/**
* @private
* Отпустили мышку. Удалим всякую фигню.
*/
private static function mouseUpEventHandler(event:MouseEvent):void {
_stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
_stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
}
/**
* @private
* Двигаем мышкой.
* Обрабатываем, когда мышка уже за пределами, или нажата.
*/
private static function mouseMoveEventHandler(event:MouseEvent):void {
var stageLeave:Boolean = ( event.stageX <= 0 || event.stageX >= _stage.stageWidth || event.stageY <= 0 || event.stageY >= _stage.stageHeight );
if (!_stageLeave && stageLeave) {
dispatchStageMouseOutEvent();
} else if (_stageLeave && !stageLeave) {
if (_removeMouseMove) {
_stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
_removeMouseMove = false;
}
dispatchStageMouseOverEvent();
}
}
/**
* @private
* Мышка вышла за пределы.
*/
private static function mouseLeaveEventHandler(event:Event):void {
dispatchStageMouseOutEvent();
// вышли за грницы. надо как-то отследить что мы вернулись
_stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
}
}
}
Последний раз редактировалось BlooDHounD; 24.01.2007 в 16:36. |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Раз уж, просил замечания
![]() Цитата:
Названия событий стоило бы объявить константами в классе. Не генерится событие в случае переключения по Alt-tab, хотя это можно отловить по Event.DEACTIVATE, рекомендую добавить. |
|
|||||
|
стервочка (я мужик)
|
Цитата:
Цитата:
Цитата:
Цитата:
Последний раз редактировалось BlooDHounD; 25.01.2007 в 13:18. |
![]() |
![]() |
Часовой пояс GMT +4, время: 17:12. |
|
|
« Предыдущая тема | Следующая тема » |
|
|