开始暂停节点的场景

时间:2017-01-09 16:35:18

标签: ios swift sprite-kit

我正在开发基于好夫妻SpriteKitSwift的iOS游戏。从iOS 7.1进行定位

我在游戏中实现短声的方法是使用SKAction.playSoundFileNamed方法运行操作,该方法是在专门为此目的添加的普通Layer-Node上执行的:

let SoundsLayerNode = SKNode()

self.addChild(SoundsLayerNode)

SoundsLayerNode.runAction(soundXXX)

通过暂停整个节点(SoundsLayerNode.paused = true)以及再次打开声音,取消暂停节点(SoundsLayerNode.paused = false

,很容易使FX声音静音

当我尝试在节点暂停时启动场景时出现问题。在func didMoveToView方法内部,我设置了SoundsLayerNode.paused = true,但在第一个Spritekit循环开始后,节点自动不显示

似乎SpriteKit迫使场景(自我)在didmovetoview完成后取消暂停,并且其所有后代都因此未被调整,从而触发声音层Node上的令人不快的副作用< / p>

你知道如何解决这个问题吗?

由于

2 个答案:

答案 0 :(得分:0)

解决方案是在节点上运行SKAction以在一定时间(例如0.1秒)后暂停它。

var pauseAction = SKAction.sequence([SKAction.wait(forDuration: 0.1), SKAction.pause()])
node.run(pauseAction)

你可以玩0.1,看看它能保持多低才能使它仍然有效。

如果这不起作用,你可以在GameScene中像这样解决这个问题:

var pauseToggle = true

override func didFinishUpdate() 
   {
        if(pauseToggle){
          SoundsLayerNode.paused = true
          pauseToggle = false
        }
   }

这是一种垃圾方式,但也应该有效。

答案 1 :(得分:0)

代码很长,但是我尝试了一个简单的测试GameScene,所以如果我运行应用程序一段时间,你可以看看控制台中显示的结果:

在didMoveToView中 testNode暂停:true 场景(自我)暂停:假

Loop_Update:0 testNode暂停:true 场景(自我)暂停:假

Loop_didEvaluateActions:0 testNode暂停:true 场景(自我)暂停:假

Loop_didFinishUpdate:0 testNode暂停:true 场景(自我)暂停:假

Loop_Update:1 testNode暂停:false 场景(自我)暂停:假

Loop_didEvaluateActions:1 testNode暂停:false 场景(自我)暂停:假

Loop_didFinishUpdate:1 testNode暂停:false 场景(自我)暂停:假

spritekit是否会在第一个渲染循环后强制场景取消暂停?

//
//  Test on paused Nodes
//

import SpriteKit


class GameScene: SKScene {

    let testNode = SKNode()
    var loopCounter:Int = 0


    override func didMoveToView(view: SKView) {

    self.addChild(testNode)
    testNode.paused = true

    print ("Inside didMoveToView")
    print("testNode is paused:",testNode.paused)
    print("scene(self) is paused:",scene!.paused)
    print("")

}

override func update(currentTime: CFTimeInterval) {

    print ("Loop_Update:",loopCounter)
    print("testNode is paused:",testNode.paused)
    print("scene(self) is paused:",scene!.paused)
    print("")

}

override func didEvaluateActions() {

    print ("Loop_didEvaluateActions:",loopCounter)
    print("testNode is paused:",testNode.paused)
    print("scene(self) is paused:",scene!.paused)
    print("")

}

override func didFinishUpdate() {

    // This is the last chance to make changes to the scene

    print ("Loop_didFinishUpdate:",loopCounter)
    print("testNode is paused:",testNode.paused)
    print("scene(self) is paused:",scene!.paused)
    print("")

    loopCounter=loopCounter+1

}

// After didFinishUpdate SKView renders the scene. 
// Does spritekit force the scene to unpause itself here?

}