2

我现在正在开发一个游戏,在这个游戏中,我想每秒创建 x 个从屏幕顶部开始的新 UIImage 对象。在它们被实例化后,我希望它们自动下落,直到它们到达屏幕底部,此时我不再使用它们。

它几乎就像雨滴——每秒会产生 X 个雨滴,它们每个都以不同的速度落下。

我对如何设计我的程序来做到这一点感到非常困惑。

任何帮助将不胜感激。谢谢。

4

4 回答 4

2

它们是同一图像的所有副本,还是至少是一组有限图像中的一个的副本?对于这样一个类似游戏的图形密集型应用程序,我会认真考虑使用 OpenGL ES,尽管对于只熟悉 UIKit 的人来说学习曲线很陡峭。幸运的是,有第三方开源库(例如 Cocos2d)可以制作高效的 2d 图形,几乎和 UIKit 一样容易编写代码。

特别是关于你的问题,我没有看过@ctrahey提到的视频,但我能想到这些模式:

  1. 有一个(有限的)可重用对象“池”,其大小等于在任何给定时间可能出现在屏幕上的实例的最大数量。您肯定设置此限制,因为图形性能不是无限的。每次一个对象掉出屏幕时,“重置”它的状态并重新使用它(再次从顶部)。UITableView 对表格单元格执行类似的操作。

  2. 按需创建实例,并在它们离开屏幕后销毁它们(release->dealloc)。

您必须平衡创建/销毁实例的运行时成本与重置对象的成本/不便。

希望能帮助到你

于 2012-08-31T06:30:26.157 回答
2

第 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];
        }];
    }
}
于 2012-08-31T07:36:56.057 回答
1

查看来自 WWDC 2011的 Core Animation 视频,在接近尾声时有一些关于“复制器”的内容,听起来正是您所追求的。

于 2012-08-31T06:21:57.610 回答
0

仅供参考:找到了一个很好的资源来处理这个确切的场景。它确实需要您使用 cocos2d,但它以非常清晰易懂的方式对其进行了解释。

http://www.raywenderlich.com/352/how-to-make-a-simple-iphone-game-with-cocos2d-tutorial

于 2012-08-31T07:30:18.773 回答