我正在制作一个拥有胜利状态和失败状态的游戏。对于每个州,我想显示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];
。这在第一次通话时严重滞后,但之后很好。反正有没有阻止它第一次滞后?
答案 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张图片,更改条件以匹配您的图片总数。