未检测到 SpriteKit 碰撞

Posted

技术标签:

【中文标题】未检测到 SpriteKit 碰撞【英文标题】:SpriteKit collision not being detected 【发布时间】:2017-10-04 01:13:29 【问题描述】:

我有两个节点,一个“猫”和一个“老鼠”,但由于某种原因,我无法检测到它们的碰撞。我正在使用这种方法制作口罩:

enum CollisionTypes: UInt32 
    case holder      = 1
    case chef        = 2
    case powerups    = 4
    case ingredients = 8
    case utensils    = 16
    case floor       = 32
    case bag         = 64
    case table       = 128
    case tip         = 256
    case rat         = 512
    case cat         = 1024
    

这里是我初始化它们物理体的地方:

    // Cat physics body, the node's name is "cat"       
     public func initializeAt(position: CGPoint) 

    sprite.position = position
    sprite.zPosition = 5
    sprite.name = "cat"
    sprite.alpha = 0.7
    scene.sceneContent.addChild(sprite)

    sprite.physicsBody = SKPhysicsBody(rectangleOf: sprite.size)
    sprite.physicsBody!.isDynamic = false
    sprite.physicsBody!.categoryBitMask    = CollisionTypes.cat.rawValue
    sprite.physicsBody!.contactTestBitMask = CollisionTypes.rat.rawValue
    sprite.physicsBody!.collisionBitMask   = CollisionTypes.rat.rawValue


    // Rat physics body, the nodes name is "rat"
    init() 
    node.name = "rat"
    node.zPosition = 5

    node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
    node.physicsBody!.isDynamic = false
    node.physicsBody!.categoryBitMask = CollisionTypes.rat.rawValue
    node.physicsBody!.contactTestBitMask = CollisionTypes.cat.rawValue
    node.physicsBody!.collisionBitMask = CollisionTypes.cat.rawValue

    setupFrames()
    

这是我的 didBegin() 方法。但是,两个 if 语句都没有执行,我不知道为什么,因为我在项目中将这种方法用于许多其他事情。

func didBegin(_ contact: SKPhysicsContact) 
    if let node1 = contact.bodyA.node as? SKSpriteNode,
        let node2 = contact.bodyB.node as? SKSpriteNode 

        if node1.name == "rat" && node2.name == "cat" 

            for rat in rats 
                if node1 == rat.node 
                    rat.die()
                
            

            Cat.shared.resetPosition()
            return
        
        else if node1.name == "cat" && node2.name == "rat" 

            for rat in rats 
                if node2 == rat.node 
                    rat.die()
                
            

            Cat.shared.resetPosition()
            return
        

如果我尝试使用 contactTestBitMasks 并让它们变得不同,例如“成分”,那么我可以看到猫和老鼠正在与成分相互作用,但似乎它们只是不会相互作用。

【问题讨论】:

你从来没有给你的节点一个名字,你可以声称你是,但是在提供的代码中,你没有给它们一个名字 节点名从何而来? 我确实为我的节点命名,我只是没有包括抱歉。我编辑了我的问题。但我知道这些名称工作正常,因为我用它们来测试它们是否与其他物理体交互 您的rats 数组来自哪里?参与碰撞的老鼠是否必须在这个数组中才能死亡? 【参考方案1】:

ratscats 不会触发相互联系,因为两者都将isDynamic 设置为false。在触发联系人之前,其中至少一个需要是动态的。

来自https://developer.apple.com/documentation/spritekit/skphysicsbody

isDynamic 属性控制是否基于体积的主体 受重力、摩擦、与其他物体的碰撞以及您直接施加在物体上的力或脉冲的影响。

【讨论】:

我假设ingredients 精灵是动态的,所以当catrat 接触ingredient 时,会为成分生成碰撞和/或接触。 太棒了,一定是它! @SteveIves 你 100% 就在这里,谢谢

以上是关于未检测到 SpriteKit 碰撞的主要内容,如果未能解决你的问题,请参考以下文章

未检测到 SpriteKit 碰撞

Sprite Kit中的碰撞检测未检测到碰撞

Spritekit 碰撞检测无法正常工作

SpriteKit 碰撞检测不起作用

SpriteKit 中的碰撞检测

基于 SpriteKit 中的碰撞检测更新分数的问题