2012-09-04 27 views
0

我正在製作可漫步,跑步,跳躍,彎曲等2D角色的動畫...Spritesheet與面具或單獨的圖像文件?

將所有動畫加載到一個大的「spritesheet」,並使用一個蒙版,或者會加載單獨的文件(走路,跑步......)會更好,因爲您沒有在每一幀都使用如此大的圖像上的掩碼?

我沒有像Starling這樣的框架使用Stage3D功能,因爲我認爲正常的Flash顯示API足夠快並且比相對較新的GPU框架具有更少的錯誤。

+0

您是否嘗試過使用不同的圖層/框架的新符號?每當我需要簡單的角色動畫時,我將使用符號的頂層來存儲第1幀中的左側精靈,第2幀中正確面對的精靈,這些精靈將會是另外幾幀顯示行走/跑步動畫等。基本符號在符號內(有點像多維數組)。 –

+0

我沒有在Flash Professional中使用時間軸,我從png文件加載'幀'。 –

+1

我認爲使用單個精靈表(一個位圖)和一個面具(矩形數組)會比使用單獨的圖片更好,如果你的動畫會有可變尺寸的矩形(寬度和高度),並且如果你的角色是隻有一個,這會比維護一組不同的位圖和做技巧帶來更少的操作開銷。不過,如果你願意的話,你總是可以將精靈表分成幾個位圖。 – Vesper

回答

1

對字符(使用lock(),copyPixels(),unlock())進行擦洗效果很好。

private function updatePixels():void{ 
    //update sprite sheet copy position based on the frame placements ons prite sheet 
    position.x = spriteSourceData[currentFrame].x + offset.x; 
    position.y = spriteSourceData[currentFrame].y + offset.y; 
    //draw into the bitmap displayed 
    displayData.lock(); 
    displayData.fillRect(displayData.rect, 0x00FFFFFF);//clear 
    displayData.copyPixels(sourceData, spriteData[currentFrame], position);//copy new frame pixels 
    displayData.unlock(); 
} 
//a bit about vars: 
position:Point 
spriteSourceData:Vector.<Rectangle> - from parsed Texture Packer data 
offset:Point - front view and side view animations weren't always centred, so an offset was needed 
displayData:BitmapData - pluging into a Bitmap object displayed 
sourceData:BitmapData - the large sprite sheet 
currentFrame:int - image index on the sprite sheet 

我這樣做對舊的項目編寫自定義類鬆散以下是我已經從李布賴姆洛的教程系列Sprite Sheets and BlittingPart 1Part 2Part 3

blitting and spritesheets

瞭解到在總之,你會使用兩個BitmapData對象:

  1. 一個大的精靈表
  2. 小圖像只顯示字符(最大字符邊框的大小)像素複製到

在我的項目,我與正面和側面的動畫角色,爲雙方我使用一組動畫,並使用Matrix類來相應地翻轉(縮放和翻譯)側面動畫。我已經使用TexturePacker將圖像序列導出爲精靈表單和幀數據以及JSON對象。現在有原生的JSON支持,所以很方便。紋理包裝工並不是免費的,但它真的很值錢(價格合理,速度快,完美地完成了這項工作)。我還沒有使用Flash CS6,但我想它也可以導入您的圖像序列,並導出一個spritesheet與新功能。

1

根據我的經驗,規則「越簡單顯示列表性能越好」一般適用。這意味着你應該使用最具體的顯示對象來完成這項工作(當Shape滿足要求時不要使用Sprite,或者在有意義的位置使用偏向於Bitmap的位圖)。

這個最極端的版本是在舞臺上只有一個Bitmap顯示對象,並且每次您想要更新屏幕時都使用copyPixels將所有遊戲對象繪製到該對象中。 copyPixel調用的源代碼無關緊要,它可以是用作精靈表的大型BitmapData,也可以是代表動畫中單個幀的小型BitmapData對象。這種方法非常快速,您可以在屏幕上同時容納數百個對象。但是使用copyPixels意味着你不能縮放或旋轉一個遊戲對象,所以對於這些情況,你必須回退到更慢的draw()方法。當然,這種單一的位圖方法不適用於需要將鼠標事件附加到遊戲中特定對象的遊戲,但適用於shoot'em ups或平臺遊戲。

要回答你的問題,我想你會通過使用單個Bitmap顯示對象來表示播放器和所有動畫幀的BitmapData對象集合,以獲得更好的性能。然後,您可以將位圖的bitmapData屬性更改爲您要顯示的幀。您仍然可以加載大型spritesheet png,然後在遊戲初始化過程中將其分解爲一系列BitmapData對象。