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

Swift 检测两种相同颜色的碰撞 我在我的场景中间有一个由四种不同颜色组成的正方形。同时,我有较小的相同颜色的方块,从场景的每一个侧面随机生成,意图与中间的正方形相撞。(蓝色到蓝色、黄色到黄色等),swift,sprite-kit,collision-detection,Swift,Sprite Kit,Collision Detection,我的目标是将其设置为当蓝色方块与蓝色方块或任何类似物体碰撞时,它将.removeFromParent()。我该怎么做呢?如有必要,我们将发布代码 编辑: } 检测到碰撞后,比较碰撞方块的颜色,如果相等,则调用.removeFromParent()。如果你发布代码,我可以试着给出一些有帮助的具体方法 如果你想变得有趣,你可以为你的方块创建一个带有colorTag属性(1=蓝色,2=黄色等)的子类,然后比较碰撞方块的标签。尽管我怀疑比较颜色的成本太高。一旦检测到碰撞,请比较碰撞方块的颜色,如果相等,

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

编辑:

}


检测到碰撞后,比较碰撞方块的颜色,如果相等,则调用.removeFromParent()。如果你发布代码,我可以试着给出一些有帮助的具体方法


如果你想变得有趣,你可以为你的方块创建一个带有colorTag属性(1=蓝色,2=黄色等)的子类,然后比较碰撞方块的标签。尽管我怀疑比较颜色的成本太高。

一旦检测到碰撞,请比较碰撞方块的颜色,如果相等,请调用.removeFromParent()。如果你发布代码,我可以试着给出一些有帮助的具体方法


如果你想变得有趣,你可以为你的方块创建一个带有colorTag属性(1=蓝色,2=黄色等)的子类,然后比较碰撞方块的标签。尽管我怀疑比较颜色的成本太高。

您应该做的第一件事是在您的所有SKSpriteNodes上设置contactTestBitMasks&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
     ...

}
然后将代理添加到场景中-

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

您应该做的第一件事是在所有的SkspriteNode上设置contactTestBitMasks&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
     ...

}
然后将代理添加到场景中-

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根据请求编辑。我还为每个节点设置了
categoryBitMask、collisionBitMask和contactTestBitMask
。比较颜色的成本实际上与比较标签的成本相同,颜色值存储为Int32(或者是UInt32)|运算符是按位逻辑的,因此BodyType.redSquare.rawValue | BodyType.redSquare.rawValue与BodyType.redSquare.rawValue相同。例如,0001 | 0001=0001放入一些调试打印语句,看看这些值是否符合预期。switch语句中的事例应该是事例1://蓝色碰撞事例2://红色碰撞事例4://黄色碰撞事例8://绿色碰撞按请求编辑。我还为每个节点设置了
categoryBitMask、collisionBitMask和contactTestBitMask
。比较颜色的成本实际上与比较标签的成本相同,颜色值存储为Int32(或者是UInt32)|运算符是按位逻辑的,因此BodyType.redSquare.rawValue | BodyType.redSquare.rawValue与BodyType.redSquare.rawValue相同。例如,0001 | 0001=0001放入一些调试打印语句,看看这些值是否符合预期。switch语句中的案例应该是案例1://蓝色冲突案例2://红色冲突案例4://黄色冲突案例8://绿色冲突我必须说,有趣的是,您选择了这样一个开关,我想我还没有看到任何sprite工具包的教程以这种方式列出它,唯一的缺陷是,如果你的联系人身体在onceIm使用2个面具,使用Ray Wenderlich的儿童精灵工具包教程来尝试简化它。我必须说,有趣的是,你选择了这样的开关,我想我没有看到任何精灵工具包教程以这种方式列出它,唯一的缺陷是,如果你的联系人身体在onceIm使用2个面具,并使用Ray Wenderlichs Sprite Kit for Kids教程来尝试和过度简化它会怎么样。3件事,A)你需要修复第二人称bitmaks,B)你不处理两个具有相同颜色的项目可能发生碰撞但不想移除的情况,C)仅当颜色为蓝色时才会删除,只需设置
firstBody.color
==
secondBody.color
@Knight0fDragon谢谢!编辑了一些东西。我得再仔细研究一下B。:)3件事,A)您需要修复第二个人的bitmaks,B)您不需要处理两个具有相同颜色的项目可能会发生碰撞但不希望删除的情况,C)这只会在颜色为蓝色时删除,只需设置
firstBody.color
=
secondBody.color
@Knight0fDragon谢谢!编辑了一些东西。我得再仔细研究一下B。:)