Sprite kit iOS SpriteKit-碰撞和触点未按预期工作

Sprite kit iOS SpriteKit-碰撞和触点未按预期工作,sprite-kit,collision-detection,skphysicsbody,Sprite Kit,Collision Detection,Skphysicsbody,有时在我的SpriteKit程序中,我的碰撞和接触(使用SKPhysicsBody)不会按预期触发或工作。我想我已经准备好了我需要的一切,但我仍然没有得到正确的互动 我是否可以编写一些代码来检查哪些内容会与哪些内容发生冲突,以及设置了哪些机构来生成联系人?为了帮助诊断这些类型的问题,我已经编写了一个可以从任何地方调用的函数,该函数将分析当前场景,并生成一个列表,列出哪些节点与其他节点发生碰撞,哪些碰撞将通知我的场景 该函数是独立的,不需要被告知场景中节点的任何信息 功能如下:

有时在我的SpriteKit程序中,我的碰撞和接触(使用SKPhysicsBody)不会按预期触发或工作。我想我已经准备好了我需要的一切,但我仍然没有得到正确的互动


我是否可以编写一些代码来检查哪些内容会与哪些内容发生冲突,以及设置了哪些机构来生成联系人?

为了帮助诊断这些类型的问题,我已经编写了一个可以从任何地方调用的函数,该函数将分析当前场景,并生成一个列表,列出哪些节点与其他节点发生碰撞,哪些碰撞将通知我的场景

该函数是独立的,不需要被告知场景中节点的任何信息

功能如下:

            //MARK: - Analyse the collision/contact set up.
    func checkPhysics() {

        // Create an array of all the nodes with physicsBodies
        var physicsNodes = [SKNode]()

        //Get all physics bodies
        enumerateChildNodesWithName("//.") { node, _ in
            if let _ = node.physicsBody {
                physicsNodes.append(node)
            } else {
                print("\(node.name) does not have a physics body so cannot collide or be involved in contacts.")
            }
        }

//For each node, check it's category against every other node's collion and contctTest bit mask
        for node in physicsNodes {
            let category = node.physicsBody!.categoryBitMask
            // Identify the node by its category if the name is blank
            let name = node.name != nil ? node.name : "Category \(category)"
            let collisionMask = node.physicsBody!.collisionBitMask
            let contactMask = node.physicsBody!.contactTestBitMask

            // If all bits of the collisonmask set, just say it collides with everything.
            if collisionMask == UInt32.max {
                print("\(name) collides with everything")
            }

            for otherNode in physicsNodes {
                if (node != otherNode) && (node.physicsBody?.dynamic == true) {
                    let otherCategory = otherNode.physicsBody!.categoryBitMask
                    // Identify the node by its category if the name is blank
                    let otherName = otherNode.name != nil ? otherNode.name : "Category \(otherCategory)"

                    // If the collisonmask and category match, they will collide
                    if ((collisionMask & otherCategory) != 0) && (collisionMask != UInt32.max) {
                        print("\(name) collides with \(otherName)")
                    }
                    // If the contactMAsk and category match, they will contact
                    if (contactMask & otherCategory) != 0 {print("\(name) notifies when contacting \(otherName)")}
                }
            }
        }  
    }
您还需要检查以下三项:

  • 场景必须是
    skphysiccontactdelegate
  • 您必须设置
    physicsWorld.contactDelegate=self
  • 您需要实现以下可选方法之一:
    skphysiccontactdelegate
  • didBeginContact

    双端接触

    设置完所有图片后,应调用此函数-通常在
    didMoveToView
    works的末尾:

    checkPhysics()
    
    当我在practice Swift项目中从我的
    didMoveToView
    末尾调用此函数时,我得到以下输出:

    可选(“shape_blueSquare”)与可选(“Category”)冲突 2147483648”)可选(“shape_blueSquare”)与 可选(“shape\u redCircle”)可选(“shape\u blueSquare”)与 可选(“shape_purpleSquare”)可选(“shape_blueSquare”)碰撞 可选(“黄色三角形形状”)可选(“红色圆圈形状”) 与可选(“类别2147483648”)冲突 可选(“shape\u redCircle”)与可选(“shape\u blueSquare”)冲突 可选(“shape_redCircle”)在联系时通知 可选(“shape\u purpleSquare”)可选(“shape\u redCircle”)碰撞 可选(“黄色三角形形状”)可选(“红色圆圈形状”) 联系可选(“shape_yellowTriangle”)时通知 可选(“shape_purpleSquare”)与可选(“Category”)冲突 2147483648“)可选(“形状紫色方形”)与 可选(“黄色三角形形状”)可选(“黄色三角形形状”) 与didBeginContact输入的所有内容冲突 可选(“紫色方形形状”)和可选(“红色圆形形状”) 为可选(“shape_purpleSquare”)和 可选(“shape_redCircle”)DIDBGEGINContact为输入 可选(“黄色三角形形状”)和可选(“红色圆圈形状”)

    类别2147483648是我的边边界,它没有名称。我给它这个类别是为了匹配它的collisionBitMask


    请随时尝试此功能,并让我知道它是否有用,或者是否有任何情况它无法处理。

    此类问题实际上适用于此功能,仅适用于代码按预期工作以及OP是否需要审阅的代码审阅。。。从这个问题的声音来看,他不想要审查,他想要对他的代码进行错误检查……事实上,我真的不想审查我的代码,因为我认为它是有效的,但我试图发布一些可以帮助人们解决冲突/联系问题的东西。也许我应该发布一个问题,说明我有问题,然后我的checkPhysics函数作为答案?Stack Overflow是一个问答网站,这里没有问题。我想你可以发布代码作为你自己问题的答案,问题是“我如何诊断SpriteKit碰撞检测错误?”除非你在物理节点阵列上使用过滤器,否则这会变得非常慢非常快,并在测试过程中伤害你,低FPS意味着跳帧可能会导致对象相互穿过,而不是触发did联系人。这是一个值得github使用的工具!