从SCNScene和overlaySKScene获取触摸事件的swift / scenekit问题
发布时间:2020-12-14 02:26:29 所属栏目:百科 来源:网络整理
导读:下午好,我正在试图弄清楚如何从SCNNode来自SCNScene的SKSpriteNode与SKScene重叠. import UIKitimport SceneKitclass GameViewController: UIViewController {var scnView:SCNView!var scnScene:SCNScene!var sprite: spritekitHUD!var cameraNode: SCNNode!
下午好,我正在试图弄清楚如何从SCNNode&来自SCNScene的SKSpriteNode与SKScene重叠.
import UIKit import SceneKit class GameViewController: UIViewController { var scnView:SCNView! var scnScene:SCNScene! var sprite: spritekitHUD! var cameraNode: SCNNode! var shape: SCNNode! override func viewDidLoad() { super.viewDidLoad() setupScene() } func setupScene() { scnView = self.view as! SCNView scnView.delegate = self scnView.allowsCameraControl = true scnScene = SCNScene(named: "art.scnassets/scene.scn") scnView.scene = scnScene sprite=spritekitHUD(size: self.view.bounds.size,game: self) scnView.overlaySKScene=sprite cameraNode = scnScene.rootNode.childNode(withName: "camera",recursively: true)! shape=scnScene.rootNode.childNode(withName: "shape",recursively: true) shape.name="ThreeDShape" } override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) { let touch = touches.first! let location = touch.location(in: scnView) let hitResults = scnView.hitTest(location,options: nil) if let result = hitResults.first { handleTouchFor(node: result.node) } } func handleTouchFor(node: SCNNode) { if node.name == "ThreeDShape" { print("SCNNode Touched") } } } 这是我的Spritekit叠加场景 import Foundation import SpriteKit class spritekitHUD: SKScene{ var game:GameViewController! var shapeNode: SKSpriteNode! init(size: CGSize,game: GameViewController){ super.init(size: size) self.backgroundColor = UIColor.white let spriteSize = size.width/12 self.shapeNode= SKSpriteNode(imageNamed: "shapeNode") self.shapeNode.size = CGSize(width: spriteSize,height: spriteSize) self.shapeNode.position = CGPoint(x: spriteSize + 8,y: spriteSize + 8) self.shapeNode.name="test" self.game=game self.addChild(self.pauseNode) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func touchesEnded(_ touches: Set<UITouch>,with event: UIEvent?) { guard let touch=touches.first else{ return } let location=touch.location(in: self) if self.atPoint(location).name=="test" { print("Spritekit node pressed") } } } 所以有了这个,我可以成功获得通知,我的spritenode已经触及我的overlaySKScene,但我无法弄清楚如何获得我的SCNode被触摸的通知.如果你不能有2个touchesbegan函数,有没有人有任何想法如何我同时处理2d事件的3D事件? 谢谢你的帮助!!
这是从Xcode的游戏模板中直接“解除”……
在viewDidLoad中添加手势识别器: // add a tap gesture recognizer let tapGesture = UITapGestureRecognizer(target: self,action: #selector(handleTap(_:))) scnView.addGestureRecognizer(tapGesture) func handleTap(_ gestureRecognize: UIGestureRecognizer) { // retrieve the SCNView let scnView = self.view as! SCNView // check what nodes are tapped let p = gestureRecognize.location(in: scnView) let hitResults = scnView.hitTest(p,options: [:]) // check that we clicked on at least one object if hitResults.count > 0 { // retrieved the first clicked object let result: AnyObject = hitResults[0] // result.node is the node that the user tapped on // perform any actions you want on it } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ORACLE 用户和其下的对象
- 依赖倒置、控制反转和依赖注入(二)
- ruby-on-rails – RailsCast 182(修订版):Jcrop不工作
- Blazeds StreamingAMFChannel error for HTTP 1.0 protocol
- ios – Xcode 8.3.3“没有iTunes Connect访问权限”
- ruby-on-rails – “宝石更新 – 系统在Debian上被禁用”错
- Flex 图形标绘——线条、箭头的绘制
- xcode – 使用c 11或旧版libstdc标准库检测clang是否正在编
- oracle数据库的回收站的使用
- React Native-15.React Native 常用API及实践 AlertIOS Al