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

Вернуться   Форум Flasher.ru > Flash > Общие вопросы о Flash (не затрагивающие ActionScript)

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.02.2007, 22:01
AlexSol вне форума Посмотреть профиль Отправить личное сообщение для AlexSol Найти все сообщения от AlexSol
  № 1  
Ответить с цитированием
AlexSol

Регистрация: Dec 2005
Сообщений: 316
По умолчанию выход курсора за пределы флешки

делаю флешку для сайта. Есть объекты которорые 'прилипают' к курсору если навести мышку на некую область, когда курсор выходит их области объекты возвращаются на свои места. Поскольку области могут иметь общую границу с самой флешкой, то возникает проблема возврашения объектов на свои места, когда курсор уходит за пределы флешки...
пробовал определить наличие мыша в области ролика так:
Код:
_root.onEnterFrame = function() {
	if (_root._xmouse<0 || _root._xmouse>Stage.width || _root._ymouse<0 || _root._ymouse>Stage.height) {
		tt.text = '!!!';
	} else {
		tt.text = Stage.width+':'+_root._xmouse+'\n'+Stage.height+':'+_root._ymouse;
	}
};
срабатывает только в момент загрузки, а потом выдает последние координаты мышки в ролике.
Подскажите как можно отследить, что курсор ушел c флешки?

Старый 06.02.2007, 22:06
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
В AS3 есть специальное событие для этого. Варианты реализации (не идеальные) под младшие версии есть на форуме.

Старый 06.02.2007, 22:50
AlexSol вне форума Посмотреть профиль Отправить личное сообщение для AlexSol Найти все сообщения от AlexSol
  № 3  
Ответить с цитированием
AlexSol

Регистрация: Dec 2005
Сообщений: 316
про as3 знаю, но нужна 8. тоже складывается ощущение, что видел на форуме, вот только подобрать слова для поиска что-то не получается...

Старый 06.02.2007, 23:11
lowka вне форума Посмотреть профиль Отправить личное сообщение для lowka Найти все сообщения от lowka
  № 4  
Ответить с цитированием
lowka

Регистрация: Sep 2006
Сообщений: 256
(Обновлено)
Может такой вариант подойдет:
Код:
import mx.utils.Delegate;

class AdvancedStage extends Stage {	
	private static var background:MovieClip;
	private static var _initialized:Boolean;
	private static var _atStage:Boolean;
	
	private static var broadcastMessage:Function;
	public static var addListener:Function;
	public static var removeListener:Function;
	
	/**
	* Инициализация.
	*/
	public static function init():Void {
		if(!AdvancedStage._initialized && AdvancedStage.background.getDepth()){
			return;
		}
		AsBroadcaster.initialize(AdvancedStage);
		AdvancedStage._initialized = true;
		AdvancedStage.createBackground();

		Stage.addListener(AdvancedStage);
		
		AdvancedStage.onResize();
	}
	
	/**
	* Создаем прозрачный фон.
	*/
	private static function createBackground():Void {
		AdvancedStage.background = _root.createEmptyMovieClip("__stageBackground", -16900);
		AdvancedStage.background.useHandCursor = false;
		
		with(AdvancedStage.background){
			beginFill(0xff0000, 0);
			lineTo(10, 0);
			lineTo(10, 10);
			lineTo(0, 10);
			lineTo(0, 0);
		}
		
		AdvancedStage._atStage = false;
		AdvancedStage.background.onRollOver = Delegate.create(AdvancedStage, AdvancedStage.onRollOver);
		AdvancedStage.background.onRollOut = AdvancedStage.background.onReleaseOutside = Delegate.create(AdvancedStage, AdvancedStage.onRollOut);
	}
	
	/**
	*  Генерация  события onStageOver.
	*/
	private static function onRollOver():Void {
		if(AdvancedStage.background._xmouse > 0 && AdvancedStage.background._ymouse > 0 &&
		   AdvancedStage.background._xmouse < AdvancedStage.background._width && 
		   AdvancedStage.background._ymouse < AdvancedStage.background._height && !AdvancedStage._atStage){
			
			AdvancedStage._atStage = true;
			AdvancedStage.broadcastMessage("onStageOver");
		}
	}
	
	/**
	* Генерация события onStageOut.
	*/
	private static function onRollOut():Void {
		if(AdvancedStage._atStage){
			AdvancedStage._atStage = false;
			AdvancedStage.broadcastMessage("onStageOut");
		}
		updateAfterEvent();
	}
	
	/**
	* Изменение размера фона в соответствие с размерами сцены.
	* Генерация события onStageResize.
	*/
	private static function onResize():Void {
		AdvancedStage.background._width = Stage.width;
		AdvancedStage.background._height = Stage.height;
		
		AdvancedStage.broadcastMessage("onStageResize");
	}
}
Недостаток: Если курсор покинул сцену, а кнопка мыши зажата, то событие onStageOut сработает только после того, как кнопка будет отпущена.


Последний раз редактировалось lowka; 07.02.2007 в 20:47.
Старый 07.02.2007, 14:48
AlexSol вне форума Посмотреть профиль Отправить личное сообщение для AlexSol Найти все сообщения от AlexSol
  № 5  
Ответить с цитированием
AlexSol

Регистрация: Dec 2005
Сообщений: 316
спасибо! частично работает.
недостатки такие:
1) в момент загрузки не срабатывает ни одно из событий - начинает работать только при наведение на флешку /это я поправил/
2)есть несколько клипов, для которых прописано onPress - при наведение на них фызывается "onStageOut".
помогите пожалуйста обойти второй момент.

Старый 07.02.2007, 20:50
lowka вне форума Посмотреть профиль Отправить личное сообщение для lowka Найти все сообщения от lowka
  № 6  
Ответить с цитированием
lowka

Регистрация: Sep 2006
Сообщений: 256
Работает только с align=TL. А для всех возможных кнопок на сцене нужно делать проверку в обработчике (см. пример кода).
Код:
import AdvancedStage;

var button:MovieClip;

//Проверка положения курсора.
function cursorAtTarget(target:MovieClip):Boolean {
	if(target._xmouse>=0 && target._ymouse>=0 &&
	   traget._xmouse <= target._width &&
	   target._ymouse <= target._height ){
		return true;
	}else{
		return false;
	}
}

function onStageOut() {
	//эту проверку нужно осуществлять для всех объектов
	//у которых есть обработчик хотя бы одного 
	//из перечисленных ниже событий:
	//onRelease, onReleaseOutside, 
	//onPress, onRollOver, onRollOut.
	//если курсор над объектом, то игнорируем событие.
	if(cursorAtTraget(button)){
		return;
	}
	trace("onStageOut");
} 

function onStageOver() { 
	trace("onStageOver");
}

//инициалиация (в onEnterFrame для IE).
function onEnterFrame():Void {
	//корректно работает только для topleft :(
	AdvancedStage.align="TL";

	AdvancedStage.init();
	AdvancedStage.addListener(this);
	
	delete this.onEnterFrame;
}

Старый 08.02.2007, 17:26
AlexSol вне форума Посмотреть профиль Отправить личное сообщение для AlexSol Найти все сообщения от AlexSol
  № 7  
Ответить с цитированием
AlexSol

Регистрация: Dec 2005
Сообщений: 316
спасибо за помошь!
часть проблем ушла, но часть осталась - если курсор на объекте, а объект пересекается с границами ролика, то событие onStageOut не срабатывает.
Вложения
Тип файла: rar san_u.rar (43.0 Кб, 115 просмотров)

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:56.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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