Flash AS3:copyPixels的打字机效果

时间:2017-07-18 20:34:24

标签: actionscript-3 flash flash-cs3

我正在制作基于Flash AS3的游戏,而且我正在构建一个自定义字体系统。它的工作方式如下:BitmapData类从库中获取PNG文件(FontSource),在给定字符串中的每个字符之间循环,然后从函数(getOffset)获取图像内的x,y,width和height,然后它使用copyPixels绘制自定义字体文本。

以下是代码:

public function draw(str) {
    var png = new FontSource(480, 32);
    var offsets;
    var char;
    var rect;
    var x;
    var y;

    this.lock();
    for (var i = 0; i < str.length; i++) {
        char = str.substr(i, 1);
        offsets = getOffsets(char);

        rect = new Rectangle(offsets[0], offsets[1], offsets[2], offsets[3]);
        this.copyPixels(png, rect, new Point(x, y));
        x += offsets[2];
    }

    this.unlock();
}

现在,问题是:我正在根据ENTER_FRAME事件构建打字机效果类;每个新帧,一个新字符被添加到一个字符串。所以,我想问一下这些方法中的哪一种在性能方面会做得更好:

1)调用draw()每帧重绘整个BitmapData。

2)制作alpha蒙版并扩展每帧的宽度。

3)制作单独的对象并将它们添加到每个帧的舞台上。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

作为替代方案,您无需重绘整个字符串。你可以在最后画出更多的字符。我将按如下方式实现:您为位图文本字段提供一个应该每帧绘制一次的字符串。它会清除,然后在每个输入框架事件中,它只会在绘制的字符串长度上加1,并且只绘制一个单个字符。只需在您的课程中保存更多数据即可。例如:

public class BTF extends Sprite {
    private var str:String;
    private var source:FontSource; // set once!
    private var bd:BitmapData; // the one that'll get drawn
    private var lastIndex:int;
    private var lastX:int; // coords to draw next symbol to
    // assuming Y is always 0 - adjust per font
    public function BTF(source:FontSource,width:int,height:int) {
        this.source=source;
        bd=new BitmapData(width,height,0x00808080,true); // check if I didn't mix up parameters
        addChild(new Bitmap(bd)); // make it be drawn on your BTF
    }
    ... // rest of class skipped
    public function onEnterFrame(e:Event):void { 
        if (lastIndex>=str.length) return; // drawn all text already
        var c:char=str.charAt(lastIndex++); // get next char to draw
        var r:Rectangle=source.getOffsets(c); // you need to specify source for that - it's font that gives you bounds
        bd.copyPixels(source.fontBitmapData,r,new Point(lastX,0)); // draw that char
        lastX+=r.width; // move "cursor"
    }