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
Комментарии
![]() ![]() |
|
![]() ![]() |
|
да, момент адекватной "обрезки" объектов это решает. Но все кроме первого по-прежнему не интерактивны.
|
![]() ![]() |
|
Забавненько. Спасибо, не думал что маска вне дисплай листа контейнера имеет глобальные координаты.
Но ещё забавней что маска перестаёт накладываться после второго cacheAsBitmap. Статью переправил обычным добавлением UPD, чтобы прослеживалась нить странности с отсутствием маски на втором cacheAsBitmap. |
|
Обновил(-а) Psycho Tiger 14.09.2010 в 16:52
|
![]() ![]() |
|
Ну да, прав.
|
![]() ![]() |
|
а что насчет интерактивности - почему для этого требуется "прослойка", как в примере -De- ?
|
![]() ![]() |
|
Цитата:
Это давно ли народ пытается маску всунуть в тот объект, который мы пытаемся замаскировать?
|
![]() ![]() |
|
Цитата:
А в чем проблема?
|
![]() ![]() |
|
Если маска прямоугольная, то можно использовать за место нее scrollRect.
|
![]() ![]() |
|
А зачем используется super в приведенном примере?
|
![]() ![]() |
|
Потому что свойства и методы определенны в супер-классе.
Это мой стиль написания. |
![]() ![]() |
|
Повезло. Не забудь раскомментировать строчку //super.cacheAsBitmap = true;
|
![]() ![]() |
|
Хорошо, даже если так: почему работает первый контейнер?
|
|
Обновил(-а) Psycho Tiger 14.09.2010 в 21:22
|
![]() ![]() |
|
Цитата:
Хорошо, даже если так: почему работает первый контейнер?
|
![]() ![]() |
|
Я не совсем о том: события мыши доступны, когда маска находится в себе в случае с первым контейнером.
|
![]() ![]() |
|
Баг .
|
![]() ![]() |
|
Ага, понятно. Примерно это я и ожидал услышать.
|
![]() ![]() |
|
а _maskShape.mouseEnabled = false не помогает?
|
![]() ![]() |
|
Тут суть скорее в том, что при одинаковом коде первый раз себя ведёт не так, как второй и следующий. С мышкой разобрались как получать события.
|
![]() ![]() |
|
Не только, как я уже говорил, для прямоугольной маски можно использовать scrollRect.
А маска сама по себе глючная. Собственный scale9Grid она также игнорирует. |
![]() ![]() |
|
Да, мне тоже кажется что scrollRect удачней. Прямоугольная маска была выбрана исключительно ради примера.
|
Последние записи от Psycho Tiger
- Тонкости и трюки ActionScript`а, которые... бесполезны (10.05.2011)
- Vkontakte: как пользоваться wall.post, нужен ли теперь wall.savePost? (05.03.2011)
- А пятый контер-страйк хорош. (19.01.2011)
- Пацаны, гоу Вконтакте? (21.12.2010)
- Давайте начистоту (18.12.2010)