Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了从SCNScene和overlaySKScene获取触摸事件的swift / scenekit问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

下午好,我正在试图弄清楚如何从SCNNode&来自SCNScene的SKSpriteNode与SKScene重叠. import UIKit import SceneKit class GameViewController: UIViewController { var scnView:SCNView! var scnScene:SCNScene! var sprite: spritekitHUD
下午好,我正在试图弄清楚如何从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


    }
}

大佬总结

以上是大佬教程为你收集整理的从SCNScene和overlaySKScene获取触摸事件的swift / scenekit问题全部内容,希望文章能够帮你解决从SCNScene和overlaySKScene获取触摸事件的swift / scenekit问题所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。