防止具有相同 Catagorymask 的 Spritekit 节点发生碰撞
prevent Spritekit nodes with the same Catagorymask from colliding
我有一个我正在处理的 Spritekit 项目,其中有一个玩家节点可以在屏幕上移动,然后有子弹节点向你射击。我的问题是,子弹不仅会击中玩家,还会相互击中。我已经为玩家和子弹提供了自己的 category/collision/contact 面具。
我在这里指定了所有不同的类别掩码(其中一些可以忽略):
enum CategoryMask : UInt32 {
case playeragain = 11
case player = 1
case GBullet = 2
case BBullet = 3
case enemyships = 4
case coin = 5
case boss = 6
}
BBullet 是射向你的子弹,player 是用户控制的节点。
然后我将这些掩码分配给每个节点:
player.physicsBody?.categoryBitMask = CategoryMask.player.rawValue
player.physicsBody?.collisionBitMask = CategoryMask.BBullet.rawValue | CategoryMask.coin.rawValue
player.physicsBody?.contactTestBitMask = CategoryMask.BBullet.rawValue | CategoryMask.coin.rawValue
bullet.physicsBody?.categoryBitMask = CategoryMask.BBullet.rawValue
bullet.physicsBody?.collisionBitMask = CategoryMask.player.rawValue
bullet.physicsBody?.contactTestBitMask = CategoryMask.player.rawValue
子弹和玩家之间的碰撞效果很好,我已经在 "Did begin contact" 函数中设置了如何处理每次碰撞。我想指定我不希望子弹相互碰撞。
它是二进制位掩码。
所以最好使用一些位运算符:
enum CategoryMask : UInt32 {
case playeragain = 0b00000001
case player = 0b00000010
case GBullet = 0b00000100
case BBullet = 0b00001000
case enemyships = 0b00010000
case coin = 0b00100000
case boss = 0b01000000
}
// case playeragain = 1<<0 //1
// case player = 1<<1 // 2
// case GBullet = 1<<2 // 4
// case BBullet = 1<<3 //8
// case enemyships = 1<<4 //16
// case coin = 1<<5 //32
// case boss = 1<<6 //64
//
这应该给你真正的东西。
这是 Apple 文档中的示例,红球会落地而蓝球不会。
let ground = SKShapeNode()
redBall.physicsBody?.collisionBitMask = 0b0001
blueBall.physicsBody?.collisionBitMask = 0b0010
ground.physicsBody?.categoryBitMask = 0b0001
只是添加到上面的答案中,您将类别位掩码定义为:
case playeragain = 11 (binary 1011)
case player = 1 (Binary 0001)
case GBullet = 2. (Binary 0010)
case BBullet = 3. (Binary 0011)
case enemyships = 4. (Binary. 0100)
case coin = 5. (Binary 0101)
case boss = 6. (Binary 0110)
您拥有的唯一唯一值(即设置了一个位)是玩家、GBullet 和敌舰。任何定义为 BBullet 的东西都将匹配为玩家或 GBullet; coin 将识别为敌舰或玩家和 Boss 为敌舰或 GBullet 和 playeragain 为未定义的东西 (1000),GBullet 或玩家。
这是碰撞和接触测试位掩码的指南:
我有一个我正在处理的 Spritekit 项目,其中有一个玩家节点可以在屏幕上移动,然后有子弹节点向你射击。我的问题是,子弹不仅会击中玩家,还会相互击中。我已经为玩家和子弹提供了自己的 category/collision/contact 面具。
我在这里指定了所有不同的类别掩码(其中一些可以忽略):
enum CategoryMask : UInt32 {
case playeragain = 11
case player = 1
case GBullet = 2
case BBullet = 3
case enemyships = 4
case coin = 5
case boss = 6
}
BBullet 是射向你的子弹,player 是用户控制的节点。
然后我将这些掩码分配给每个节点:
player.physicsBody?.categoryBitMask = CategoryMask.player.rawValue
player.physicsBody?.collisionBitMask = CategoryMask.BBullet.rawValue | CategoryMask.coin.rawValue
player.physicsBody?.contactTestBitMask = CategoryMask.BBullet.rawValue | CategoryMask.coin.rawValue
bullet.physicsBody?.categoryBitMask = CategoryMask.BBullet.rawValue
bullet.physicsBody?.collisionBitMask = CategoryMask.player.rawValue
bullet.physicsBody?.contactTestBitMask = CategoryMask.player.rawValue
子弹和玩家之间的碰撞效果很好,我已经在 "Did begin contact" 函数中设置了如何处理每次碰撞。我想指定我不希望子弹相互碰撞。
它是二进制位掩码。
所以最好使用一些位运算符:
enum CategoryMask : UInt32 {
case playeragain = 0b00000001
case player = 0b00000010
case GBullet = 0b00000100
case BBullet = 0b00001000
case enemyships = 0b00010000
case coin = 0b00100000
case boss = 0b01000000
}
// case playeragain = 1<<0 //1
// case player = 1<<1 // 2
// case GBullet = 1<<2 // 4
// case BBullet = 1<<3 //8
// case enemyships = 1<<4 //16
// case coin = 1<<5 //32
// case boss = 1<<6 //64
//
这应该给你真正的东西。
这是 Apple 文档中的示例,红球会落地而蓝球不会。
let ground = SKShapeNode()
redBall.physicsBody?.collisionBitMask = 0b0001
blueBall.physicsBody?.collisionBitMask = 0b0010
ground.physicsBody?.categoryBitMask = 0b0001
只是添加到上面的答案中,您将类别位掩码定义为:
case playeragain = 11 (binary 1011)
case player = 1 (Binary 0001)
case GBullet = 2. (Binary 0010)
case BBullet = 3. (Binary 0011)
case enemyships = 4. (Binary. 0100)
case coin = 5. (Binary 0101)
case boss = 6. (Binary 0110)
您拥有的唯一唯一值(即设置了一个位)是玩家、GBullet 和敌舰。任何定义为 BBullet 的东西都将匹配为玩家或 GBullet; coin 将识别为敌舰或玩家和 Boss 为敌舰或 GBullet 和 playeragain 为未定义的东西 (1000),GBullet 或玩家。
这是碰撞和接触测试位掩码的指南: