问题:update(currentTime:)
中的SKScene
函数每个帧都带有currentTime
参数。我想知道如何在不使用update(currentTime:)
函数的情况下从相同的源update
使用时间。我只发现CFAbsoluteTimeGetCurrent()
不同。
原因:要计算timeSinceLastUpdate
,您需要一个名为timeOfLastUpdate
的实例变量。要实现timeOfLastUpdate
,您需要在第一次更新之前将其设置为任意值,这使得timeSinceLastUpdate
的第一次计算不正确。您可以使用简单的if语句来检测它或使用选项,但这是一个不需要的分支,如果我在timeOfLastUpdate
中设置didMoveToView(view:)
,则可以避免这种分支。这就是我想要做的。
答案 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必须是可选的才能使用