Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   onMouseDown без DisplayObject. можно ли? (http://www.flasher.ru/forum/showthread.php?t=96078)

hayabu4i 22.05.2007 21:18

onMouseDown без DisplayObject. можно ли?
 
Можно ли отследить нажатие кнопки мыши без привязки к какому либо объекту?

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;43575309DC020000789C9590C14EC24014456FA7C50E22220A764363E20EE3CEA50B480071019A901097A669274252A68456E5135CB1ECC68DDFE007F92B38AF039198886116CDBC7BDF3D6FFAE6C83D02A50FE0CC40BB0C755A6CB95C36CC4F06BC7DE114A18F5EE47B612B9252F8C9389290DE4460123DC7A2D7422C923BAA23D9918998DDCCA8F0C32826A94F4DEDE85502973A41C5AD278350CC545406EBA6E154FBC3E9DA5D19FDE865358C6EBFCC879110A176B3EBDACE4C7841D01BC789904AA13777E6FEC8934FEA79FA5F9016C1B187D5E146D34D2D70C64D3765CAA9D1D75A140103EC02469CCC70051273EF394AB8480B1B791DD81B3859CBB5A36996E1DEFFE0EC05A75E5627920DCEED8A2ACFC9CA77B55025A14BD97DCE6A691EB6A914CBE08581B3413AD88554DC463ADC8554DA463A5A946859661D2C1061E2A1F10F502B0C16CBE0E53FE1366C83767C9CCD39513BCE8357B4A66757070E9AAAFC068E7B8A4A&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

Цитата:

Сообщение от __etc
2) Все-таки привязка в InteractiveObject — на сцене висит прозрачный Sprite, который при перекрытии (а это произойдет безусловно) перестанет отлавливать события.

Если засунуть кнопку под спрайт методом addChildAt(), то да.
Для особо одарённых придётся перегрузить методы getChildAt и addChildAt. Что бы nullSprite был полностью инкапсулированым.

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


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

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