создание выреза из заливки текстом в actionscript 3

#flash #actionscript

#flash #actionscript

Вопрос:

Я создаю сайт в actionscript 3. Я создал сетку с квадратами, в которых текст вырезан, чтобы можно было просмотреть фон. Прямо сейчас я делаю это, загружая сотни файлов в формате png через XML, но это приводит к значительному увеличению размера сайта.

Мне было интересно, можно ли вырезать текст, как вы обычно делаете во flash, разбивая текст на части, а затем преобразуя их в заливки, чтобы их можно было удалить из заливки. Сейчас я ищу способ сделать это в actionscript, чтобы сэкономить место и время. Я исследовал эту тему и не нашел никакой информации о том, как это сделать в actionscript.

Короче говоря:

Я хочу создать заливку, в которой текст вырезан в actionscript 3.

Ответ №1:

введите описание изображения здесьВот способ сделать это, используя динамическое текстовое поле в качестве маски. Хитрость заключается в инвертировании альфа-канала текстового поля. Этот класс создает цветные растровые данные с прозрачностью. Затем он создает текстовое поле. Затем он создает BitmapData для рисования текстового поля. Он рисует текст, затем изменяет альфа-канал текста, чтобы вырезать то, что было показано ранее. Мы применяем альфа-канал текстовых bitmapdata к цветному bitmapdat, так что цвет будет иметь текст, вырезанный из него. Наконец. мы добавляем растровое изображение, чтобы показать нашу работу. (таким образом, вы можете видеть, что из colro вырезан текст.) Если вы запустите это на своем компьютере, это будет выглядеть неровно, потому что он будет использовать шрифт по умолчанию без сглаживания. Но вы могли бы легко создать свое собственное текстовое поле с пользовательским шрифтом и нарисовать его вместо этого. Тогда он будет выглядеть гладким.

 package 
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TextEvent;
    import flash.geom.ColorTransform;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.text.TextField;

    /**
     * ...
     * @author Zachary Foley
     */
    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            // Make a red square bitmapdata that allows transparency.
            var color:BitmapData = new BitmapData(400, 400, true, 0xFF990000);
            var word:TextField = new TextField;
            word.text = "HELLO MASK";
            var textMask:BitmapData = new BitmapData(word.width, word.height, true, 0x00000000);
            textMask.draw(word);
            textMask = invert(textMask);

            var colorHolder:Bitmap = new Bitmap(color);
            addChild(colorHolder);
            color.copyChannel(textMask, textMask.rect, new Point(0, 0), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
        }

        private function invert(oldBmp:BitmapData):BitmapData {
            var source:BitmapData = oldBmp;
            var destination_bitmap:BitmapData = source.clone();
            var rectan:Rectangle = new Rectangle(0, 0, source.width, source.height);

            // Replace all transparent pixels with a solid color
            destination_bitmap.threshold(source, rectan, new Point(), "==", 0x00000000,0xFFFF0000);
            // Replace all the pixels greater than 0xf1f1f1 by transparent pixels
            destination_bitmap.threshold(source, rectan, new Point(), "==", 0xff656565,0x0000FF00);          
            return destination_bitmap;
        }

    }

}