问题:SKScene中的update(currentTime :)函数使用currentTime参数在每个帧中调用.我想知道如何从相同的源更新(currentTime :)使用而不使用更新功能.我只发现CFAbsoluteTimeGetCurrent()不同.
原因:要计算timeSinceLastUpdate,您需要一个名为timeOfLastUpdate的实例变量.要实现timeOfLastUpdate,您需要在第一次更新之前将其设置为任意值,这使得第一次计算timeSinceLastUpdate不正确.你可以有一个简单的if语句来检测这个或使用optionals但是这是一个不需要的分支,如果我只是在didMoveToView(view :)中设置timeOfLastUpdate就可以避免.这就是我想要做的.
解决方法
第一次,因为UpLastUpdate将始终与其他人不同.通常,一个存储来自先前更新调用的绝对时间,并从当前调用的时间中减去它以获得timeSinceLastUpdate.如果之前的时间不存在,因为你是第一次通过渲染循环 – 它被设置为零或无穷大或负值或者你初始化它的任何标记值,只需将你的timeSinceLastUpdate设置为一些标称值即可开始.像你的帧间隔(16.67毫秒,如果你要60 fps)这样的东西是有道理的 – 你不希望游戏代码依赖于那个时间间隔做一些疯狂的事情,因为你传递零或一些巨大的价值.
事实上,如果你的用户暂停并恢复游戏,那么将你的timeSinceLastUpdate标准化为理智的东西并不是一个坏主意.如果您有游戏实体(例如GameplayKit代理),其移动遵循某种位置= velocity * timeSinceLastUpdate模型,您希望它们在您从暂停中恢复时移动一帧的时间,而不是花费五分钟的暂停时间速度和跳跃到超空间.
如果将之前的时间初始化为零,减去并标准化为预期的帧间隔,则将使用相同的代码覆盖起始和未暂停的情况.