我正在制作一个 2D 角色的动画,它可以行走、奔跑、跳跃、弯曲……
加载一个包含所有动画的大“spritesheet”并仅使用蒙版会更好,还是加载单独的文件(步行,跑步,...)会更好,因为您没有在如此大的图像上使用蒙版每一帧?
我没有在 Starling 之类的框架中使用 Stage3D 功能,因为我认为普通的 flash 显示 API 足够快,并且与相对较新的 GPU 框架相比,错误少得多。
我正在制作一个 2D 角色的动画,它可以行走、奔跑、跳跃、弯曲……
加载一个包含所有动画的大“spritesheet”并仅使用蒙版会更好,还是加载单独的文件(步行,跑步,...)会更好,因为您没有在如此大的图像上使用蒙版每一帧?
我没有在 Starling 之类的框架中使用 Stage3D 功能,因为我认为普通的 flash 显示 API 足够快,并且与相对较新的 GPU 框架相比,错误少得多。
根据我的经验,“显示列表越简单,性能越好”的规则通常适用。这意味着您应该使用最具体的显示对象来完成这项工作(当形状足够时不要使用 Sprite,或者在有意义的情况下偏爱位图而不是矢量)。
最极端的版本是在舞台上只有一个 Bitmap 显示对象,并且每次想要更新屏幕时都使用 copyPixels 将所有游戏对象绘制到其中。copyPixel 调用中的源是什么并不重要,它可以是充当精灵表的大型 BitmapData 或代表动画中单个帧的小型 BitmapData 对象。这种方法非常快,您可以轻松地同时在屏幕上显示数百个对象。但是使用 copyPixels 意味着您无法缩放或旋转游戏对象,因此对于这些情况,您将不得不退回到速度慢得多的 draw() 方法。当然,这种单一的位图方法不适用于需要将鼠标事件附加到游戏中特定对象的游戏,但适用于射击游戏或平台游戏。
为了回答您的问题,我认为通过使用单个 Bitmap 显示对象来表示播放器和所有动画帧的 BitmapData 对象集合,您将获得更好的性能。然后您可以将 Bitmap 的 bitmapData 属性更改为您要显示的帧。您仍然可以加载一个大型 spritesheet png,然后在游戏初始化期间将其拆分为一系列 BitmapData 对象。
仅对字符进行 Blitting(使用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 Blitting(第 1部分、第 2部分、第 3 部分)中学到的内容,松散地编写了一个自定义类
简而言之,您将使用两个 BitmapData 对象:
在我的项目中,我有一个带有正面和侧面动画的角色,对于侧面,我使用了一组动画并使用Matrix类相应地翻转(缩放和平移)侧面动画。我使用TexturePacker将图像序列导出为精灵表和帧数据以及 JSON 对象。现在有原生 JSON 支持,所以很方便。Texture Packer 不是免费的,但它确实物有所值(价格实惠,速度快,工作完美)。我还没有使用过 Flash CS6,但我想它也可以导入您的图像序列并导出具有新功能的 spritesheet。