我正在开发基于好夫妻SpriteKit
和Swift
的iOS游戏。从iOS 7.1进行定位
我在游戏中实现短声的方法是使用SKAction.playSoundFileNamed
方法运行操作,该方法是在专门为此目的添加的普通Layer-Node上执行的:
let SoundsLayerNode = SKNode()
self.addChild(SoundsLayerNode)
SoundsLayerNode.runAction(soundXXX)
通过暂停整个节点(SoundsLayerNode.paused = true
)以及再次打开声音,取消暂停节点(SoundsLayerNode.paused = false
)
当我尝试在节点暂停时启动场景时出现问题。在func didMoveToView
方法内部,我设置了SoundsLayerNode.paused = true
,但在第一个Spritekit
循环开始后,节点自动不显示
似乎SpriteKit
迫使场景(自我)在didmovetoview
完成后取消暂停,并且其所有后代都因此未被调整,从而触发声音层Node上的令人不快的副作用< / p>
你知道如何解决这个问题吗?
由于
答案 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?
}