【发布时间】:2020-12-12 05:28:35
【问题描述】:
我正在做一个文字游戏。为此,我使用 SceneKit 并添加一个 SpriteNodes 来表示字母图块。 这个想法是,当用户单击字母图块时,会在其周围出现一些额外的图块,并带有不同的字母选项。我的问题是关于各种交互的触摸手势。
当用户点击字母拼贴时,会显示其他拼贴。我在我的 tile SpriteNode 类中使用以下方法实现了这一点:
override func touchesBegan(_ touches:Set<UITouch> , with event: UIEvent?) {
guard let touch = touches.first else {
return
}
delegate?.updateLetter(row: row, column: column, x:xcoord, y:ycoord, useCase: 1)
}
这会正确触发显示另一个精灵节点的委托。 我想要实现的是长按从父节点中删除精灵节点。我找到了 .removeFromParent() 方法,但是我无法让它检测到长按手势。
我的理解是这种手势必须使用 UIGestureRecognizer 添加。我可以在我的 Scene 类中添加以下方法:
override func didMove(to view: SKView) {
let longPress = UILongPressGestureRecognizer(target: self,
action: #selector(GameScene.longPress(sender:)))
view.addGestureRecognizer(longPress)
}
@objc func longPress(sender: UILongPressGestureRecognizer) {
print("Long Press")
这将检测到场景中任意位置的长按。但是,我需要能够在删除它之前处理按下的节点属性。我尝试将以下内容添加到 longPress 函数中:
let location = sender.location(in: self)
let touchedNodes = nodes(at: location)
let firstTouchedNode = atPoint(location).name
touchedNodes[0].removeFromParent()
但我收到以下错误:无法将“GameScene”类型的值转换为预期的参数类型“UIView?”
这似乎有点凌乱的做事方式,因为我在不同的地方都有触摸方法。
所以我的问题是,我怎样才能保留 tile 类中的当前 touchesBegan 方法,并添加一个长按手势以能够引用和删除 spriteNode?p>
【问题讨论】:
标签: swift sprite-kit uigesturerecognizer scenekit touchesbegan