基本上,您应该检查触地时的触摸位置,并与触地时的位置进行比较。如果触摸不再在您的按钮区域内,您将取消所有效果。
不过,首先要说一点。看起来您正在处理 SKScene 级别的按钮逻辑,这是教程经常告诉您的。但是,这可能不是最好的方法。这里的风险,除了 SKScene 的杂乱无章之外,还来自处理多个对象以及它们如何对触摸事件做出反应,以及多点触控带来的额外复杂性(如果允许的话)。
几年前,当我开始使用 SpriteKit 时,我觉得这是一个巨大的痛苦。所以我创建了一个按钮类来独立处理所有的触摸逻辑(并在需要发生某些事情时将信号发送回父级)。好处:没有不必要的混乱,区分对象没有问题,能够确定每个节点的多点触控允许。
我在课堂上查看触摸是否在触摸之前没有离开按钮的操作是存储按钮区域的大小(作为对象的参数)和其中的触摸位置。简单简单。
事实上,Apple 并没有默认提供一个基本的 SKButton 类,这让我永远感到困惑。无论如何,我想你可能想考虑一下。至少对我来说,它每天都节省了很多时间。而且我已经发布了多个具有相同自定义按钮类的成功应用程序。
编辑:下面是我的准系统 Button 类。
import SpriteKit
class Button: SKNode {
private var background: SKSpriteNode?
private var icon: SKNode?
private var tapAction: () -> Void = {}
override init() {
super.init()
isUserInteractionEnabled = true
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
isUserInteractionEnabled = true
}
// MARK: Switches
public func switchButtonBackground(buttonBackgroundSize: CGSize, buttonBackgroundColor: SKColor) {
background = SKSpriteNode(color: buttonBackgroundColor, size: buttonBackgroundSize)
addChild(background!)
}
public func switchButtonIcon(_ buttonIcon: SKNode) {
if icon != nil {
icon = nil
}
icon = buttonIcon
addChild(icon!)
}
public func switchButtonTapAction(_ buttonTapAction: @escaping () -> Void) {
tapAction = buttonTapAction
}
// MARK: Touch events
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
tapAction()
}
}
然后您创建 Button 对象,首先启动它,使用大小和颜色为其分配背景,然后为其分配一个图标,为其分配一个在点击时运行的功能,最后将其作为子项添加到场景中。
let icon = SKNode()
let size = CGSize(width: 20.0, height: 20.0)
let button = Button()
button.switchButtonBackground(buttonBackgroundSize: size, buttonBackgroundColor: .clear)
button.switchButtonIcon(icon)
button.switchButtonTapAction(buttonPressed)
addChild(button)
背景定义了按钮的触摸区域,您可以为其设置颜色或将其确定为 .clear。该图标应该在按钮顶部包含您想要的任何文本或图像。只需将它们打包成一个 SKNode 就可以了。如果你想运行一个带参数的函数作为点击动作,你可以做一个代码块。
希望对您有所帮助!如果您需要任何进一步的帮助,请告诉我:)。