2017-07-18 78 views
1

我正在製作基於Flash AS3的遊戲,並且正在構建自定義字體系統。它的工作原理如下:BitmapData類從庫(FontSource)中獲取PNG文件,在給定字符串中的每個字符之間循環,然後從函數(getOffset)中獲取圖像中的x,y,寬度和高度,然後它使用copyPixels繪製自定義字體文本。Flash AS3:使用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

1)更新現有的** BitmapData **很好。每次你都不要創建一個** FontSource **的新實例。 – Organis

+0

謝謝你的回覆。 – Ali

回答

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" 
    } 
+0

這似乎很棒。感謝你的回答! – Ali