iPhone Dev:动画PNG序列

时间:2010-04-29 03:53:30

标签: iphone objective-c xcode oop animation

为PNG序列设置动画的最佳或推荐技术是什么 继承了我所学到的知识:

手动执行
使用包含字符串的MutableArrays,您可以使用计时器为UIImageView设置动画,该计时器会增加索引号

UIImage - 动画方法
这是有效的,唯一的问题是找到一个图像是否完成了它的动画,你必须检查isAnimating BOOL,并且为此你需要一个计时器。

什么是最好的并推荐?

想要做Oldschool游戏精灵动画, 即:

空闲动画
攻击动画
步行动画
等...

如果有人有事,请告诉我。

@lessfame

4 个答案:

答案 0 :(得分:11)

动画箭头的示例

    UIImage* img1 = [UIImage imageNamed:@"fleche1.png"];
    UIImage* img2 = [UIImage imageNamed:@"fleche2.png"];

    NSArray *images = [NSArray arrayWithObjects:img1,img2, nil];
    UIImageView* imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, 160.0, 160.0)];
    [imageView setAnimationImages:images];
    [imageView setAnimationRepeatCount:100];
    [imageView setAnimationDuration:3.0];
    imageView.center = myView.center;


    [imageView startAnimating];
    [myView addSubview:imageView];
    [imageView release];

答案 1 :(得分:2)

最简单的方法是使用Core Animation图层进行精灵动画:

  • 制作精灵所有各种动作的“多单元”图像条(可以是PNG或JPG)。使每个'单元'都是固定的高度或宽度。

  • 将图像放入UIImageView中。

  • 获取视图的CALayer,并调整图层的contentsRect属性。这充当精灵的剪切矩形。要为精灵设置动画,您只需将contentsRect移动到图像条中的下一个单元格位置即可。

这样的事情会做到(假设你已经计算过newSpritePosition。

  [CATransaction begin];
  [CATransaction setDisableActions:YES];
  spriteLayer.contentsRect = newSpritePosition;
  [CATransaction commit];

(如果你不做第二行,那么你将得到一个默认的幻灯片动画,而不是'跳'到下一个状态。)

使用这种技术,你可以旋转精灵的所有帧 - 就像一本翻书。 CALAyer交易经过优化,因此您可以获得相当快的帧速率。您可以设置animationDidStop完成处理程序以移动到精灵的下一个状态或循环回到开始帧。

答案 2 :(得分:0)

这取决于你将如何使用精灵。如果你只需要一个简单的循环精灵,那么UIImage方法就很棒了。如果您想要更精细的控制,那么您将更乐意将图像加载到数组中并使用NSTimer循环来处理时序。我个人最常使用数组方法,因为它在将来会留下更多选项(比如检测动画何时完成)。还有一个建议是查看cocos2d项目。它的精灵比这些建议更强大。

答案 3 :(得分:0)

正如我在another answer中所说,我发现这是一个好方法:PNG Animation method by Moses DeJong

从他的话来说:

  

此示例实现了一个面向动画的视图控制器,它只需等待读取帧的PNG图像数据,直到需要它为止。这个类运行在大约半兆内存中,而第二代iPhone上的CPU利用率约为5-10%,而不是分配多兆字节。

我仍然不确定它是如何完成的。我相信它基本上使用UIImageView来缓存AVAudioPlayer。