0

我找不到任何 Scene Kit 联系人处理示例,更具体地说,找不到任何实现以下功能的示例:

func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {
  ...
}

我不能让我的工作,所以我来到这里。

这是我到目前为止所拥有的:

import UIKit
import QuartzCore
import SceneKit

enum BodyType: UInt32 {
    case sphere = 1
    case wall = 2
}

class GameViewController: UIViewController, SCNSceneRendererDelegate, SCNPhysicsContactDelegate {

    var gameView : SCNView!
    var gameScene : SCNScene!
    var cameraNode : SCNNode!
    var lightNode1 : SCNNode!
    var lightNode2 : SCNNode!

    override func viewDidLoad() {
        super.viewDidLoad()
        initView()
        initScene()
        initCamera()
        initLights()
        createBoundary()
        createBall()
    }

    func initView(){
        gameView = self.view as! SCNView
        gameView.allowsCameraControl = true
        gameView.autoenablesDefaultLighting = true
        gameView.delegate = self
        gameView.scene?.physicsWorld.contactDelegate = self
    }

    func initScene (){
        gameScene = SCNScene()
        gameView.scene = gameScene
        gameView.isPlaying = true
    }

    func initCamera() {
        cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(x: 0, y: 14.4, z: 0)
        cameraNode.rotation = SCNVector4(x: 1, y: 0, z: 0, w: Float.pi * 1.5)
        gameScene.rootNode.addChildNode(cameraNode)
    }

    func initLights() {
        lightNode1 = SCNNode()
        lightNode1.light = SCNLight()
        lightNode1.light?.type = SCNLight.LightType.omni
        lightNode1.light?.intensity = 300
        lightNode1.position = SCNVector3(x: 0, y: 20, z: 0)
        gameScene.rootNode.addChildNode(lightNode1)

        lightNode2 = SCNNode()
        lightNode2.light = SCNLight()
        lightNode2.light?.type = SCNLight.LightType.ambient
        lightNode2.light?.intensity = 900
        lightNode2.position = SCNVector3(x: 0, y: 0, z: 0)
        gameScene.rootNode.addChildNode(lightNode2)
    }

    func createBoundary() {
        let geometry:SCNGeometry = SCNPlane(width: 10, height: 10)
        geometry.materials.first?.diffuse.contents = UIColor.cyan
        let geometryNode = SCNNode(geometry: geometry)
        geometryNode.physicsBody = SCNPhysicsBody(type: .static, shape: nil)
        geometryNode.position = SCNVector3(x: 0, y: 0, z: 0)
        geometryNode.physicsBody?.categoryBitMask = BodyType.wall.hashValue
        geometryNode.physicsBody?.collisionBitMask = BodyType.wall.hashValue
        geometryNode.physicsBody?.contactTestBitMask = BodyType.wall.hashValue
        geometryNode.physicsBody?.isAffectedByGravity = false
        gameScene.rootNode.addChildNode(geometryNode)
        self.gameView.scene?.physicsWorld.gravity = SCNVector3(x: 0, y: 0, z: -10)

    }

    func createBall() {
        let geometry : SCNSphere = SCNSphere(radius: 1)
        geometry.materials.first?.diffuse.contents = UIColor.white
        let geometryNode = SCNNode(geometry: geometry)
        geometryNode.physicsBody?.categoryBitMask = BodyType.sphere.hashValue
        geometryNode.physicsBody?.collisionBitMask = BodyType.sphere.hashValue
        geometryNode.physicsBody?.contactTestBitMask = BodyType.sphere.hashValue
        geometryNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: nil)
        geometryNode.position = SCNVector3(x: 0, y: 0, z: 0)
        geometryNode.physicsBody?.isAffectedByGravity = true
        gameScene.rootNode.addChildNode(geometryNode)
    }

    func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact) {
        let contactMask = contact.nodeA.categoryBitMask | contact.nodeB.categoryBitMask
        switch (contactMask) {
        case BodyType.wall.hashValue | BodyType.sphere.hashValue :
            print("hit")
        default:
            return
        }
    }

    override var shouldAutorotate: Bool {
        return false
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
    }

}

不会调用 print("hit") 行。这是为什么?

4

0 回答 0