检测两种相同颜色何时发生碰撞

时间:2016-01-04 20:16:55

标签: swift sprite-kit collision-detection

我的场景中间有一个由四种不同颜色组成的正方形。同时,我从场景的每一侧随机生成相同颜色的较小正方形,意图与中间的正方形相撞。 (蓝色到蓝色,黄色到黄色等)。

我的目标是设置它,以便当蓝色方块与蓝色方块或任何类似物碰撞时,它将.removeFromParent()。我该怎么做呢?如有必要,将发布代码。

编辑:

 enum BodyType: UInt32 {
case blueSquare = 1
case redSquare = 2
case yellowSquare = 4
case greenSquare = 8

}

 let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

      didBeginContact() {

          switch(contactMask) {
    case BodyType.redSquare.rawValue | BodyType.redSquare.rawValue:



        let scoreLabel = childNodeWithName("scores") as! Points
        scoreLabel.increment()
       let firstNode = contact.bodyB.node

        firstNode?.removeFromParent()
    default:
        return

      } 
       }

2 个答案:

答案 0 :(得分:3)

您应该做的第一件事是设置contactTestBitMasks&所有SKSpriteNodes上的categoryBitMasks,如下所示 -

struct PhysicsCatagory {
    static let FirstPerson : UInt32 = 0x1 << 1
    static let SecondPerson : UInt32 = 0x1 << 2
}

 override func didMoveToView(view: SKView) {
     ...
     firstPerson.SKPhysicsBody?.catagoryBitMask = PhysicsCatagory.FirstPerson
     firstPerson.SKPhysicsBody?.contactTestBitMask = PhysicsCatagory.SecondPerson
     ...
     secondPerson.SKPhysicsBody?.catagoryBitMask = PhysicsCatagory.SecondPerson
     secondPerson.SKPhysicsBody?.contactTestBitMask = PhysicsCatagory.FirstPerson
     ...

}

这只是设置catagoryBitMask和contactTestBitMask。 categoryBitMask将等于您当前正在编辑的对象,而contactTestBitMask将等于您希望对象与之碰撞的对象。

此外,在我们继续之前,我们希望将Contact Delegate添加到我们的场景中。

class GameScene: SKScene, SKPhysicsContactDelegate{...

然后将委托添加到我们的场景中 -

override func didMoveToView(view: SKView) {
      ...
       self.physicsWorld.contactDelegate = self
      ...

接下来,添加didBeginContact

func didBeginContact(contact: SKPhysicsContact) {
    let firstBody = contact.bodyA.node as! SKSpriteNode!
    let secondBody = contact.bodyB.node as! SKSpriteNode!
}

最后,测试......

func didBeginContact(contact: SKPhysicsContact) {
    let firstBody = contact.bodyA.node as! SKSpriteNode!
    let secondBody = contact.bodyB.node as! SKSpriteNode!

    if firstBody.color == secondBody.color{
     firstBody.removeFromParent()
     secondBody.removeFromParent()
}
}

希望有所帮助! :d

答案 1 :(得分:1)

一旦检测到碰撞,比较碰撞方块的颜色,如果相等,则调用.removeFromParent()。如果您发布代码,我可以尝试提供有用的特定方法。

如果你想获得幻想,你可以使用colorTag属性(1 =蓝色,2 =黄色等)为你的方块创建一个子类,然后比较碰撞方块的标签。虽然我怀疑比较颜色的成本是多少。