Spritesheet与面具或单独的图像文件?

时间:2012-09-04 15:47:52

标签: actionscript-3 flash-builder

我正在制作一个可以走路,跑步,跳跃,弯曲......的2D角色动画。

加载一个带有所有动画的大'spritesheet'并使用一个掩码,或者加载单独的文件(walk,run,...)会更好,因为你没有在这样的上使用掩码每一帧都有一张大图片?

我没有将Stage3D功能与Starling这样的框架一起使用,因为我认为普通的flash显示API足够快,并且比相对较新的GPU框架的bug少得多。

2 个答案:

答案 0 :(得分:1)

根据我的经验,规则“显示列表越简单,性能越好”通常适用。这意味着你应该使用最特殊的显示对象来完成这项工作(当一个Shape足够时不要使用Sprite,或者在有意义的矢量上使用Bitmaps)。

最极端的版本是在舞台上只有一个Bitmap显示对象,并且每次要更新屏幕时都使用copyPixels将所有游戏对象绘制到其中。 copyPixel调用中的源是什么并不重要,它可以是充当精灵表的大型BitmapData,也可以是表示动画中单个帧的小型BitmapData对象。这种方法非常快,您可以在屏幕上轻松同时拥有数百个对象。但是使用copyPixels意味着您无法缩放或旋转游戏对象,因此对于这些情况,您将不得不回退到更慢的draw()方法。当然,这种单一的Bitmap方法不适合需要将鼠标事件附加到游戏中的特定对象的游戏,但适用于射击游戏或平台游戏。

要回答您的问题,我认为通过使用单个位图显示对象来表示播放器以及所有动画帧的BitmapData对象集合,您将获得更好的性能。然后,您只需将Bitmap的bitmapData属性更改为要显示的帧即可。您仍然可以加载一个大的spritesheet png,然后在游戏初始化过程中将其拼接成一系列BitmapData对象。

答案 1 :(得分:1)

Blitting the character(使用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

我已经在一个较旧的项目中完成了这项工作,我正在从Lee Brimelow的教程系列Sprite Sheets and BlittingPart 1Part 2,{{3} })

blitting and spritesheets

简而言之,您将使用两个BitmapData对象:

  1. 一张大型精灵表
  2. 一个小图像,只显示将像素复制到
  3. 中的字符(最大字符边界框的大小)

    在我的项目中,我有一个带有正面和侧面动画的角色,对于侧面我使用了一组动画,并使用Part 3类相应地翻转(缩放和平移)侧面动画。我使用Matrix将图像序列导出为精灵表和帧数据以及JSON对象。现在有原生的JSON支持,所以这很方便。 Texture Packer不是免费的,但它确实物有所值(经济实惠,速度快,完美无瑕)。我还没有使用Flash CS6,但我想也可以导入你的图像序列并导出带有新功能的spritesheet。