Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用更新当前时间来跟踪游戏时间_Ios_Swift_Sprite Kit_Gameplay Kit - Fatal编程技术网

Ios 使用更新当前时间来跟踪游戏时间

Ios 使用更新当前时间来跟踪游戏时间,ios,swift,sprite-kit,gameplay-kit,Ios,Swift,Sprite Kit,Gameplay Kit,我很好奇是否有人能想出一种方法来保持一个场景活跃了多长时间。当我需要触发某些事件时,这一点非常关键,比如说“游戏开始5分钟后生成飞船” 更新周期的问题在于,当前经过的时间不仅仅是活动的游戏时间,因此,如果您接到电话或切换应用程序,返回后您将获得X分钟的时间跳跃 目前,我使用一个SKAction.customAction来记录我的时间,它是有效的,但我不能保证动作触发的顺序,因此我的事件可能会间隔1帧 这是我现在正在做的,请让我知道你做了什么来保持时间一致 //注意:NodeComponent是一

我很好奇是否有人能想出一种方法来保持一个场景活跃了多长时间。当我需要触发某些事件时,这一点非常关键,比如说“游戏开始5分钟后生成飞船”

更新周期的问题在于,当前经过的时间不仅仅是活动的游戏时间,因此,如果您接到电话或切换应用程序,返回后您将获得X分钟的时间跳跃

目前,我使用一个
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”替换为该节点。啊,抱歉,错过了。谢谢你的帮助:)