2014-10-06 31 views
0

好了,所以最近我做了一个项目,有一个像有点重定时器,的NSTimer - 整数相乘

int speed = 5; 
    NSTimer *gravitytimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(gravity) userInfo:nil repeats:YES]; 


-(void)gravity { 

image.center = CGPointMake(image.center.x, image.center.y - speed) 
} 

的问题是速度保持相乘或保持增加和图像会越来越快。我不知道问题是什么。如果这是一个糟糕的问题,我是一个新手,所以很抱歉。感谢所有花时间回答的人。

+0

该整数位于头文件中,这只是为了向您显示。 – Xcoder 2014-10-06 02:38:26

+0

您显示的代码不会使图像变得越来越快。尝试在更长的时间间隔内,看看你是否仍然认为它正在加速。 – rdelmar 2014-10-06 02:48:07

+0

了解如何使用调试器和断点。你可以安排多个定时器。 – 2014-10-06 02:49:12

回答

1

当您创建一个计时器,而这将尝试调用它每隔0.01秒,你实际上有没有保证,这将是在这个速度正是所谓的(即,如果时间过长,则可能跳过一个或两个;如果主线程被阻塞做其他事情(并且在应用程序首次启动时它非常忙碌),那么您可能会跳过很多)。您可以请求每秒更新image.center 100次,但您不能保证这实际上最终会被调用的频率。

如果您想要使用此技术进行动画制作,请按照将动画的速度与计时器选择器的频率隔离的方式实际调用。所以,你可以捕捉开始时间,例如

CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); 
CGPoint startPoint = image.center; 

,然后在定时程序,你会捕捉所经过的时间,乘以你的速度时间经过的时间,并从那里:

-(void)gravity { 
    CFAbsoluteTime elapsed = CFAbsoluteTimeGetCurrent() - self.start; 
    CGFloat speed = 100.0;  // e.g. 100 points per second 
    CGPoint center = startPoint; 
    center.y += (elapsed * speed); 
    image.center = center; 
} 

顺便说一句,我假设这只是定时器的练习。如果这是一个真正的动画,有很多更有效的方法来做这样的动画(例如基于块的animateWithDuration,UIKit动态,如果你真的想做一些基于定时器的东西,你通常会使用CADisplayLink而不是NSTimer) 。另外,顺便说一下,显示器的帧速率是60fps,所以没有必要比它更频繁地调用它。

+0

谢谢〜!它不仅帮助我学到了新东西。 :)对不起Im 13. – Xcoder 2014-10-06 02:54:38

+1

不用担心,很乐意帮忙。顺便说一句,没有必要为你的年龄道歉(我们都是13次)。虽然我很欣赏你的友好评论,但事实上,在Stack Overflow上,不需要发表“谢谢”评论。加票和/或接受答案都是需要做的。我知道这看起来很粗鲁,但实际上,在Stack Overflow上发布简单的“谢谢”评论是_discouraged_(lol)。参见[当某人回答我的问题时应该怎么做](http://stackoverflow.com/help/someone-answers)。仅供参考。快乐的编码! – Rob 2014-10-06 03:03:21