在iPhone上制作一系列图像动画的最佳方法是什么?

时间:2012-08-13 04:55:53

标签: iphone image animation sequence

我正在制作一个拥有胜利状态和失败状态的游戏。对于每个州,我想显示2-3秒的短动画。第一个动画由60个PNG组成,速率为30 fps,第二个动画由80个PNG组成,也是30fps。我已经尝试了各种方法,并广泛搜索了一个解决方案,但我一直在寻找的前两个结果是使用UIImageView animationImages和Core Animation。使用UIImageView在模拟器中运行得非常好,但是第一次在设备上运行需要永远。我想这是因为图像需要加载到内存中。我正在使用“imageNamed”来填充animationImages数组,但我猜他们需要在第一次调用动画时进行渲染?我已经尝试在应用程序加载时预先渲染它们,这似乎可以解决问题,但预渲染所有这些图像需要将近10秒,这不是用户友好的。我也愿意使用Core Animation,但我对它的了解非常有限,因此我将非常感谢您的详细解释。谢谢!

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

// 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];。这在第一次通话时严重滞后,但之后很好。反正有没有阻止它第一次滞后?

4 个答案:

答案 0 :(得分:1)

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

还有其他一些动画制作方法,例如使用OpenGL进行动画制作的Cocos2D,性能要快得多。但是,您已经完全在不同的框架中构建了应用程序,这可能是一种过度杀伤,具体取决于应用程序中的其他内容。

答案 1 :(得分: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];

停止动画停止动画 并且还有一个重复计算动画的属性

希望这有助于......

答案 2 :(得分:0)

您可能需要查看this article有关使用CALayer使用精灵表执行动画的信息。与spritesheet一样,层的开销较小。

答案 3 :(得分:0)

迟到的答案,但我自己刚刚处理过,发现以下内容很有用:

第三个答案的底部,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张图片,更改条件以匹配您的图片总数。