我正在制作一款游戏和 watch 风格的游戏(还记得大金刚吗?),所有敌人都按设定的时间间隔移动。
例如。 donkey kong 中的桶可能会精确地每 1 秒移动 1 步。准确性至关重要,因为玩家需要预测 Action 并计划他们的跳跃。
我正在使用 NSTimer 来运行一个函数,该函数基本上处理将所有敌人向前移动一步。这工作得很好,但后来我注意到,有时敌人会短暂地卡住,这会破坏游戏。阅读 NSTimer 文档,似乎这就是使用 NSTimers 时的方式。
我尝试过的:
我最初使用的是 scheduledTimerWithTimeInterval 但阅读了另一个建议使用 timerWithTimeInterval 的线程
[[NSRunLoop currentRunLoop] addTimer:autoMoveTimer forMode:NSRunLoopCommonModes];
但我还是注意到了卡住。
我尝试让它更频繁地运行,而不是每秒运行一次计时器,然后在函数内部检查耗时
NSTimeInterval elapsedTimeInterval;
elapsedTimeInterval = [gameTickerLastRan timeIntervalSinceNow];
if(elapsedTimeInterval<-gameSpeed){
NSLog(@"%f since ticker last ran",elapsedTimeInterval);
gameTickerLastRan=[NSDate date];
//do stuff in function
}
但我仍然注意到卡住,尽管输出的耗时对我来说似乎非常准确。
-1.006408 since ticker last ran
-1.006985 since ticker last ran
-1.007313 since ticker last ran
-1.007193 since ticker last ran
-1.006768 since ticker last ran
-1.007468 since ticker last ran
-1.007429 since ticker last ran
-1.006759 since ticker last ran
-1.007435 since ticker last ran
在那个函数的最后,在所有的敌人都被移动到一个台阶之后,我试着用
强制更新图形[self performSelector:@selector(sweetNothings) withObject:nil afterDelay:0.0];
但这并没有帮助。
我曾短暂地尝试过为计时器创建一个专用线程,但我的尝试并没有奏效,我觉得自己力不从心,无法对此进行太多试验。
Storyboard包含大约 100 个 UIImageView,它们的布局类似于逐帧动画。然后我使用它们的隐藏属性打开和关闭它们来创建动画。
任何人都可以建议我以精确的时间间隔运行此功能并绕过图形卡住的可靠方法吗?
编辑:我尝试了 CADisplayLink 但它看起来完全一样 - 即它仍然大约每 10 秒卡住一秒。这是我的
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameTicker:)];
[displayLink setFrameInterval:1];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
然后在游戏代码中我有
CFTimeInterval elapsedTime = displayLink.timestamp - lastDrawTime;
NSLog(@"elapsed %f", elapsedTime);
if(elapsedTime>=gameSpeed){
//do stuff
lastDrawTime = displayLink.timestamp;
}
编辑 2:好吧,我很尴尬地说我刚刚意识到它根本不是滞后的。我在向前循环数组时删除了元素,这导致了滞后的错觉。无论如何,感谢您将我指向 CADisplayLink - 看起来非常有用。我应该删除我的问题吗?
最佳答案
看看CADisplayLink (这是 Cocos2d 和其他游戏框架使用的)。
关于ios - iPad : need accurate alternative to NSTimer for making donkey kong style game,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14648045/