PDA

Просмотр полной версии : onMouseDown без DisplayObject. можно ли?


hayabu4i
22.05.2007, 21:18
Можно ли отследить нажатие кнопки мыши без привязки к какому либо объекту?

BigDan
22.05.2007, 22:24
нет...

etc
22.05.2007, 23:00
Можно. Написал один способ, но жутко извращенный, но, тем не менее, рабочий. Напишу в блоге, когда он оживет.

etc
23.05.2007, 01:53
Блог ожил.
Велкам: http://dev.etcs.ru/blog/as3/globalmouse/

Nirth
23.05.2007, 04:00
а что мешает слушать в руте?

miramax
23.05.2007, 04:53
Можно проще - http://as3.ru/?p=23
(=

Dendroid
23.05.2007, 11:54
А почему нельзя привязаться к stage? Он никуда не денется. Зачем цепляться к timeline, что есть просто спрайт, прицепленный к stage?

Dendroid
23.05.2007, 11:59
Лучше скажите чем заменить Mouse.addEventListener() в AS3 (чтобы сказать плееру, чтобы события прокрутки колеса не дублировались в браузер)? Похоже, Adobe в 9-м плеере просто забыли это сделать. :)

Timerlan
23.05.2007, 12:11
а правда, какой смысл все это делать? чем плох root для этого?

etc
23.05.2007, 13:19
Dendroid, проверь с GlobalMouse, может браузер перестанет крутить :)

Timerlan, не привязываться к каким-либо рутовым классам (ну и к самому _root) — давняя привычка ещё со времени AS2.

Ну и что касается решения miramax-а, то оно, безусловно, неплохое. Но есть пара недочетов, на мой взгляд:
1) (Самый главный) — необходимость наследования Document class от этого класса. Кому как, а мне такая цепочка наследования может помешать.
2) Все-таки привязка в InteractiveObject — на сцене висит прозрачный Sprite, который при перекрытии (а это произойдет безусловно) перестанет отлавливать события.
3) И все равно мы кликаем по какому-то визуальному объекту, а нужно было от этого уйти.

В конце-концов, два решения — не одно :)
Кому что удобнее, в общем.

Dendroid
23.05.2007, 15:36
Не, GlobalMouse не помог, плеер просто не в курсе, что куда-то там к внутреннему клипу присоединились слушатели. Для этого в AS2 и есть специальный класс Mouse: присоеденились слушатели - больше события мыши не дублируются в браузер, хотя то же колесо можно слушать и не присоединяясь к Mouse.

Я, конечно, нашёл 2 дурацких решения, ужаснитесь тоже:

1. Если есть возможность грузить внешние файлы: создаём файл на AS2, где используем класс Mouse по назначению. После загрузки этого файлы в AS3 приложение, колесо мыши отвязывается от прокрутки html страницы (когда фокус на флэшке, естественно).

2. Если нет возможности грузить внешний файл, берём файл из пункта 1 в виде массива, превращаем в ByteArray, грузим в лоадер:
var fdata:Array = [0x43575309,0x5a000000,0x789cab60,0x608d6760,0xe05fc0c0,0xc0c3c8e0,0x22c80004,0xce4cffff,0xffb76736,0x32a771,0x32b03140,0x81f3341e,0x6764610,0xcb37bfb4 ,0x38954166,0x1a2f0343,0x624a8a4f,0x6671496a,0x5e6a1143,0x90388303,0x50160042,0x120f1400];
var bytes:ByteArray = new ByteArray();
for (var i:int=0;i<fdata.length;i++) {
bytes.writeUnsignedInt(fdata[i]);
}
var l:Loader = new Loader();
l.loadBytes(bytes);
Работает. Колесо мыши захвачено. Чистая победа разума над здравым смыслом. :D

etc
23.05.2007, 15:47
Странно, я проверил, у меня скролл перестает работать.
http://etcs.ru/pre/MouseDown/global.html

Ну а победа над разумом в GlobalMouse именно по второму пункту, как можно было заметить.

Dendroid
23.05.2007, 15:51
И правда, у меня почему-то не получилось, может потому что компилял во Flash 9 alpha?

etc
23.05.2007, 15:56
Сложно сказать, у меня нету альфы уж давно. Писалось под CS3.
Скомпили во флексе.

Dendroid
23.05.2007, 16:16
Кстати, я там только что в коде нашёл аналогичный трюк, тоже swf генрится на лету:
var data:String = &apos;43575309DC020000789C9590C14EC24014456FA7C50E22220A764363E20EE3CEA50B480071019A901097A669274252A68456E5135CB1ECC68DDFE007F92B38AF039198886116CDBC7BDF3 D6FFAE6C83D02A50FE0CC40BB0C755A6CB95C36CC4F06BC7DE114A18F5EE47B612B9252F8C9389290DE4460123DC7A2D7422C923BAA23D9918998DDCCA8F0C32826A94F4DEDE85502973A4 1C5AD278350CC545406EBA6E154FBC3E9DA5D19FDE865358C6EBFCC879110A176B3EBDACE4C7841D01BC789904AA13777E6FEC8934FEA79FA5F9016C1B187D5E146D34D2D70C64D3765CAA 9D1D75A140103EC02469CCC70051273EF394AB8480B1B791DD81B3859CBB5A36996E1DEFFE0EC05A75E5627920DCEED8A2ACFC9CA77B55025A14BD97DCE6A691EB6A914CBE08581B3413AD 88554DC463ADC8554DA463A5A946859661D2C1061E2A1F10F502B0C16CBE0E53FE1366C83767C9CCD39513BCE8357B4A66757070E9AAAFC068E7B8A4A&apos;;
var length:uint = data.length;
GlobalMouse.bytes = new ByteArray();
GlobalMouse.dispatcher = new EventDispatcher();

for (var i:uint = 0;i<length;i+=2) {
GlobalMouse.bytes.writeByte(Number(&apos;0x&apos;+data.substr(i,2)));
}

GlobalMouse.loader = new Loader();
GlobalMouse.loader.contentLoaderInfo.addEventListener(Event.COMPLETE, GlobalMouse.completeHandler);
GlobalMouse.loader.loadBytes(GlobalMouse.bytes);

Это не то же самое? :)

etc
23.05.2007, 16:20
Читай пост #12 :D
Тоже самое, ессно.
Мега-изврат, но работает же. И будет работать.

Dendroid
23.05.2007, 16:29
А, точно. :)
А я-то уже подумал, что адекватное решение нашлось.

Кстати, пробовал компоненты в CS3, под AS2, понятно, мыша нормально захватывается, а вот в приложении под АS3 c этим траблы, очень смешно комбобоксы начинают елозить. Похоже в Адоб либо не догадались, либо постеснялись использовать такой хак. :)

miramax
23.05.2007, 17:59
2) Все-таки привязка в InteractiveObject — на сцене висит прозрачный Sprite, который при перекрытии (а это произойдет безусловно) перестанет отлавливать события.
Если засунуть кнопку под спрайт методом addChildAt(), то да.
Для особо одарённых придётся перегрузить методы getChildAt и addChildAt. Что бы nullSprite был полностью инкапсулированым.

UPD:
Что собственно я уже сделал. Добавив ещё несколько строк.
Теперь всё точно ОК =)