繁体   English   中英

iphone-如何获取随机创建的UIImageViews以恒定速率向下移动屏幕?

[英]iphone-How to get randomly created UIImageViews to move down the screen at a constant rate?

背景:

我正在使用x-code版本3.1.4和iphone模拟器版本3.1。

现在,我正在构建一个游戏,其中汽车(由UIImageView描绘)使用两个按钮(左右)进行左右移动。 那部分工作正常。 但是,我试图在顶部随机生成UIImageViews,该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];

我对如何解决此问题感到非常困惑。 问题是我的移动功能不能一次处理这么多的移动事物,我的标签系统有故障,我的*测试有故障,或者我同时调用了许多功能,或者其他原因。 请帮助并给我解决这个烦人的问题的方法。

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定期调用moveMeteors

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM