UILongPressGestureRecognizer 与 SpriteKit
UILongPressGestureRecognizer with SpriteKit
我正在尝试弄清楚如何检测是否按下了 shapeNode,特别是使用 LongPress 手势。请看下面的代码。知道出了什么问题吗,为什么我看不到 "Found!" 消息?
class Test: SKScene {
let longPressGesture = UILongPressGestureRecognizer()
override func didMove(to view: SKView) {
longPressGesture.addTarget(self, action: #selector(GameScene.longPress))
self.view?.addGestureRecognizer(longPressGesture)
let testPath = UIBezierPath(rect: CGRect(x: (view.scene?.frame.midX)!, y: (view.scene?.frame.midY)!, width: 2 * 50.0, height: 2 * 50.0)).cgPath
let testNode = Node.init(path: testPath, nodeName: "TEST")
testNode.fillColor = UIColor.brown
testNode.position = CGPoint(x: (view.scene?.frame.midX)!, y: (view.scene?.frame.midY)!)
self.addChild(testNode)
}
func longPress(_ sender: UILongPressGestureRecognizer) {
let longPressLocation = sender.location(in: self.view)
if sender.state == .began {
for child in self.children {
if let shapeNode = child as? SKShapeNode {
if shapeNode.contains(longPressLocation) {
print("Found!")
}
}
}
} else if sender.state == .ended {
print("ended")
}
}
}
非常感谢您的帮助!
您目前正在计算视图坐标系中的点击位置。为了在场景坐标系中工作(因为 SKShapeNode
被添加到场景中),您必须将点击位置从视图坐标系转换为场景坐标系,如下所示:
let longPressLocation = convertPoint(fromView: sender.location(in: self.view))
与原始问题无关,但要记住的一件好事是,在大多数情况下,强制解包并不是一个好主意(尽管有时它在开发阶段会有所帮助),并且您应该倾向于访问的基础值以一种安全的方式使用可选项(例如使用 if let 语法)。
我正在尝试弄清楚如何检测是否按下了 shapeNode,特别是使用 LongPress 手势。请看下面的代码。知道出了什么问题吗,为什么我看不到 "Found!" 消息?
class Test: SKScene {
let longPressGesture = UILongPressGestureRecognizer()
override func didMove(to view: SKView) {
longPressGesture.addTarget(self, action: #selector(GameScene.longPress))
self.view?.addGestureRecognizer(longPressGesture)
let testPath = UIBezierPath(rect: CGRect(x: (view.scene?.frame.midX)!, y: (view.scene?.frame.midY)!, width: 2 * 50.0, height: 2 * 50.0)).cgPath
let testNode = Node.init(path: testPath, nodeName: "TEST")
testNode.fillColor = UIColor.brown
testNode.position = CGPoint(x: (view.scene?.frame.midX)!, y: (view.scene?.frame.midY)!)
self.addChild(testNode)
}
func longPress(_ sender: UILongPressGestureRecognizer) {
let longPressLocation = sender.location(in: self.view)
if sender.state == .began {
for child in self.children {
if let shapeNode = child as? SKShapeNode {
if shapeNode.contains(longPressLocation) {
print("Found!")
}
}
}
} else if sender.state == .ended {
print("ended")
}
}
}
非常感谢您的帮助!
您目前正在计算视图坐标系中的点击位置。为了在场景坐标系中工作(因为 SKShapeNode
被添加到场景中),您必须将点击位置从视图坐标系转换为场景坐标系,如下所示:
let longPressLocation = convertPoint(fromView: sender.location(in: self.view))
与原始问题无关,但要记住的一件好事是,在大多数情况下,强制解包并不是一个好主意(尽管有时它在开发阶段会有所帮助),并且您应该倾向于访问的基础值以一种安全的方式使用可选项(例如使用 if let 语法)。