我正在制作基于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)制作单独的对象并将它们添加到每个帧的舞台上。
感谢您的时间。
答案 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"
}