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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 13.01.2006, 13:39
Barss07 вне форума Посмотреть профиль Найти все сообщения от Barss07
  № 1  
Barss07
Banned

Регистрация: Sep 2005
Сообщений: 52
По умолчанию "Война" событий :)

Друзья, подскажите, пожалуйста, как победить конфликт между событиями?

Вот есть clip1. Внутри него есть clip2.
====================================
clip1.clip2.onPress = function() {
trace("Зеленый");
};
====================================
При клике на втнутренний клип событие срабатывает.
Но стоит добавить обработчик для "внешнего" клипа -

====================================
clip1.onRollOver = function() {
trace("Над черным");
};
====================================
событие внутреннего клипа не происходит.

Весьма неудобно, приходится изголяться, сильно усложняя код.
Наверяка есть грамотное решение, а?

Старый 13.01.2006, 13:52
KPaul вне форума Посмотреть профиль Отправить личное сообщение для KPaul Найти все сообщения от KPaul
  № 2  
KPaul
 
Аватар для KPaul

Регистрация: Nov 2005
Сообщений: 221
Можно например юзать hitTest.
Или если я правильно помню, можно вместо клипов использовать Button-ы
и в основных пропертях сменить "Track as Button" на "Track as menu item".
Хотя могу и ошибаться...

Старый 13.01.2006, 13:54
antonyrec вне форума Посмотреть профиль Отправить личное сообщение для antonyrec Найти все сообщения от antonyrec
  № 3  
antonyrec
 
Аватар для antonyrec

Регистрация: Jul 2005
Адрес: Ульяновск
Сообщений: 198
Цитата:
Сообщение от Barss07
Наверяка есть грамотное решение, а?
Есть. Поиск. Тема много раз обсуждалась. Поищи.

Старый 13.01.2006, 14:00
antonyrec вне форума Посмотреть профиль Отправить личное сообщение для antonyrec Найти все сообщения от antonyrec
  № 4  
antonyrec
 
Аватар для antonyrec

Регистрация: Jul 2005
Адрес: Ульяновск
Сообщений: 198
Код:
movie1.onRelease = function() {
	trace("Событие для movie1");
	if (this.movie2.hitTest(_xmouse, _ymouse, true)) {
		this.movie2.onRelease();
	}
};
movie1.movie2.onRelease = function() {
	trace("Событие для movie2");
};

Старый 13.01.2006, 14:25
Barss07 вне форума Посмотреть профиль Найти все сообщения от Barss07
  № 5  
Barss07
Banned

Регистрация: Sep 2005
Сообщений: 52
Спасибо за ответы! Не попадалось мне обсуждение этого вопроса раньше, простите.

Старый 13.01.2006, 15:07
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>Наверяка есть грамотное решение, а?
решений может быть много, но в каждом конкретном случае свое..
если любопытно вот решение,претендующее на некую универсальность:
на прототип мувиклипа вешаем просмотр хиттестов всех мувиков,
опредляем на какие пришелся клик,
если их несколько, вычисляем кто верхний,
вещаем событие с таргетом=этому мувику:
Код:
import mx.events.EventDispatcher;
EventDispatcher.initialize(MovieClip.prototype);

MovieClip.prototype.onRelease=function(){
	if(!_root.hitTest(_xmouse,_ymouse,true))return;
	var mc_array=[];
	getMC=function(mc){
		for(var i in mc)if(typeof mc[i] == 'movieclip' && mc[i].hitTest(_xmouse,_ymouse,true)){
			mc_array.push(mc[i]);
			getMC(mc[i]);
		}
	}
	getMC(_root);//находим все мувики с которыми есть хиттест, 
	//хорошо если он один, если много нужно знать какой сверху
	////////функции для сортировка пересекающихся мувиков////////////
	var isParent=function (a,b){//является ли a потомком b ?
		while((a=a._parent)!=_root) if(a==b) return true;
		return false;
	}
	var getParentDepth=function(a,p){//глубина контейнера a в предке p
		while(a._parent!=p) a=a._parent;
		return   a.getDepth();
	}
	var getGeneric=function(a,b){//ближайший общий родитель
		while (!isParent(a,b) && b!=_root)b=b._parent;
		return b
	}
	var order=function(a,b){//функция для сортировки
		//если родство по прямой, то дети всегда выше  родителей 
		if(isParent(a,b))return -1;
		if(isParent(b,a))return  1;
		//для двоюродных меряемся предками
		var p=getGeneric(a,b);//ближайший общий родитель
		return getParentDepth(a,p) > getParentDepth(b,p);//глубины контейнеров в ближайшем общем родителе
	}
	///////////////////////////////////////
	switch(mc_array.length){
		case 0:return;//нет ничего, выходим
		case 1:var mc=mc_array[0];break;//только один
		default :var mc=mc_array.sort(order)[0];//много: сортируем 
	}
	this.dispatchEvent({type:'realRelease',target:mc});
}

MovieClip.prototype.addEventListener('realRelease',onRealRelease);
//теперь просто слушаем событие 'realRelease', чтобы знать по кому кликнули
function onRealRelease(e){
	trace(e.target);
	//target=e.target;
}
Вложения
Тип файла: zip Untitled-3.zip (9.2 Кб, 73 просмотров)


Последний раз редактировалось silin; 13.01.2006 в 15:14.
Старый 13.01.2006, 15:31
Barss07 вне форума Посмотреть профиль Найти все сообщения от Barss07
  № 7  
Barss07
Banned

Регистрация: Sep 2005
Сообщений: 52
silin, спасибо, интересно! Попробую разобраться.

Есть один момнет, который я не понимаю. Когда речь идет о, скажем, событии onPress - то проблема со вложенным клипом понятна. Возникает некая двойственность.
Но если для "внешнего" клипа определено событие onRollOver, то что мешает событию onPress для внутреннего? Ведь ролловер уже произошло и, скажем так, можно о нем и забыть? Почему оно блокирует клик по внутреннему?
Ну, я готов принять это как факт, но мне непонятен смысл )

Старый 13.01.2006, 15:37
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 8  
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
придется принять это как факт
(или смотреть в сторону AS3: там этого гемора уже нет..)

Старый 14.01.2006, 00:42
Homo Sapiens вне форума Посмотреть профиль Отправить личное сообщение для Homo Sapiens Посетить домашнюю страницу Homo Sapiens Найти все сообщения от Homo Sapiens
  № 9  
Homo Sapiens
 
Аватар для Homo Sapiens

Регистрация: Nov 2004
Адрес: Санкт-Петербург
Сообщений: 751
Всё достаточно просто, если подписываешь клип на одно из кнопочных событий (onRollOver к ним тоже относится), клип начинает вести себя как кнопка, глуша при этом все события внутренних клипов.
На мой взгляд, наиболее эффективное решение - внешний клип использовать только как контейнер, не вешая на него событий, а для всей реакции на действия пользователей выделять смысловуе зоны.
Метод с использованием hitTest мне не особо нравится из-за замедления производительности и из-за корявости самого hitTest. Ради интереса можно попробовать потестить им клип в форме полумесяца

Старый 14.01.2006, 02:50
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 10  
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>из-за корявости самого hitTest.
про какую корявость речь ?
>>Ради интереса можно попробовать потестить им клип в форме полумесяца
да хоть в форме звезды Давида: mc.hitTest(x,y,true)

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

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

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


 


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


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