Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 碰撞检测SceneKit Swift_Ios_Swift_Scenekit - Fatal编程技术网

Ios 碰撞检测SceneKit Swift

Ios 碰撞检测SceneKit Swift,ios,swift,scenekit,Ios,Swift,Scenekit,我使用委托SCNPphysicContactDelegate构建了一个具有冲突检测的应用程序。我尝试检测与SCNPhysicsContactDelegate的冲突,但它不起作用 什么是工作 这是我的密码 let CollisionCategorySpaceMan = 1 let CollisionCategoryEnemy = 2 func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsConta

我使用委托SCNPphysicContactDelegate构建了一个具有冲突检测的应用程序。我尝试检测与SCNPhysicsContactDelegate的冲突,但它不起作用

什么是工作

这是我的密码

let CollisionCategorySpaceMan = 1
let CollisionCategoryEnemy = 2

func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact) {
    if contact.nodeB.physicsBody!.categoryBitMask == CollisionCategoryEnemy {
        print("Enemy HIT!--------")
    }
}




  override func viewDidLoad() {
        super.viewDidLoad()

let mainScene = createMainScene()

        mainScene.physicsWorld.contactDelegate = self

        mainScene.physicsWorld.gravity = SCNVector3Make(0, 0, 0)



        sceneView = self.view as! GameView
        sceneView.scene = mainScene
        sceneView.delegate = self

    }
这就是敌人

func setupEnemy(){
        space = space - 300
        let football2 = SCNScene(named: "art.scnassets/k.scn")
        let football21 = football2!.rootNode.childNodeWithName("football2", recursively: false)
        football21!.name = "Enemy"
        football21!.physicsBody = SCNPhysicsBody(type: .Dynamic, shape: nil)
        football21!.physicsBody!.categoryBitMask = CollisionCategoryEnemy
        football21!.physicsBody!.collisionBitMask = CollisionCategorySpaceMan
        football21!.position = SCNVector3(x: 0, y: 0, z: Float(space))
        sceneView.scene!.rootNode.addChildNode(football21!)
    }
这就是英雄

func createMainScene() -> SCNScene {
        let scene = SCNScene(named: "art.scnassets/football.scn")
        spaceManNode = scene!.rootNode.childNodeWithName("football", recursively: false)

        spaceManNode!.physicsBody = SCNPhysicsBody(type: .Dynamic, shape: nil)
        spaceManNode!.physicsBody!.categoryBitMask = CollisionCategorySpaceMan
        spaceManNode!.physicsBody!.contactTestBitMask = CollisionCategoryEnemy
        spaceManNode.name = "SpaceMan"

        setupLighting(scene!)
        setupCameras(scene!)

        return scene!
    }

从iOS 9开始,您必须显式设置physicsBody的“contactTestBitMask”以获取联系人通知。似乎SetupForeign()中缺少了该选项。我的游戏中的碰撞在iOS 8上运行良好,但在iOS 9上停止工作,直到我找到以下帖子:


希望这有帮助

在这种情况下,我发现有两行缺失:

你的敌人的目标或者什么应该是这样的

physicsBody?.categoryBitMask = PhysicsCategory.enemy // your enemy category (lets say 1)
physicsBody?.collisionBitMask = PhysicsCategory.player (with what can report collision lets say 2
你的英雄:

physicsBody?.categoryBitMask = PhysicsCategory.player  // the category is 2
physicsBody?.collisionBitMask = PhysicsCategory.enemy | PhysicsCategory.ball // can report collision with 1 and 3        
physicsBody?.contactTestBitMask = PhysicsCategory.enemy | PhysicsCategory.ball // when hitTest performed detect collision with 1 and 3
希望这有帮助,
关于

您是否检查了
didBeginContact
是否至少被调用?谁向您保证
nodeB
属于
CollisionCategoryEnemy
,而不是
nodeA
?我尝试两种方法都不起作用:'(看起来您没有在
spaceManNode
上设置
collisionBitMask
)。