fdh*_*fdh 14 macos cocoa animation objective-c
我有一个由100个图像组成的动画.我希望能够通过一系列帧显示动画.例如,我宁愿使用第0帧到第32帧,而不是在0:00秒到0:32秒之间显示动画.我需要这样做,因为我需要对动画进行大量控制(即使是差异框架会产生错误的结果).我亲自绘制了每一帧,所以我知道每帧的图像.
无论如何,我可以使用Objective-C在Cocoa中做到这一点吗?我该怎么做?我只有100张图片,我不知道如何从这里开始.而且,与按时间指定相比,这是否会"滞后"?
我更喜欢详细的答案,因为我在网上找不到任何资源,而且我对此完全陌生.
请注意,我使用的是OS X,而不是iOS,因此请不要提供与iOS相关的答案.我在Snow Leopard上使用Xcode 3.2.6.
获得最多控制权的方法是将所有图像存储在一个数组中.如果您将图像命名为"frame.png"(即"frame1.png"),那么您可以快速加载所有图像,如下所示:
frames = [[NSMutableArray alloc] init]; // In header: NSMutableArray *frames;
for (int i = 1; i < 100; i++) // 100 can be replaced for any number of frames.
{
NSString *filename = [NSString stringWithFormat:@"frame%i.png", i];
[frames addObject:[NSImage imageNamed:filename]];
}
Run Code Online (Sandbox Code Playgroud)
这样做会创建一个数组,并使用NSImage以文件命名的s 填充它.的%i在字符串的当前值在取代i.
现在,您需要另一个变量来跟踪当前帧.有点像unsigned int currentFrame;.这可以在每个更新循环中递增,也可以设置为特定值,从而可以完全控制显示的帧.
然后,在渲染循环中,您可以渲染当前存储的帧,如下所示:
[(NSImage *)[frames objectAtIndex:currentFrame - 1] drawAtPoint:animPos fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0f];
Run Code Online (Sandbox Code Playgroud)
这里animPos是包含您想在绘制位置的NSPoint.在- 1有索引,所以你可以参考你的帧从1开始,而不是0.这个代码在框架拉图像currentFrame,并将其呈现在屏幕上.
由于您使用的是数组,因此请确保检查currentFrame永远不会等于大于最大帧数的值,例如:if (currentFrame > 100) currentFrame = 1;.这会导致动画循环,因为当它到达最后一帧时,currentFrame将被设置回数组的开始索引.
有关绘图的更多信息,您应该查看:Cocoa绘图指南和NSImage类参考.此外,如果您需要有关如何每增加一次时间更新帧的更多信息,请查看NSTimer类参考.