为什么 SKNode 在 SpriteKit 游戏中对触摸没有反应?
Why SKNode isn't reacting to touch in SpriteKit game?
为了在 SpriteKit 游戏中暂停,我制作了一个暂停按钮。当我想制作另一个暂停场景并响应触摸正在过渡到一个场景时,它就像一个魅力。然后我的功能看起来 like this (P.S。pause
= 暂停按钮) 但它还有其他问题,我决定在我的主场景中暂停:playscene
所以我添加了一个附加到暂停背景的 pauseBackground
和 resumeButton
并将其隐藏(声明为 resumeButton.hidden = true
)
现在我的函数看起来像这样:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
if self.onGround {
self.speedY = -20.0
self.onGround = false
}
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
if self.nodeAtPoint(location) == self.pause {
self.scene?.view?.paused = true
self.pauseBackground.hidden = false
self.resumeButton.hidden = false
if self.nodeAtPoint(location) == self.resumeButton {
self.pauseBackground.hidden = true
self.resumeButton.hidden = true
self.scene?.view?.paused = false
}
}
}
}
这很有趣,因为它适用于场景转换,但现在 Xcode 无法检测或忽略我在暂停按钮位置的点击。我真的不知道为什么。请你帮助我好吗?
更新:我试过 switch 语句:
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
switch self.nodeAtPoint(location) {
case self.pause:
self.scene?.view?.paused = true
self.pauseBackground.hidden = false
self.resumeButton.hidden = false
case self.resumeButton:
self.pauseBackground.hidden = true
self.resumeButton.hidden = true
self.scene?.view?.paused = false
default:
println()
}
}
遗憾的是,它也不起作用!我真的不知道为什么它在那个位置没有检测到触摸。
为您的暂停按钮命名。在 touchesBegan 中通过打印被触摸节点的名称来控制是否触摸暂停按钮。
控制触摸节点的zPosition和暂停按钮。设置暂停按钮的zPosition = 1000并尝试触摸它。
编辑:
假设节点node1是pauseButton的父节点。
node1.zPosition = 100.0f;
pauseButton.zPosition = 200.0f;
继续按钮在场景上方
continueButton.zPosition = 250.0f;
也就是说,pauseButton的zPosition在父节点node1上方200。 continueButton的zPosition(250)小于场景上方的pauseButton的zPosition,虽然zPosition好像少了(200)。那是因为 pauseButton 的 zPosition 在场景上方 300。父节点的zPosition对于控制其子节点和场景中其他节点的zPositions非常重要。
z节点的位置总是相对于它的父节点。您的两个按钮(暂停和恢复按钮)是否具有相同的父节点?控制触摸节点的最好方法是给每个节点一个名称和一个 zPosition,并在 touchesBegan 中打印这个(名称和 zPosition with NSLog() / println())。有了这个你就知道哪个节点被触摸了,你知道它的 zPosition。因此您可以更正每个节点的 zPosition,以便它按您的需要工作。
为了在 SpriteKit 游戏中暂停,我制作了一个暂停按钮。当我想制作另一个暂停场景并响应触摸正在过渡到一个场景时,它就像一个魅力。然后我的功能看起来 like this (P.S。pause
= 暂停按钮) 但它还有其他问题,我决定在我的主场景中暂停:playscene
所以我添加了一个附加到暂停背景的 pauseBackground
和 resumeButton
并将其隐藏(声明为 resumeButton.hidden = true
)
现在我的函数看起来像这样:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
if self.onGround {
self.speedY = -20.0
self.onGround = false
}
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
if self.nodeAtPoint(location) == self.pause {
self.scene?.view?.paused = true
self.pauseBackground.hidden = false
self.resumeButton.hidden = false
if self.nodeAtPoint(location) == self.resumeButton {
self.pauseBackground.hidden = true
self.resumeButton.hidden = true
self.scene?.view?.paused = false
}
}
}
}
这很有趣,因为它适用于场景转换,但现在 Xcode 无法检测或忽略我在暂停按钮位置的点击。我真的不知道为什么。请你帮助我好吗? 更新:我试过 switch 语句:
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
switch self.nodeAtPoint(location) {
case self.pause:
self.scene?.view?.paused = true
self.pauseBackground.hidden = false
self.resumeButton.hidden = false
case self.resumeButton:
self.pauseBackground.hidden = true
self.resumeButton.hidden = true
self.scene?.view?.paused = false
default:
println()
}
}
遗憾的是,它也不起作用!我真的不知道为什么它在那个位置没有检测到触摸。
为您的暂停按钮命名。在 touchesBegan 中通过打印被触摸节点的名称来控制是否触摸暂停按钮。
控制触摸节点的zPosition和暂停按钮。设置暂停按钮的zPosition = 1000并尝试触摸它。
编辑:
假设节点node1是pauseButton的父节点。
node1.zPosition = 100.0f;
pauseButton.zPosition = 200.0f;
继续按钮在场景上方
continueButton.zPosition = 250.0f;
也就是说,pauseButton的zPosition在父节点node1上方200。 continueButton的zPosition(250)小于场景上方的pauseButton的zPosition,虽然zPosition好像少了(200)。那是因为 pauseButton 的 zPosition 在场景上方 300。父节点的zPosition对于控制其子节点和场景中其他节点的zPositions非常重要。
z节点的位置总是相对于它的父节点。您的两个按钮(暂停和恢复按钮)是否具有相同的父节点?控制触摸节点的最好方法是给每个节点一个名称和一个 zPosition,并在 touchesBegan 中打印这个(名称和 zPosition with NSLog() / println())。有了这个你就知道哪个节点被触摸了,你知道它的 zPosition。因此您可以更正每个节点的 zPosition,以便它按您的需要工作。