Ios 在节点暂停的情况下启动场景

Ios 在节点暂停的情况下启动场景,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我正在开发一款iOS游戏,它基于一对可爱的情侣SpriteKit和Swift。iOS 7.1的目标 我在游戏中实现短声音的方法是使用SKAction.playSoundFileNamed方法运行操作,该方法在专门为此目的添加的普通层节点上执行: let SoundsLayerNode = SKNode() self.addChild(SoundsLayerNode) SoundsLayerNode.runAction(soundXXX) 通过暂停整个节点(SoundsLayerNode.p

我正在开发一款iOS游戏,它基于一对可爱的情侣
SpriteKit
Swift
。iOS 7.1的目标

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

let SoundsLayerNode = SKNode()

self.addChild(SoundsLayerNode)

SoundsLayerNode.runAction(soundXXX)
通过暂停整个节点(
SoundsLayerNode.paused=true
)使FX声音静音非常容易,并且可以再次打开声音,取消暂停节点(
SoundsLayerNode.paused=false

当我尝试在节点暂停的情况下启动场景时,会出现问题。在func
didMoveToView
方法中,我设置了
SoundsLayerNode.paused=true
,但在第一个
Spritekit
循环启动后,节点会自动取消暂停

似乎,
SpriteKit
会在
didmovetoview
完成后强制场景(self)取消暂停,其所有子体都因此取消暂停,从而触发声音层节点上令人不快的副作用

你知道怎么分类吗


感谢

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

您可以使用0.1,看看您可以将其降低到多低,以使其仍然工作

如果这不起作用,您可以在游戏场景中进行如下处理:

var pauseToggle = true

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

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

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

您可以使用0.1,看看您可以将其降低到多低,以使其仍然工作

如果这不起作用,您可以在游戏场景中进行如下处理:

var pauseToggle = true

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

这是一种垃圾的做法,但也应该有效。

代码很长,但我尝试了一个简单的测试游戏场景,因此如果我运行应用程序一段时间,您可以查看控制台中显示的结果:

内部移动视图 testNode已暂停:true 场景(自身)已暂停:false

循环更新:0 testNode已暂停:true 场景(自身)已暂停:false

循环\u didEvaluateActions:0 testNode已暂停:true 场景(自身)已暂停:false

循环_didFinishUpdate:0 testNode已暂停:true 场景(自身)已暂停:false

循环更新:1 testNode已暂停:false 场景(自身)已暂停:false

循环操作:1 testNode已暂停:false 场景(自身)已暂停:false

循环完成更新:1 testNode已暂停:false 场景(自身)已暂停: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?

}

代码很长,但我尝试了一个简单的测试游戏场景,因此如果我运行应用程序一段时间,您可以查看控制台中显示的结果:

内部移动视图 testNode已暂停:true 场景(自身)已暂停:false

循环更新:0 testNode已暂停:true 场景(自身)已暂停:false

循环\u didEvaluateActions:0 testNode已暂停:true 场景(自身)已暂停:false

循环_didFinishUpdate:0 testNode已暂停:true 场景(自身)已暂停:false

循环更新:1 testNode已暂停:false 场景(自身)已暂停:false

循环操作:1 testNode已暂停:false 场景(自身)已暂停:false

循环完成更新:1 testNode已暂停:false 场景(自身)已暂停: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?

}

第二个选项仍然失败。我不知道为什么在第一个渲染循环中不能暂停节点。似乎有必要通过第二个环路。也许我可以尝试计数器之类的方法,并在计数器=2时设置SoundsLayerNode.paused=true。但是我不太喜欢这个选择much@Codediver当节点中的节点仍处于未暂停状态时失败?是的,我同意,即使使用布尔运算,这也是一种令人讨厌的方法。也许在其他地方,您正在不知道的情况下解除对节点的暂停。你的游戏场景代码足够短吗?马歇尔,你有机会读我的新帖子吗?我运行了一个简单的测试,并检查testNode在第一个循环结束时是否自动取消暂停。我有点困惑。第二个选择仍然失败。我不知道为什么在第一个渲染循环中不能暂停节点。似乎有必要通过第二个环路。也许我可以尝试计数器之类的方法,并在计数器=2时设置SoundsLayerNode.paused=true。但是我不太喜欢这个选择much@Codediver当节点中的节点仍处于未暂停状态时失败?是的,我同意,即使使用布尔运算,这也是一种令人讨厌的方法。也许在其他地方,您正在不知道的情况下解除对节点的暂停。你的游戏场景代码足够短吗?马歇尔,你有机会读我的新帖子吗?我运行了一个简单的测试,并检查testNode在第一个循环结束时是否自动取消暂停。我有点困惑。根据你在这里看到的,看起来你是正确的,节点在最后变得不可用。如果有一个方法是在didMoveToView之后调用的,那么我不知道它。最好的解决方案是解决它-我有一个想法,涉及一个SKAction,在大约0.5秒后被调用一次-您希望我将其添加到我的答案中吗?是的,它确实发生在第一个渲染循环结束时。我希望有人知道原因。请添加您的代码,听起来很有趣,我想给您的帮助打分。谢谢。你找到了解决问题的办法。您的代码给了我错误,但我根据您的解决方案重写了它:运行操作(SKAction.sequence([SKAction.waitForDuration(0.1),SKAction.runBlock{self.SoundsLayerNode.paused=true}])在第一个SKAction中等待0.1秒足够短,我假设每个渲染循环持续0.0166秒(以60fps的速度1/60秒),所以0.02s也应该足够短,0.1很好:)根据你拥有的