2014-02-23 130 views
0

我正在做一個遊戲,其中會有不同方面的人,我想知道如何加載一個單一的文件與動畫的每一幀,搜索了很多後,我在另一個Flash中創建了一個新的Ball類項目,自己做了這個代碼只是爲了測試AS3 Spritesheet動畫

public class Ball extends MovieClip { 

    private var spriteSheet:Bitmap; 

    public function Ball() 
    { 
     var loader:Loader = new Loader(); 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete); 
     loader.load(new URLRequest("Ball.png")); 
    } 

    private function onFrameLoop(e:Event) 
    { 
     switchFrame(); 
    } 

    private function switchFrame() 
    { 
     var frameBitmapData:BitmapData = new BitmapData(50, 50); 
     frameBitmapData.copyPixels(spriteSheet.bitmapData, new Rectangle(0, (50*(currentFrame-1)), 50, 50), new Point(0,0)); 
     var frame:Bitmap = new Bitmap(frameBitmapData); 
     this.addChild(frame); 
    } 

    private function onLoadComplete(e:Event) 
    { 
     var loaderInfo:LoaderInfo = e.target as LoaderInfo; 
     spriteSheet = loaderInfo.content as Bitmap; 

     this.addEventListener(Event.ENTER_FRAME, onFrameLoop); 
    } 
} 

} 

和它的工作,我只是說5個空白關鍵幀上球的MC符號。問題是,如果我打算爲移動設備製作這款遊戲​​,並且同時在舞臺上可能會有20人,這是否足夠快?還必須有另一種方式,因爲XML文件必須用於正確的事情嗎?那麼另一種方式是什麼?

PD:我知道每次執行switchFrame函數時都不會刪除幀位圖。

請我需要一個很好的答案,不要鏈接我的東西,我可能不理解

回答

2

你基本上是創建一個新的BitmapData對象每一幀 - 很髒。你不清理舊的框架 - DOUBLE REALLY BAD。不夠強調。您需要一個Bitmap對象和一個BitmapData對象(以及一個Rectangle對象)才能生成工作精靈。想象一下,你會得到1000個球,每個球都會在每幀中創建一個位圖 - 你的遊戲會很快崩潰。但是,如果他們每個球都有一個本地位圖,那麼每件事都應該足夠流暢。

當我製作精靈表時,還有另外一個警告:copyPixels()如果屏幕上沒有很多物體,則方法有效,如果跨越某個閾值,最好爲每個幀製作一個BitmapData對象的動畫,並且只需更改您的精靈擁有的每個幀的位圖鏈接。

public class Ball extends MovieClip { 

private static var spriteSheet:BitmapData; // first, why storing a Bitmap if you don't need it be moving? 
private static var spriteArray:Vector.<BitmapData>; // This will store split spritesheet 

private var bitmap:Bitmap; // this will be displaying proper frame 
private var currentFrame:int; // what frame are you displaying 
public static function initialize():void { 
    // loading static assets should better be made in a static function 
    if (!spriteSheet) { 
     var loader:Loader = new Loader(); 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete); 
     loader.load(new URLRequest("Ball.png")); 
    } 
} 
public function Ball() { 
    bitmap=new Bitmap(); // null bitmap is displayed 
    addChild(bitmap); 
    currentFrame=0; 
    addEventListener(Event.ENTER_FRAME, onFrameLoop,null,0,true); // weak listener 
    // to not hog memory if you'd create and remove balls 
} 
private function onFrameLoop(e:Event) 
{ 
    switchFrame(); 
} 

private function switchFrame() 
{ 
    if (!spriteArray) return; // oops, not initialized 
    currentFrame++; 
    if (currentFrame>=spriteArray.length) currentFrame=0; 
    bitmap.bitmapData=spriteArray[currentFrame]; // voila. Now this particular Ball 
    // will display the proper BitmapData out of sliced sprite sheet. 
} 

private static function onLoadComplete(e:Event) 
{ 
    var loaderInfo:LoaderInfo = e.target as LoaderInfo; 
    spriteSheet = (loaderInfo.content as Bitmap).bitmapData; // store the bitmapdata 
    // now cut the loaded sprite sheet apart 
    var i:int=Math.floor(spritesheet.width/50); // how many frames are in there 
    var r:Rectangle=new Rectangle(0,0,50,50); 
    var p:Point=new Point(); // why making N identical points? Just make one 
    spriteArray=new Vector.<BitmapData>(); 
    for (var j:int=0;j<i;j++) { 
     var bd:BitmapData=new BitmapData(50,50); 
     r.x=50*j; // update rectangle to cut next frame 
     bd.copyPixels(spriteSheet,r,p); // cut the frame in a new BitmapData 
     spriteArray.push(bd); // store the frame 
    } 
    // once this is complete, your sprite sheet is ready 
} 
} 

} 
+0

爲什麼在公共靜態函數中? – user3217163

+0

一個公共的靜態函數可以讓你做一些類的事情,而不需要創建那個類的實例。而且由於精靈圖片位圖實際上是針對課堂的,而不是針對任何一個球,所以在獲得它們球之前使其可用是很好的。並且該事件由代碼在調用靜態函數時生成的'loader'生成,在加載完位圖之後。 – Vesper