Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 24.01.2007, 15:20
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 1  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
По умолчанию Ловля события mouseLeave

Вот написал класс, который генерит события у 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);
		}

	}
}
Пример:
Код:
StageUtils.registerEvents(this.stage);
this.stage.addEventListener("stageMouseOver", this.stageMouseOverHandler);
this.stage.addEventListener("stageMouseOver", this.stageMouseOutHandler);


Последний раз редактировалось BlooDHounD; 24.01.2007 в 16:36.
Создать новую тему   Часовой пояс GMT +4, время: 17:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:10.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.