Форум 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.
Старый 25.01.2007, 13:03
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 2  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
Раз уж, просил замечания
Цитата:
Код:
private static function mouseDownEventHandler(event:MouseEvent):void {
	event <-- это что???
	_stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
	_stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
}
Пример не работает, т.к. обе функции подписаны на одно событие "stageMouseOver" (на твоей могиле будет написано "умер от copy-paste")

Названия событий стоило бы объявить константами в классе.

Не генерится событие в случае переключения по Alt-tab, хотя это можно отловить по Event.DEACTIVATE, рекомендую добавить.
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.

Старый 25.01.2007, 13:15
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 3  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Цитата:
event <-- это что???
это я собирался сперва Stage вытаскивать из eventa. потом забыл удалить
Код:
var stage:Stage = event.target as Stage;
Цитата:
Пример не работает, т.к. обе функции подписаны на одно событие "stageMouseOver" (на твоей могиле будет написано "умер от copy-paste")
От того количества, которое ты повторял мне эту фразу, я решил увековечить и поставить табличку на стол
Цитата:
Названия событий стоило бы объявить константами в классе.
Они объявлены. просто класс события лень впихивать в пост вот и вписал просто как строки
Цитата:
Не генерится событие в случае переключения по Alt-tab, хотя это можно отловить по Event.DEACTIVATE, рекомендую добавить.
сенкс.


Последний раз редактировалось BlooDHounD; 25.01.2007 в 13:18.
Создать новую тему Ответ Часовой пояс GMT +4, время: 12:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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