在动作脚本3中用填充文本创建剪切

时间:2011-10-18 17:00:33

标签: flash actionscript

我正在使用动作脚本3构建一个网站。我创建了一个带有Squares的网格,其中文本被剪切掉,因此可以显示背景。现在我通过在XML中加载数百个png来做到这一点,但这会导致网站大小的显着增加。

我想知道是否可以通过拆分文本然后将它们转换为填充来剪切文本,就像通常在flash中一样,这样就可以从填充中删除它们。我现在正在寻找一种在动作中执行此操作的方法,以节省空间和时间。 我已经研究了这个主题,但我没有找到关于如何在动作中执行此操作的任何信息。

简而言之:

我想创建一个填充文本在actionscript 3中删除。

1 个答案:

答案 0 :(得分:1)

enter image description here以下是使用动态文本字段作为掩码的方法。诀窍是反转文本字段的alpha通道。 此类创建一个具有透明度的颜色位图数据。 然后它创建一个文本字段。 然后它创建一个bitmapData来绘制文本字段。 它绘制文本,然后反转文本的alpha通道,以便它将删除之前显示的内容。 我们将文本bitmapdata的alpha通道应用于颜色bitmapdat,以便颜色将文本剪切掉。 最后。我们添加一个位图来展示我们的工作。 (所以你可以看到colro的文字被切掉了。) 如果你在你的机器上运行它会看起来有点麻烦,因为它会使用没有anit-aliasing的默认字体。但您可以使用自定义字体轻松创建自己的文本字段,然后绘制它。然后它看起来很光滑。

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;
        }

    }

}