【问题标题】:Using updates current time to keep track of game time使用更新当前时间来跟踪游戏时间
【发布时间】:2019-08-20 13:03:23
【问题描述】:

我很好奇是否有人能够找到一种方法来保持场景活动的时间。当我需要触发某些事件时,这很重要,比如说“游戏开始 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) {
    }
}

【问题讨论】:

    标签: ios swift sprite-kit gameplay-kit


    【解决方案1】:

    事实证明,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     
        }
    }
    

    https://developer.apple.com/documentation/spritekit/skviewdelegate

    如果我理解正确,那么我唯一需要注意的就是确保从游戏返回时,view.isPaused 不会在同一时间取消暂停我的场景(呃,为什么你对我这样做 Apple) 以允许发生 1 个渲染循环。

    当然,这种方法的缺点是我创建的任何暂停屏幕都必须在这个场景之外,因为渲染被禁用。

    【讨论】:

    • 有没有机会找到一个不会停止渲染的解决方案?
    • @Mugs 已经说过了,你需要在场景之外处理它。如果您在场景中创建一个节点,您可以将该节点视为您的场景,然后将“self”替换为该节点。
    • 抱歉,错过了。感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多