在我的应用程序中,我已经实现了NSTimer来计算时间。我有滑动检测和何时 用户在屏幕上滑动,动画连续运行。我的问题是当我滑动时 在屏幕上(左/右连续)NSTimer放慢速度。 任何人都可以告诉我如何解决这个问题?
//代码
gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/100
target:self
selector:@selector(updateGameTimer)
userInfo:nil
repeats:YES];
-(void)updateGameTimer
{
counter++;
tick++;
if(tick==100){
tick = 0;
seconds += 1;
}
if(counter==100){
counter = 0;
}
timerLabel.text = [NSString stringWithFormat:@"%i.%02d",seconds,counter];
}
//swipe detection
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
//CGPoint curPt = [touch locationInView:self.view];
CGPoint newLocation = [touch locationInView:self.view];
CGPoint oldLocation = [touch previousLocationInView:self.view];
gameView.multipleTouchEnabled = true;
if(newLocation.x-oldLocation.x>0){
swipe_direction = 1;
//NSLog(@"left");
}
else{
swipe_direction = 2;
//NSLog(@"right");
}
if(swipe_direction==1){
//animate images
//play sound effect
}
else if(swipe_direction==2){
//animate images
//play sound effect
}
}
答案 0 :(得分:5)
来自NSTimer文档......
计时器不是实时机制;它只在其中一个发射时发射 已添加计时器的运行循环模式正在运行且能够运行 检查计时器的开火时间是否已经过去。因为各种各样 输入源一个典型的运行循环管理,有效的分辨率 计时器的时间间隔限制在50-100的量级 毫秒。如果在长时间标注期间发生计时器的发射时间或 当运行循环处于不监视计时器的模式时, 在下次运行循环检查计时器之前,计时器不会触发。 因此,计时器可能发射的实际时间可能是 在计划的射击时间之后很长一段时间。
你的计时器分辨率是10毫秒,所以如果运行循环没有足够快地完成(10毫秒以下),你会开始注意到实时和你的计数器之间的滞后。
如果您正在实施游戏,开发人员通常会尝试取消与CPU或时钟速度的关联。
看看这个answer
或者看看像cocos2d这样的框架如何实现自己的调度程序。
答案 1 :(得分:0)
很难从描述中看出“减速”意味着什么。是不是由于处理负载而没有完全跟上真正的时钟,还是实际上停止是短暂的?
在某些情况下,问题实际上是在某些UI进程发生时,如触摸事件处理或滚动,您处于不同的运行循环模式。除非您明确告诉iOS这样做,否则实际上不会在此模式下触发默认NSTimer
实例。
可能就像将计时器添加到正确的运行循环模式的计时器列表一样简单:
gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/100
target:self
selector:@selector(updateGameTimer)
serInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer: gameTimer forMode: NSRunLoopCommonModes];
这是一个简单的一行更改,看看这是否可以解决您的问题。比重新设计整个滴答机制容易得多。试一试!