2012-08-13 80 views
1

我正在制作一个胜利状态和失败状态的游戏。对于每个州,我想显示一个2-3秒的简短动画。第一个动画由60个PNG组成,速度为30 fps,第二个动画由80个PNG组成,也是30fps。我已经尝试了各种方法,并广泛搜索了一个解决方案,但我一直发现的前两个结果是使用UIImageView animationImages和Core Animation。使用UIImageView在模拟器中工作得非常好,但需要永远在设备上第一次运行。我认为这是因为图像需要加载到内存中。我正在使用“imageNamed”来填充animationImages数组,但我猜他们需要在第一次调用动画时渲染?我曾尝试在应用程序加载时预渲染它们,并且这看起来有诀窍,但预渲染所有这些图像需要近10秒,这不方便用户使用。我也会开放使用核心动画,但我对它的知识非常有限,所以详细的解释将不胜感激。谢谢!什么是动画iPhone上的图像序列的最佳方式?

当你说我需要在应用程序启动时加载所有内容时,你究竟是什么意思?现在,我初始化动画图像的两个数组时,应用程序加载,这样的:

// Create thinnestAnimation Array 
thinnestAnimation = [[NSMutableArray alloc] init]; 
for(int i = 1; i <= 60; i++) 
{ 
    UIImage *thinImage = [UIImage imageNamed:[NSString stringWithFormat:@"ThinnestJump_%d.png", i]]; 
    [thinnestAnimation addObject:thinImage]; 
} 

thinAnimationImageView.animationImages = (NSArray *)thinnestAnimation; 
thinAnimationImageView.animationDuration = 2.0; 
thinAnimationImageView.animationRepeatCount = 1; 

thinAnimationImageView是我的接口一个IBOutlet,我打电话[thinAnimationImageView startAnimating];当我想动画图像序列。这在第一次通话中严重滞后,但此后很好。无论如何阻止它第一次落后?

+0

对不起,动画的计算成本很高。苹果公司尽可能地写了UIImageView。用它。 – 2012-08-13 05:03:34

+0

如果您已经预渲染了您只想依次绘制的帧,Core Animation将无法真正帮助您;对于涉及移动或转换现有图像(或一组图像)和/或添加某些特殊效果的动画而言更是如此。现在,如果您想要的视觉类型符合该描述,则可以使用CA而不是图像序列。 – rickster 2012-08-13 05:26:55

+0

你也可以看看你可以做什么来优化你的图像。他们有阿尔法?他们真的需要它吗?屏幕的大面积是否会改变每一帧,或只是一小部分?视频是否可以更好地发挥作用? – rickster 2012-08-13 05:28:04

回答

1

UIImageView的内置动画功能是一个很好的做法。但是,在需要动画之前,您需要加载所有内容,例如在应用程序的启动时。如果您需要准备多个不同的动画,请在启动时加载多个UIImageView对象,并使用其startAnimating方法稍后调用您需要的那个。

还有其他方法可以进行动画制作,例如使用使用OpenGL进行动画制作的Cocos2D,性能更快。但是,您已经完全在不同的框架中构建您的应用程序,这可能是矫枉过正的,这取决于应用程序中发生了什么。

+0

至于在启动时加载UIImageView对象,我已初始化它们,但第一次运行的动画仍然滞后。相反,我在启动时在隐藏视图中执行了两个动画,所以当用户使用该应用程序时,它们很适合。唯一的缺点是需要6-8秒来加载应用程序。 – cricket4lyfe921 2012-08-19 04:12:29

+0

如果你有一个动画重量级的应用程序,你可能会考虑除UIKit以外的其他库,例如Cocos2D – johnbakers 2012-08-19 10:12:39

+0

它只是这两个短小的动画 – cricket4lyfe921 2012-08-20 00:03:06

1

正如安德鲁斯的UIImageView提到已经内置动画

的属性喜欢你有图像(imgarray)的阵列和图像视图

对于创建图像

NSMutableArray *imgarray = [NSMutableArray arrayWithCapacity:100] 
for (int i = 0; i < 100; ++i) { 
    NSString *name = [NSString stringWithFormat:@"img%d.png",i]; 
    UIImage *image = [UIImage imageNamed:name]; 
    [imgarray addObject:image]; 
} 

的阵列然后,对于动画

UIImageView *imgview; 

imgview.animationimages=imgarray; 

然后设置

imgview.animationDuration=2.0; //in seconds 

    [imgview startAnimating]; 

stopanimating停止动画 并且还有动画

希望这有助于重复计数属性.....

0

你可能想看看this article有关使用的CALayer用精灵表做动画。与Spritesheet相比,图层的开销更小。

0

晚的答案,但我只是处理了这个自己,发现以下有用的:

底部的第3个答案的,Animation using array of images in sequence

基本上,使用imageNamed:执行不是直接从包拉你的图片速度更慢。这就是我所做的多数民众赞成使我的加载速度更快:

NSMutableArray *imagesArray = [NSMutableArray new]; 

for (int i = 0; i < 150; i++) 
{ 
    [imagesArray addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"pngSlice-%d", i] 
                          ofType:@"png"]]]; 
} 

self.myImageView.animationImages = imagesArray; 
self.myImageView.animationRepeatCount = 1; 
self.myImageView.animationDuration = 2.5; 

[self.myImageView startAnimating]; 

imagesArray = nil; 

如果直接添加图像到捆绑,并有这工作他们都按顺序命名(即pngSlice-0,pngSlice-1,pngSlice-2 ,...)。我有150个图像,更改条件以匹配您的图像总数。

相关问题