PDA

Просмотр полной версии : Криво работает программная маска, а маска-слой решила проблему. Почему?


mooncar
11.01.2010, 20:30
В чем принципиальная разница, когда плеер отрабатывает программную маску вида mc.setMask(mask_mc), и когда отрабатывается маска, полученная из маски-слоя при компиляции ролика?

Вопрос не праздный - работаю над проектом, и обнаружил, что в Опере, и только в ней, программная маска работает в одном месте криво. Есть анимированный мувик, содержащий большое количество других вложенных, на него была наложена программная маска (я делаю почти всегда так)., ограничивающая область видимости. Так вот везде все нормально, и в IDE, и в разных браузерах, а в Опере маска почему-то открывает взору только половину целевого мувика.
При этом все вместе - и маска, и ее цель находятся также в анимированном мувике, который выезжает на сцену.

Создал обычный слой-маску, куда положил нужный мувик, ограничивающий области видимости. Под это слой положил целевой мувик. Все стало прекрасно работать и в Опере.

Повторю вопрос - в чем принципиальная разница программно наложенной маски, возникающей при выполнении кода, и маски-слоя из среды разработки IDE, что приводит к таким косякам? Ведь маскирующий объект движется вместе с маскируемым в анимированном контейнере по сцене и тут и там. И почему только в Опере проявилось?

Проблема появилась при выполнении кода AS, поэтому вопрос задал здесь, хотя, видимо, это общая тема, относящаяся к работе кода AS и флеша.

Hauts
11.01.2010, 21:06
Сразу скажу — я не знаю.

Очень интересный вопрос. Вы не пробовали создавать тестовую флэшку, по аналогии с той, в которой у вас проявился такой эффект? Возможно в какой-то момент, упрощая или изменяя тестовую флэшку, вы найдете причину такого явления, и, вероятно, эта причина будет не очевидной.

Только что попробовал обратное действие, снять маску с клипа, у которого маска на таймлайне — не получается (если я ничего не напутал). А вот поменять местами маску и клип, которые на таймлайне были наоборот клипом и маской — работает. Скорее всего для плеера отрабатываются два разных механизма рендеринга для масок программной и на таймлайне. И ошибка в одном из них проявляется в опере.

Если найдете объяснение такому эффекту, напишите его, будет интересно узнать.

mooncar
11.01.2010, 22:47
Объяснение пока не нашел, делюсь наблюдениями.
Все случаи - с программным наложением маски.

Случай 1. Маска и маскируемый мувик находятся внутри одного и того же общего мувика-контейнера. Контейнер выезжает на сцену.
cont_mc.target_mc.setMask (cont_mc.mask_mc);
var moveTween:Tween = new Tween(cont_mc, '_x', mx.transitions.easing.Strong.easeOut, cont_mc._x, 400, 1.5, true);

Результат: IE и FF - ожидаемый, то есть маска нормально отрабатывает область видимости, эта область перемещается вместе с контейнером, оставаясь внутри него.
Opera - область видимости остается там же, где было начальное положение маски, и содержимое traget_mc внутри контейнера видно не полностью (или совсем не видно, если контейнер будет выезжать далеко из-за границы). Вот как это выглядит (http://www.us-pro.ru/mooncar/maskbag/player1_16.html). Посмотрите - в IE и FF все хорошо, а плеере любой Оперы этот косяк есть (сегодня поставил Оперу 10.10 - все равно).
Разбивал маскируемое содержимое в чистый Shape - все равно.

Случай 2. Маска находится прямо на сцене , а маскируемый мувик остается внутри контейнера. И маска и контейнер одновременно выезжают на сцену, находясь друг над другом.
cont_mc.target_mc.setMask (mask_mc);
var moveTween1:Tween = new Tween(cont_mc, '_x', mx.transitions.easing.Strong.easeOut, cont_mc._x, 400, 1.5, true);
var moveTween2:Tween = new Tween(mask_mc, '_x', mx.transitions.easing.Strong.easeOut, mask_mc._x, 400, 1.5, true);

Результат: теперь глюк исчез, во всех браузерах все работает корректно!

Организуем маску-слой - этого не наблюдается, все везде корректно.


Опера и FF - 9-й плеер, IE - 10-ый.

Hauts
11.01.2010, 23:06
Интересно... У меня опера 10.10, десятый флэш-плеер. С первого раза — да, неправильно работает. Одновил страницу — все нормально (но не всегда, иногда опять повторяется). Изменять размеры браузера — не помогает. Если в адресной строчке приписать что-нибудь через "?" — эффект повторяется.

У вас используются фильтры на target_mc? Или cacheAsBitmap или blendMode? Я с таким сталкивался недавно, но в моем случае масок не было, были только фильтры и blendMode.

Еще вопрос... у вас же там video object instance в target_mc, так? Я замечал, что при изменении размеров флэш-видео-плеера (как-то делал), вокруг video object instance не прорисовывается облась экрана, шириной в 10 - 15 пикселей. Может быть такой эффект с масками характерен для видео? Нужно будет попробовать.

mooncar
11.01.2010, 23:16
По основному вопросу - да, иногда отрабатывает нормально после перезагрузки. Возможно, когда берется из кэша, ролик загружается быстрее. Однако я проверял в браузере и локально - то же самое.
По поводу видеосодержимого и фильтров - это не принципиально, баг повторяется, даже когда в Shape разбил содержимое, оставил просто заливку и убрал видеообъект из контейнера. К тому же эта маска относится не к видеобъекту, а к другому мувику - внутреннему меню.
По второму вопросу - скорее всего нет, маска на видеообъект не влияет, я такого не замечал.