【问题标题】:Ios swift - Make difference between Contacts with categoryBitMaskIos swift - 使用 categoryBitMask 区分联系人
【发布时间】:2026-01-30 03:30:02
【问题描述】:

我的联系功能有问题。

我的游戏包括摧毁两种不同颜色的气球:蓝色和黄色

目前我的游戏运行良好,但我想区分颜色以计算我爆炸了多少蓝色或黄色气球。

我初始化了尽可能多的 categoryBitMask,因为我有颜色和我的 projectil categoryBitMask:

let blueCategory:UInt32 = 0x1 << 1       //color category
let yellowCategory:UInt32 = 0x1 << 1

let balloonCategory:UInt32 = 0x1 << 1     // general balloons category

let flechetteCategory:UInt32 = 0x1 << 0   // dart category

气球定义:

func addBalloonbl(){


var balloonbl:SKSpriteNode = SKSpriteNode (imageNamed: "ballonbleu.png")


balloonbl.physicsBody = SKPhysicsBody (circleOfRadius: balloonbl.size.width/2)
balloonbl.physicsBody.dynamic = true
balloonbl.physicsBody.mass = 1
balloonbl.physicsBody.restitution = 1


balloonbl.physicsBody.categoryBitMask = balloonCategory | blueCategory
balloonbl.physicsBody.contactTestBitMask = flechetteCategory
balloonbl.physicsBody.collisionBitMask = balloonCategory





let minX = balloonbl.size.width/2
let maxX = self.frame.size.width - balloonbl.size.width/2
let rangeX = maxX - minX
let position:CGFloat = CGFloat(arc4random()) % CGFloat(rangeX) + CGFloat(minX)

balloonbl.position = CGPointMake(position, self.frame.size.height+balloonbl.size.height)

self.addChild(balloonbl)


}





func addBalloonj(){       



    var balloonj:SKSpriteNode = SKSpriteNode (imageNamed: "ballonjaune.png")

    balloonj.physicsBody = SKPhysicsBody (circleOfRadius: balloonj.size.width/2)
    balloonj.physicsBody.dynamic = true
    balloonj.physicsBody.mass = 1
    balloonj.physicsBody.restitution = 1

    balloonj.physicsBody.categoryBitMask = balloonCategory | yellowCategory
    balloonj.physicsBody.contactTestBitMask = flechetteCategory
    balloonj.physicsBody.collisionBitMask = balloonCategory


    let minX = balloonj.size.width/2
    let maxX = self.frame.size.width - balloonj.size.width/2
    let rangeX = maxX - minX
    let position:CGFloat = CGFloat(arc4random()) % CGFloat(rangeX) + CGFloat(minX)            
    balloonj.position = CGPointMake(position, self.frame.size.height+balloonj.size.height)

    self.addChild(balloonj)

}

我的联系方式:

func didBeginContact(contact: SKPhysicsContact!)
{

    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {

        firstBody = contact.bodyA
        secondBody = contact.bodyB         

    }
    else
    {

        firstBody = contact.bodyB
        secondBody = contact.bodyA

    }

    if ((firstBody.categoryBitMask & flechetteCategory) != 0 && (secondBody.categoryBitMask & blueCategory) != 0)
    {
       flecheDidCollideWithBlueBalloon(firstBody.node as SKSpriteNode, balloon: secondBody.node as SKSpriteNode)

    }

    else if ((firstBody.categoryBitMask & flechetteCategory) != 0 && (secondBody.categoryBitMask & yellowCategory) !=0)
    {
        flecheDidCollideWithYellowBalloon(firstBody.node as SKSpriteNode, balloon: secondBody.node as SKSpriteNode)

    }
}


func flecheDidCollideWithBlueBalloon (fleche: SKSpriteNode, balloon: SKSpriteNode)
    {

    self.runAction(SKAction.playSoundFileNamed("eclate.mp3", waitForCompletion: false))


    println("blue")


    fleche.removeFromParent()

    balloon.removeFromParent()



    balloonDestroyed++


    }


func flecheDidCollideWithBYellowBalloon (fleche: SKSpriteNode, balloon: SKSpriteNode)

   {     

    self.runAction(SKAction.playSoundFileNamed("eclate.mp3", waitForCompletion: false))


    println("Yellow")


    fleche.removeFromParent()       

    balloon.removeFromParent()


    balloonDestroyed++


  }

使用此代码,我可以销毁两种气球颜色,但是当我销毁黄色时,调用 flecheDidCollideWithBlueBalloon 函数而不是 flecheDidCollideWithYellowBalloon。 “蓝色”张贴在控制台显示屏上...

有什么想法吗?

非常感谢!!

【问题讨论】:

    标签: ios iphone ipad swift


    【解决方案1】:

    您的一些类别变量具有相同的值:

    let blueCategory:UInt32 = 0x1 << 1       //color category
    let yellowCategory:UInt32 = 0x1 << 1
    let balloonCategory:UInt32 = 0x1 << 1     // general balloons category
    

    由于您将其中一些标志组合在同一个位掩码变量中,它们相互冲突。

    它们需要有不同的值:

    let blueCategory:UInt32 = 0x1 << 1       //color category
    let yellowCategory:UInt32 = 0x1 << 2
    let balloonCategory:UInt32 = 0x1 << 3     // general balloons category
    

    【讨论】: