iphone如何获得随机创建的UIImageViews以恒定的速率在屏幕上向下移动



背景:

我使用的是x代码版本3.1.4和iphone模拟器版本3.1。

现在我正在构建一个游戏,其中一辆车(由UIImageView描绘)使用两个按钮(左和右)左右移动。那部分很好用。然而,我正试图在顶部随机生成UIImageViews,它将以恒定的速率下降。我可以使用以下方法移动一个UIImageView:

-(void)moveMeteor{
    iv.center=CGPointMake(iv.center.x, iv.center.y + 1); 
    [self performSelector:@selector(moveMeteor) withObject:iv afterDelay:0.01]; 

}

其中iv是UIImageView,当我单击按钮时调用此函数。但是,我想创建随机生成的UIImageViews。所以,我用这个代码做了这个:

-(void)addViews: (NSTimer *) aTimer {
    UIImageView *iv = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Meteor.png"]];
    CGRect rect = CGRectMake(arc4random() % (350), arc4random() % (5), 35, 35);
    [iv setFrame:rect];
    [self.view addSubview:iv];

}

我通过点击一个开始按钮来调用这个功能:

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(addViews:)    userInfo:nil repeats:YES];

我想通过将addViews函数更改为:来使用标签

-(void)addViews: (NSTimer *) aTimer {
    UIImageView *iv = [[UIImageView alloc]initWithImage   [UIImage imageNamed:@"Meteor.png"]];
    CGRect rect = CGRectMake(arc4random() % (350), arc4random() % (5), 35, 35);
    [iv setFrame:rect];
    [self.view addSubview:iv];
    iv.tag=tagStart;  
    [self moveMeteor:tagStart]; 
    tagStart = tagStart+1;

}(tagStart的初始值为1);

并将移动功能更改为:

-(void)moveMeteor:(int)tag{
    UIImageView *test= (UIImageView *)[self.view viewWithTag:tagStart];
    test.center=CGPointMake(test.center.x, test.center.y + 1); 
    [self performSelector:@selector(moveMeteor) withObject:tagStart afterDelay:0.01];
    [test release];

我对如何解决这个问题感到困惑。问题是,我的move函数无法同时处理这么多移动的东西,我的标签系统有故障,我的*测试有故障,或者我同时调用了多个函数,或者其他什么。请帮我解决这个烦人的问题。

performSelector更好的选项是NSTimer,更好的选项也是CADisplayLink。性能的限制可能是使用UIImageView以及移动和重新绘制它们的相关开销,因此您可能需要更改为使用CALayer。但是,一次改变一件事。

对于流星,我会把它们都放在一个数组中,然后每次调用moveMeteor方法时,遍历数组并移动每个流星。您的标记方法可以工作,但效率较低(基本上您缺少一个循环来迭代标记)。


-(void)moveMeteors {
    for (UIImageView *test in self.meteors) {
        test.center = CGPointMake(test.center.x, test.center.y + 1); 
     }
}

如果你有一个名为meteors的阵列,你可以将新的流星添加到其中,并且计时器会周期性地调用moveMeteors

最新更新