cacheAsBitmap/filter vs mask. Девочки, сверкаем!
Маленький интродакшн: при непустом массиве filters cacheAsBitmap сразу ставится в true, поэтому по сути фильтры здесь не причем, но тем не менее, как использующее это свойство они всё таки затрагиваются.
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Shape; import flash.display.Sprite; import flash.events.MouseEvent; import flash.filters.BevelFilter; public class Tile extends Sprite { public function Tile() { super(); var _bitmapData:BitmapData = new BitmapData(100,100,false, 0xFF00); super.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); var bmp:Bitmap = new Bitmap(_bitmapData); super.addChild(bmp); //super.cacheAsBitmap = true; var _maskShape:Shape = new Shape(); _maskShape.graphics.beginFill(0); _maskShape.graphics.drawRect(0, 0, 50, 50); _maskShape.graphics.endFill(); super.mask = _maskShape; } private function onMouseDown(event:MouseEvent):void { trace("Click"); } } }
Появилась, всё хорошо. Даже реагирует на события мышки и мы радостно видим в окошке Click.
Добавим ей подружку:
var tile:Tile = new Tile(); super.addChild(tile); tile = new Tile(); super.addChild(tile); tile.x = 100;
Убираем маску: она отчетливо видна.
Чешем репу. Вспоминаем, что к Bitmap нельзя выполнять обрезку маской.
Думаем. Понимаем, что маску мы применили к Tile`у, а не Bitmap и первый тайл очень даже образался. Делаем лицо лопатой и ждём гуру. Мне не понятно такое поведение - один раз не лоботряс.
UPD: благодаря комментариям нашли проблему: Это потому что addChild забыли сделать. В итоге маска имеет координаты (0;0), а после addChild она попадает в контейнер, который маскирует, и следовательно её глобальные координаты меняются на координаты контейнера.
Расскоментиваем строчку cacheAsBitmap=true и запускаем. О, чудо! Мы видим вторую битмапу, которая не обрезана. Ну ладно бы там маска. Это дело не реагирует на события мыши. Если убрать добавление маски, то, конечно же, событие мышки мы получаем.
Будьте внимательнее.
Всего комментариев 32
Комментарии
14.09.2010 16:13 | |
14.09.2010 16:18 | |
да, момент адекватной "обрезки" объектов это решает. Но все кроме первого по-прежнему не интерактивны.
|
14.09.2010 16:48 | |
Забавненько. Спасибо, не думал что маска вне дисплай листа контейнера имеет глобальные координаты.
Но ещё забавней что маска перестаёт накладываться после второго cacheAsBitmap. Статью переправил обычным добавлением UPD, чтобы прослеживалась нить странности с отсутствием маски на втором cacheAsBitmap. |
|
Обновил(-а) Psycho Tiger 14.09.2010 в 16:52
|
14.09.2010 16:56 | |
Ну да, прав.
|
14.09.2010 17:13 | |
а что насчет интерактивности - почему для этого требуется "прослойка", как в примере -De- ?
|
14.09.2010 17:51 | |
Цитата:
Это давно ли народ пытается маску всунуть в тот объект, который мы пытаемся замаскировать?
|
14.09.2010 18:06 | |
Цитата:
А в чем проблема?
|
14.09.2010 18:33 | |
Если маска прямоугольная, то можно использовать за место нее scrollRect.
|
14.09.2010 19:01 | |
А зачем используется super в приведенном примере?
|
14.09.2010 19:04 | |
Потому что свойства и методы определенны в супер-классе.
Это мой стиль написания. |
14.09.2010 19:17 | |
Повезло. Не забудь раскомментировать строчку //super.cacheAsBitmap = true;
|
14.09.2010 21:06 | |
Хорошо, даже если так: почему работает первый контейнер?
|
|
Обновил(-а) Psycho Tiger 14.09.2010 в 21:22
|
14.09.2010 21:20 | |
Цитата:
Хорошо, даже если так: почему работает первый контейнер?
|
14.09.2010 21:23 | |
Я не совсем о том: события мыши доступны, когда маска находится в себе в случае с первым контейнером.
|
14.09.2010 21:41 | |
Баг .
|
14.09.2010 21:50 | |
Ага, понятно. Примерно это я и ожидал услышать.
|
15.09.2010 01:50 | |
а _maskShape.mouseEnabled = false не помогает?
|
15.09.2010 17:42 | |
Тут суть скорее в том, что при одинаковом коде первый раз себя ведёт не так, как второй и следующий. С мышкой разобрались как получать события.
|
15.09.2010 19:00 | |
Не только, как я уже говорил, для прямоугольной маски можно использовать scrollRect.
А маска сама по себе глючная. Собственный scale9Grid она также игнорирует. |
15.09.2010 19:46 | |
Да, мне тоже кажется что scrollRect удачней. Прямоугольная маска была выбрана исключительно ради примера.
|
Последние записи от Psycho Tiger
- Тонкости и трюки ActionScript`а, которые... бесполезны (10.05.2011)
- Vkontakte: как пользоваться wall.post, нужен ли теперь wall.savePost? (05.03.2011)
- А пятый контер-страйк хорош. (19.01.2011)
- Пацаны, гоу Вконтакте? (21.12.2010)
- Давайте начистоту (18.12.2010)