我有一个看起来非常基础的ViewController
,其中包含一个SCNView
,并且有一个overlaySKScene
。
我的问题是,如果首先在覆盖场景中的SpriteKit节点中检测到了点击事件,我不想在底层的self.scene
(如下例中的gameScene
)中检测到该点击事件。
通过以下代码,即使点击事件发生在SKOverlay场景节点actionButtonNode
上,两个场景也会报告发生了点击事件。
ViewController
import UIKit
import SceneKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
sceneView = self.view as? SCNView
gameScene = GameScene()
let view = sceneView
view!.scene = gameScene
view!.delegate = gameScene as? SCNSceneRendererDelegate
view!.overlaySKScene = OverlayScene(size: self.view.frame.size)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.handleTap(_:)))
tapGesture.cancelsTouchesInView = false
view!.addGestureRecognizer(tapGesture)
}
@objc func handleTap(_ sender:UITapGestureRecognizer) {
let projectedOrigin = self.sceneView!.projectPoint(SCNVector3Zero)
let taplocation = sender.location(in: self.view!)
let opts = [ SCNHitTestOption.searchMode:1, SCNHitTestOption.ignoreHiddenNodes:0 ]
let hitList = self.sceneView!.hitTest(taplocation, options: opts)
if hitList.count > 0 {
for hit in hitList {
print("hit:", hit)
}
}
}
}
覆盖场景
import UIKit
import SpriteKit
class OverlayScene: SKScene {
var actionButtonNode: SKSpriteNode!
override init(size: CGSize) {
super.init(size: size)
self.backgroundColor = UIColor.clear
self.actionButtonNode = SKSpriteNode()
self.actionButtonNode.size = CGSize(width: size.width / 2, height: 60)
self.actionButtonNode.position = CGPoint(x: size.width / 2, y: 80)
self.actionButtonNode.color = UIColor.blue
self.addChild(self.actionButtonNode)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first
let location = touch?.location(in: self)
if self.actionButtonNode.contains(location!) {
print("actionButtonNode touch")
}
}
}