我有一堆对象(SKNode
)从屏幕顶部开始通过SKAction.move(to:duration:)
和node.run(moveAction)
“下降”到底部。此外,我在屏幕中央有一个节点,它有自己的物理主体,可以通过触摸输入左右拖动。我可以很好地检测到碰撞,但我想知道在中心节点与任何对象接触时是否存在“暂停”所有对象的范例。另外,我希望能够移动中心节点而其他对象被“暂停”,这样我就可以将它移开,然后让对象恢复运动。我想我可能会遍历所有现有对象并设置他们的isPaused
属性,但我不确定应用程序如何知道中心节点何时不再“碰撞”,以便我可以切换回属性。
答案 0 :(得分:2)
要暂停一些事情,您必须在didBegin()
中检测联系人,在某些数组中添加应暂停的节点,最后暂停节点。例如,实际暂停可以在didSimulatePhysics()
中完成。暂停所有可以使用的节点
self.enumerateChildNodesWithName("aName") {
node, stop in
// do something with node or stop
}
或使用节点的children属性并循环遍历它(例如,循环遍历应该暂停的节点的容器)。
您也可以暂停某些操作:
if let action = square.actionForKey("aKey") {
action.speed = 0
}
并使用action.speed = 1
取消暂停,或者使用action.speed = 0.5
为了减慢物理模拟,有一个名为physicsWorld.speed
的属性(确定模拟运行的速率)。
答案 1 :(得分:1)
哦,男孩,事情肯定会变得复杂。旋风所说的每一件事都是正确的,但是遍历场景中的每个节点都会变得很麻烦。
相反,我建议为SKNode创建一个特殊的子类。由于苹果框架引起的错误
,现在需要这个特殊类class UserPausableNode : SKNode
{
public var userPaused = false
{
didSet
{
super.isPaused = userPaused
}
}
override var isPaused : Bool
{
get
{
return userPaused
}
set
{
//Yes, do nothing here
}
}
}
我们之所以需要这样做是因为无论何时调用isPaused,它都会迭代到所有子节点并设置子isPaused
属性。
当场景暂停和取消暂停时,这会成为一个问题,因为它会改变孩子的暂停状态,这是我们不想做的。
此类可防止isPaused变量发生变化。
现在这个类存在,我们想要做的是将它添加到场景中,并将所有移动节点添加到这个新节点。
由于所有节点都在这个新节点上,我们需要做的就是将userPaused
设置为true,这将停止所有节点。
现在确保您正在移动的节点不是此分支的一部分,它应该在外面以便您可以移动它。
实施例
class GameScene : SKScene
{
var userBranch = UserPausableNode()
func didMove(to view:SKView)
{
self.addChild(userBranch)
//generetedChildren are nodes that you create that you plan on pausing as a group
for generatedChild in generatedChildren
{
userBranch.addChild(node)
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//this will pause and unpause based on opposite of previous state
userBranch.userPaused = !userBranch.userPaused
}
}