Создание вырезки из заливки с текстом в ActionScript 3 - PullRequest
2 голосов
/ 18 октября 2011

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

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

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

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

1 Ответ

1 голос
/ 18 октября 2011

enter image description here Вот способ сделать это, используя динамическое текстовое поле в качестве маски.Хитрость заключается в том, чтобы инвертировать альфа-канал текстового поля.Этот класс создает цвет bitmapData с прозрачностью.Затем он создает текстовое поле.Затем он создает bitmapData для рисования текстового поля. Он рисует текст, а затем переворачивает альфа-канал текста, чтобы вырезать то, что было показано ранее.Мы применяем альфа-канал текстовых растровых данных к цветному растровому изображению, чтобы из цвета был вырезан текст.В заключение.мы добавляем растровое изображение, чтобы показать нашу работу.(так что вы можете видеть, что в 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;
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...