Swift - 未检测到随机冲突

时间:2016-06-17 00:59:32

标签: swift collision-detection nodes skspritenode collision

在我的游戏中,我使用SKSprite。未检测到某些碰撞。我做了10次尝试,碰撞运行良好但是没有检测到大约25%的应该检测到的碰撞。我不知道为什么,我尝试了很多东西。冲突仅适用于同一类别的节点。

我不知道为什么当我明显看到它们时会发生随机的碰撞,你有什么想法吗?谢谢你的帮助。

这是didBeginContact的代码:

func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody = contact.bodyA
    var secondBody: SKPhysicsBody = contact.bodyB

    if firstBody.categoryBitMask == secondBody.categoryBitMask {

            listContacts.append([firstBody.node!,secondBody.node!])
        }

    }
}

这是didEndContact的代码:

func didEndContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody = contact.bodyA
    var secondBody: SKPhysicsBody = contact.bodyB

    if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask {

        for i in listContacts{

            if (i.contains(firstBody.node!) && i.contains(secondBody.node!)){

                let findIndex = listContacts.indexOf { $0 == i }
                listContacts.removeFirst(findIndex!) 
            }
        }

    }

最后,当我声明一个新的SKSpriteNode时,我设置了这个:

rectangle.physicsBody = SKPhysicsBody(rectangleOfSize: rectangle.size)
rectangle.physicsBody?.dynamic = true 
rectangle.physicsBody?.collisionBitMask = PhysicsCategory.None

usesPreciseCollisionDetection = true不会改变任何内容,所以我不使用usePrecisionCollisionDetection

每个SKSpriteNode都有他的categoryBitmask和contactTestBitmask相等,因为只有相同的SKSpriteNodes应该碰撞。

此外:

physicsWorld.gravity = CGVectorMake(0, 0)
physicsWorld.contactDelegate = self

如果您想轻松了解发生的事情(矩形之间发生碰撞问题),最后这里是我游戏的简短视频https://www.youtube.com/watch?v=-pbmKwQiE9U

2 个答案:

答案 0 :(得分:0)

你似乎正在检查身体A的categoryBitMask是否等于身体B.

if firstBody.categoryBitMask == secondBody.categoryBitMask {

        listContacts.append([firstBody.node!,secondBody.node!])
    }

}

只有当节点遇到具有相同categoryBitMask

的节点时,才会执行此操作

您应该检查collisionBitMasks以查看是否发生碰撞,或者您可以检查名称。

对于使用categoryBitMask的示例,您可以执行以下操作:

func didBeginContact(contact: SKPhysicsContact) {

    var sprite: SKSpriteNode!

    if contact.bodyA.categoryBitMask == <your category bitmask> {
        sprite = contact.bodyA.node! as! SKSpriteNode
    }
    else if contact.bodyB.categoryBitMask == <your category bitmask> {
        sprite = contact.bodyB.node! as! SKSpriteNode
    }

    // Do something with sprite....
    // You can also create another sprite, and assign it to the other body, and perform functions on it, or both A and B.
    // It is good to have different functions you send can send the nodes to once you find out which ones they are.

}

您可以执行这些检查以查看哪些精灵相互撞击。

答案 1 :(得分:0)

我刚修好了!原因是在函数“touchesEnded”中,我有一个递归函数,它正在删除listContacts中的错误连接!