的NSTimer - 整数相乘
好了,所以最近我做了一个项目,有一个像有点重定时器,的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.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,所以没有必要比它更频繁地调用它。
谢谢〜!它不仅帮助我学到了新东西。 :)对不起Im 13. – Xcoder 2014-10-06 02:54:38
不用担心,很乐意帮忙。顺便说一句,没有必要为你的年龄道歉(我们都是13次)。虽然我很欣赏你的友好评论,但事实上,在Stack Overflow上,不需要发表“谢谢”评论。加票和/或接受答案都是需要做的。我知道这看起来很粗鲁,但实际上,在Stack Overflow上发布简单的“谢谢”评论是_discouraged_(lol)。参见[当某人回答我的问题时应该怎么做](http://stackoverflow.com/help/someone-answers)。仅供参考。快乐的编码! – Rob 2014-10-06 03:03:21
该整数位于头文件中,这只是为了向您显示。 – Xcoder 2014-10-06 02:38:26
您显示的代码不会使图像变得越来越快。尝试在更长的时间间隔内,看看你是否仍然认为它正在加速。 – rdelmar 2014-10-06 02:48:07
了解如何使用调试器和断点。你可以安排多个定时器。 – 2014-10-06 02:49:12