我正在使用动作脚本3构建一个网站。我创建了一个带有Squares的网格,其中文本被剪切掉,因此可以显示背景。现在我通过在XML中加载数百个png来做到这一点,但这会导致网站大小的显着增加。
我想知道是否可以通过拆分文本然后将它们转换为填充来剪切文本,就像通常在flash中一样,这样就可以从填充中删除它们。我现在正在寻找一种在动作中执行此操作的方法,以节省空间和时间。 我已经研究了这个主题,但我没有找到关于如何在动作中执行此操作的任何信息。
简而言之:
我想创建一个填充文本在actionscript 3中删除。
答案 0 :(得分:1)
以下是使用动态文本字段作为掩码的方法。诀窍是反转文本字段的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;
}
}
}