背景:
我正在使用x-code版本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];
我对如何解决此问题感到非常困惑。问题是我的移动功能无法一次处理这么多移动的东西,我的标签系统有问题,我的*测试有问题,或者我同时调用了许多功能,或其他什么。请帮助并给我一个解决这个恼人问题的方法。
答案 0 :(得分:0)
比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
。