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

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

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

Регистрация: Oct 2010
Сообщений: 85
По умолчанию До объекта не доходит событие

Если первый объект перекрывается вторым, то до первого объекта не доходит событие.

В примере это хорошо видно. Красный прямоугольник, это не видимый объект, для того чтобы использовать событие MOUSE_WHEEL, под ним расположены три кнопки и если красный прямоугольник перекрывает кнопки, то до них не доходят события, как это исправить?
Вложения
Тип файла: zip Main.zip (1.7 Кб, 26 просмотров)

Старый 27.10.2010, 14:32
Obi вне форума Посмотреть профиль Отправить личное сообщение для Obi Найти все сообщения от Obi
  № 2  
Ответить с цитированием
Obi
 
Аватар для Obi

Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
Повесить MOUSE_WHEEL на контейнер, содержащий все нужные объекты, использовать метод getObjectUnderPoint для получения объектов под мышкой.
__________________
#flasher@irc.trg.ru:6667

Старый 28.10.2010, 14:31
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 3  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
getObjectUnderPoint работает. Но я не могу понять, он работает когда я щелкаю по объектам, а когда использую MOUSE_OVER то события до объектов опять же не доходят. Вот пример и код:

Код AS3:
package {
 
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.text.TextField;
	import flash.ui.Mouse;
 
	[SWF(backgroundColor="0xFFFFFF", width="800", height="600", frameRate="30")]
 
	public class Main extends Sprite {
 
		private var txt:TextField
		private var container:Sprite
 
 
		public function Main() {
			init();
		}
 
		private function init():void {
			txt = new TextField();
 
			container = new Sprite();
			addChild(container)
 
			for(var i:uint = 0; i<3; i++){
 
				var sp:Sprite = new Sprite();
				container.addChild(sp);
 
				sp.name = "button: "+i
 
				sp.graphics.beginFill(0x000000, 0.7);
				sp.graphics.drawRect(100, 100, 100, 50);
				sp.graphics.endFill();
				sp.y = Number(sp.y + sp.height+10)*i;
 
				addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
 
				addEventListener(MouseEvent.CLICK, clickListener);
 
			}
 
			var bg:Sprite = new Sprite();
			addChild(bg);
			bg.addChild(txt);
 
			bg.name = "BG"
 
			bg.graphics.beginFill(0xF5003D,0.5);
			bg.graphics.drawRect(150, 100, 100, 170);
			bg.graphics.endFill();
			bg.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheel);
 
		}
 
		private function clickListener (e:MouseEvent):void {
			var p:Point = new Point(e.stageX, e.stageY);
 
			var arr:Array = container.getObjectsUnderPoint(p);
 
			checkInfo(arr);
 
		}
 
		private function checkInfo (arr:Array):void {			
			var info:String;
			for (var i:uint = arr.length; i--; ){
				info = arr[i].name + " ";
				arr[i].alpha = 0.5
			}
 
			trace(info);
		}
 
		private function mouseOver(e:MouseEvent):void {
 
			var p:Point = new Point(e.stageX, e.stageY);
 
			var arr:Array = container.getObjectsUnderPoint(p);
 
			checkInfo(arr);
		}
 
		private function mouseWheel(e:MouseEvent):void {
 
			txt.text = "wheel"
 
		}
 
	}
}
Вложения
Тип файла: zip Main.zip (1.9 Кб, 29 просмотров)

Старый 28.10.2010, 15:21
leofit вне форума Посмотреть профиль Отправить личное сообщение для leofit Найти все сообщения от leofit
  № 4  
Ответить с цитированием
leofit
 
Аватар для leofit

Регистрация: Dec 2009
Сообщений: 428
А Вам вообще нужно ловить события на прямоугольнике?
Во первых, он называется bg(background?) но в списке отображения находится выше кнопок
Во вторых не мешало бы сделать
Код AS3:
bg.name = "BG"
bg.mouseEnabled = false;
В этом случае прямоугольник не будет перехватывать события мыши.
Но, мб, я просто не понял Ваших замыслов
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг

Старый 29.10.2010, 07:43
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 5  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
bg подразумевалось, как область для мыши. Расположено всё верно. В чем собственно и суть вопроса.
Красный прямоугольник - это область для события MOUSE_WHEEL, убивать его свойством mouseEnabled нет необходимости.

Замысел простой (: Те 3 кнопки, это некоторый список, который нужно прокручивать, поэтому с верху, над ними, находится красный прямоугольник - область для события MOUSE_WHEEL.

Возможно, я чего не догоняю и нужно всё по другому организовать для правильной работы.

Старый 29.10.2010, 11:40
Obi вне форума Посмотреть профиль Отправить личное сообщение для Obi Найти все сообщения от Obi
  № 6  
Ответить с цитированием
Obi
 
Аватар для Obi

Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
Ваши объекты и не будут диспатчить мышиные события, если перекрыты InteractiveObject'ами с включенным mouseEnabled. Предполагалось, что по MOUSE_WHEEL у контейнера, где находятся все нужные объекты, вы будете искать детей, находящихся под мышкой, используя метод getObjectsUnderPoint. Результат будет тот-же, как если бы у вас все объекты диспатчили MOUSE_WHEEL

Хотя у меня большие сомнения, что решение, которое вызвало необходимость таких извращений, правильное. Опишите ситуацию в целом, может что-то умное подскажем

Добавлено через 4 минуты
Цитата:
Сообщение от BornTOFree Посмотреть сообщение
getObjectUnderPoint работает. Но я не могу понять, он работает когда я щелкаю по объектам, а когда использую MOUSE_OVER то события до объектов опять же не доходят. Вот пример и код:

Код AS3:
package {
 
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.text.TextField;
	import flash.ui.Mouse;
 
	[SWF(backgroundColor="0xFFFFFF", width="800", height="600", frameRate="30")]
 
	public class Main extends Sprite {
 
		private var txt:TextField
		private var container:Sprite
 
 
		public function Main() {
			init();
		}
 
		private function init():void {
			txt = new TextField();
 
			container = new Sprite();
			addChild(container)
 
			for(var i:uint = 0; i<3; i++){
 
				var sp:Sprite = new Sprite();
				container.addChild(sp);
 
				sp.name = "button: "+i
 
				sp.graphics.beginFill(0x000000, 0.7);
				sp.graphics.drawRect(100, 100, 100, 50);
				sp.graphics.endFill();
				sp.y = Number(sp.y + sp.height+10)*i;
 
				addEventListener(MouseEvent.MOUSE_OVER, mouseOver);
 
				addEventListener(MouseEvent.CLICK, clickListener);
 
			}
 
			var bg:Sprite = new Sprite();
			addChild(bg);
			bg.addChild(txt);
 
			bg.name = "BG"
 
			bg.graphics.beginFill(0xF5003D,0.5);
			bg.graphics.drawRect(150, 100, 100, 170);
			bg.graphics.endFill();
			bg.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheel);
 
		}
 
		private function clickListener (e:MouseEvent):void {
			var p:Point = new Point(e.stageX, e.stageY);
 
			var arr:Array = container.getObjectsUnderPoint(p);
 
			checkInfo(arr);
 
		}
 
		private function checkInfo (arr:Array):void {			
			var info:String;
			for (var i:uint = arr.length; i--; ){
				info = arr[i].name + " ";
				arr[i].alpha = 0.5
			}
 
			trace(info);
		}
 
		private function mouseOver(e:MouseEvent):void {
 
			var p:Point = new Point(e.stageX, e.stageY);
 
			var arr:Array = container.getObjectsUnderPoint(p);
 
			checkInfo(arr);
		}
 
		private function mouseWheel(e:MouseEvent):void {
 
			txt.text = "wheel"
 
		}
 
	}
}

Код AS3:
private function mouseOver(e:MouseEvent):void {
 
var p:Point = new Point(container.mouseX, container.mouseY);
 
var arr:Array = container.getObjectsUnderPoint(p);
 
checkInfo(arr);
}
__________________
#flasher@irc.trg.ru:6667


Последний раз редактировалось Obi; 29.10.2010 в 11:43.
Старый 29.10.2010, 17:21
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 7  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
Цитата:
Ваши объекты и не будут диспатчить мышиные события, если перекрыты InteractiveObject'ами с включенным mouseEnabled.
А почему тогда события по клику диспатчатся?

Ситуация в целом:

Есть SQLite база нужно данные базы разбить в список в виде кнопок. Этот список может быть большим и не помещаться на экране, поэтому его нужно прокручивать. Использовать компоненты я в принципе не хочу.

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

Класс UserView описывает одну кнопку. Этот класс так же понимает, что, если на него навели мышкой MOUSE_OVER, то он меняет свое свойство, в данном случае alpha.

Класс UsersList наследует модель класса SQLitePManager. Наследование я откоцал, записал построение списка через цикл. Т.е. UsersList создает список из UserView.

Далее класс ManagersUsers берет готовый список UsersList добавляет к списку кнопки управления, объект поверх списка для скроллирования, который в свою очередь и перекрывает доступ событий.

Есть вариант, повесить MOUSE_MOVE и проверять постоянно расположение мыши и если мышь попадает в нужные координаты, то можно скроллить, но это совсем убогий вариант, на самый крайний случай.

Цитата:
Код:
var p:Point = new Point(container.mouseX, container.mouseY);
Тот же результат.
Вложения
Тип файла: zip Project_TEST.zip (47.1 Кб, 27 просмотров)

Старый 29.10.2010, 17:29
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 8  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
А что понимается под "необходимость таких извращений"?

То, что я один объект положил на другой? Я просто не понимаю.

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

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

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


 


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


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