如何获得更新(currentTime :)函数使用的相同时间? (在被召唤之前)

时间:2016-07-06 20:02:47

标签: ios objective-c swift sprite-kit scenekit

问题:update(currentTime:)中的SKScene函数每个帧都带有currentTime参数。我想知道如何在不使用update(currentTime:)函数的情况下从相同的源update使用时间。我只发现CFAbsoluteTimeGetCurrent()不同。

原因:要计算timeSinceLastUpdate,您需要一个名为timeOfLastUpdate的实例变量。要实现timeOfLastUpdate,您需要在第一次更新之前将其设置为任意值,这使得timeSinceLastUpdate的第一次计算不正确。您可以使用简单的if语句来检测它或使用选项,但这是一个不需要的分支,如果我在timeOfLastUpdate中设置didMoveToView(view:),则可以避免这种分支。这就是我想要做的。

2 个答案:

答案 0 :(得分:4)

第一个timeSinceLastUpdate将始终与其他update不同。通常,一个存储前一个timeSinceLastUpdate呼叫的绝对时间,并从当前呼叫的时间中减去它以获得timeSinceLastUpdate。如果之前的时间不存在,因为你是第一次通过渲染循环 - 它被设置为零或无穷大或负面的东西或你初始化它的任何哨兵值,只需将你的timeSinceLastUpdate设置为一些名义上的入门的价值。像你的帧间隔(16.67毫秒,如果你要60 fps)这样的东西是有道理的 - 你不希望游戏代码依赖于那个时间间隔做一些疯狂的事情,因为你传递零或一些巨大的价值。

事实上,如果你的用户暂停并重新开始游戏,那么将position += velocity * timeSinceLastUpdate标准化为理想化的逻辑并不是一个坏主意。如果您的游戏实体(例如GameplayKit代理)的移动遵循某种 if ( mysqli_num_rows ( $result ) > 0 ) { header('Location: exist.php'); die(); } 模型,那么当您从暂停中恢复时,您希望它们移动一帧的时间,而不是花费五分钟的暂停时间速度和跳跃到超空间。

如果将之前的时间初始化为零,减去并标准化为预期的帧间隔,则将使用相同的代码覆盖起始和未暂停的情况。

答案 1 :(得分:3)

您可以随时使用合并:

let deltaTime = currentTime - (previousTime ?? currentTime).  

在第一个循环中,deltaTime为0(应该是这个)之后,它是变化

当然,previousTime必须是可选的才能使用