Одна из геймдев-контор предлагает выполнить тестовое задание на AS3. Задача вратце такова: есть BitmapData с альфа-каналом; нужно сделать так чтобы изображение работало как кнопка при наведении курсора на полностью непрозрачные пикселы, при этом все изображение должно плавно подсвечиваться по внешнему контуру. Поскольку гуру геймдева признали моё решение нубовским :), я пожалуй, выложу его здесь - вдруг кому не столь притязательному пригодится. Учтите, в природе существует гораздо более элегантное решение, но i have no idea.
Итак, в чем, собственно, проблема? На самом деле, проблем здесь две. Первая связана с тем, что растровое изображение, независимо от прозрачности и положенной программно поверх него маски, воспринимается плеером как прямоугольник и только.
Вторая касается фильтра Glow, который, если применить его к изображению, делает полупрозрачные пикселы внутри изображения сплошной светлой зоной. Также, если изображение подготовлено с включенным антиалиайзингом, внешняя его граница часто содержит полупрозрачные пикселы, которые фильтр Glow с включенным knockout успешно вычитает, оставляя некрасивый зазор между изображеним и зоной свечения.
Руководствуясь принципом «возложить на плеер все что можно на него возложить», а не заморачиваться какой-нибудь перманентной проверкой по onEnterFrame прозрачности пиксела под курсором, я заделал слоеный пирог, каждый слой под свою проблему. Описание слоев, какой за что отвечает, дано в комментах. В качестве tween-движка заюзан TweenMax, но это не существенно.
Посмотреть
Исходник
Итак, в чем, собственно, проблема? На самом деле, проблем здесь две. Первая связана с тем, что растровое изображение, независимо от прозрачности и положенной программно поверх него маски, воспринимается плеером как прямоугольник и только.
Вторая касается фильтра Glow, который, если применить его к изображению, делает полупрозрачные пикселы внутри изображения сплошной светлой зоной. Также, если изображение подготовлено с включенным антиалиайзингом, внешняя его граница часто содержит полупрозрачные пикселы, которые фильтр Glow с включенным knockout успешно вычитает, оставляя некрасивый зазор между изображеним и зоной свечения.
Руководствуясь принципом «возложить на плеер все что можно на него возложить», а не заморачиваться какой-нибудь перманентной проверкой по onEnterFrame прозрачности пиксела под курсором, я заделал слоеный пирог, каждый слой под свою проблему. Описание слоев, какой за что отвечает, дано в комментах. В качестве tween-движка заюзан TweenMax, но это не существенно.
Посмотреть
Исходник