我正在制作一个可以走路,跑步,跳跃,弯曲......的2D角色动画。
加载一个带有所有动画的大'spritesheet'并使用一个掩码,或者加载单独的文件(walk,run,...)会更好,因为你没有在这样的上使用掩码每一帧都有一张大图片?
我没有将Stage3D功能与Starling这样的框架一起使用,因为我认为普通的flash显示API足够快,并且比相对较新的GPU框架的bug少得多。
答案 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 Blitting(Part 1,Part 2,{{3} })
简而言之,您将使用两个BitmapData对象: