Ios 使用更新当前时间来跟踪游戏时间
我很好奇是否有人能想出一种方法来保持一个场景活跃了多长时间。当我需要触发某些事件时,这一点非常关键,比如说“游戏开始5分钟后生成飞船” 更新周期的问题在于,当前经过的时间不仅仅是活动的游戏时间,因此,如果您接到电话或切换应用程序,返回后您将获得X分钟的时间跳跃 目前,我使用一个Ios 使用更新当前时间来跟踪游戏时间,ios,swift,sprite-kit,gameplay-kit,Ios,Swift,Sprite Kit,Gameplay Kit,我很好奇是否有人能想出一种方法来保持一个场景活跃了多长时间。当我需要触发某些事件时,这一点非常关键,比如说“游戏开始5分钟后生成飞船” 更新周期的问题在于,当前经过的时间不仅仅是活动的游戏时间,因此,如果您接到电话或切换应用程序,返回后您将获得X分钟的时间跳跃 目前,我使用一个SKAction.customAction来记录我的时间,它是有效的,但我不能保证动作触发的顺序,因此我的事件可能会间隔1帧 这是我现在正在做的,请让我知道你做了什么来保持时间一致 //注意:NodeComponent是一
SKAction.customAction
来记录我的时间,它是有效的,但我不能保证动作触发的顺序,因此我的事件可能会间隔1帧
这是我现在正在做的,请让我知道你做了什么来保持时间一致
//注意:NodeComponent是一个协议扩展,用于快速访问GKSKNodeComponent的节点
import GameplayKit
class ElapsedTimeComponent:GKComponent,NodeComponent
{
var elapsedTime : TimeInterval = 0.0
override func didAddToEntity() {
node.scene?.addComponentToComponentSystem(self)
self.node.run(SKAction.customAction(withDuration:330000000000000000000000000000000000000){node,seconds in
elapsedTime = seconds
(node as! SKLabelNode).text = "\(seconds)"
})
}
override func update(deltaTime seconds: TimeInterval) {
}
}
因此,SKView有一个委托协议,你可以在任何地方附加。我已设置了最新的测试,如下所示:
public class GameScene: SKScene,SKViewDelegate {
var previousTime : TimeInterval = 0
var gameTime : TimeInterval = 0
public func view(_ view: SKView, shouldRenderAtTime time: TimeInterval) -> Bool
{
if !self.isPaused{
gameTime += time - previousTime
}
print("GameTime: \(gameTime)")
componentSystems.forEach({$0.update(deltaTime: gameTime)})
self.previousTime = time
return !self.isPaused
}
public override func didMove(to view: SKView) {
view.delegate = self
}
}
如果我正确理解了这一点,那么我需要注意的唯一一件事就是确保从游戏返回时,view.isPaused不会在同一时间解除我的场景的暂停(ughh为什么对我这样做苹果),以允许出现1个渲染循环
当然,这种方法的缺点是,由于渲染被禁用,我创建的任何暂停屏幕都必须位于该场景之外。您是否找到了一种不停止渲染的解决方案?@Mugs已经说过了,您需要在场景之外处理它。如果在场景中创建一个节点,可以将该节点视为场景,然后将该节点的“self”替换为该节点。啊,抱歉,错过了。谢谢你的帮助:)