我现在正在开发一个游戏,在这个游戏中,我想每秒创建 x 个从屏幕顶部开始的新 UIImage 对象。在它们被实例化后,我希望它们自动下落,直到它们到达屏幕底部,此时我不再使用它们。
它几乎就像雨滴——每秒会产生 X 个雨滴,它们每个都以不同的速度落下。
我对如何设计我的程序来做到这一点感到非常困惑。
任何帮助将不胜感激。谢谢。
它们是同一图像的所有副本,还是至少是一组有限图像中的一个的副本?对于这样一个类似游戏的图形密集型应用程序,我会认真考虑使用 OpenGL ES,尽管对于只熟悉 UIKit 的人来说学习曲线很陡峭。幸运的是,有第三方开源库(例如 Cocos2d)可以制作高效的 2d 图形,几乎和 UIKit 一样容易编写代码。
特别是关于你的问题,我没有看过@ctrahey提到的视频,但我能想到这些模式:
有一个(有限的)可重用对象“池”,其大小等于在任何给定时间可能出现在屏幕上的实例的最大数量。您肯定要设置此限制,因为图形性能不是无限的。每次一个对象掉出屏幕时,“重置”它的状态并重新使用它(再次从顶部)。UITableView 对表格单元格执行类似的操作。
按需创建实例,并在它们离开屏幕后销毁它们(release->dealloc)。
您必须平衡创建/销毁实例的运行时成本与重置对象的成本/不便。
希望能帮助到你
第 1 步:每秒运行一段代码
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(dispatchSomeRaindrops) userInfo:nil repeats:YES];
第 2 步:创建一些粒子,将它们发送到屏幕下方,并在它们到达底部时清理它们。
- (void)dispatchSomeRaindrops
{
for (int i = 0; i < 5; i++) {
UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"safari.png"]];
CGFloat halfHeight = view.frame.size.height / 2;
CGFloat x = arc4random() % (int)self.view.frame.size.width;
view.center = CGPointMake(x, -halfHeight);
[self.view addSubview:view];
NSTimeInterval duration = 10 + arc4random() % 10;
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
float endY = self.view.frame.size.height + halfHeight;
view.center = CGPointMake(x, endY);
} completion:^(BOOL finished) {
[view removeFromSuperview];
}];
}
}
查看来自 WWDC 2011的 Core Animation 视频,在接近尾声时有一些关于“复制器”的内容,听起来正是您所追求的。
仅供参考:找到了一个很好的资源来处理这个确切的场景。它确实需要您使用 cocos2d,但它以非常清晰易懂的方式对其进行了解释。
http://www.raywenderlich.com/352/how-to-make-a-simple-iphone-game-with-cocos2d-tutorial