需要了解有关在SpriteKit中联系的ENUM

时间:2015-09-07 04:54:27

标签: swift enums sprite-kit

我试图联系,但它没有用。

我创建了一个枚举:

enum object:UInt32{
    case BB = 1
    case TR = 2
    case GAP = 3
}

然后我有3个节点:

balloon.physicsBody?.categoryBitMask = object.BB.rawValue
balloon.physicsBody?.contactTestBitMask = object.TR.rawValue
balloon.physicsBody?.collisionBitMask = object.GAP.rawValue

tree2.physicsBody?.categoryBitMask = object.TR.rawValue
tree2.physicsBody?.contactTestBitMask = object.BB.rawValue

gap.physicsBody?.categoryBitMask = object.GAP.rawValue
gap.physicsBody?.collisionBitMask = object.GAP.rawValue
gap.physicsBody?.contactTestBitMask = object.BB.rawValue

在DidBeginContact中:

let result = contact.bodyA.categoryBitMask + contact.bodyB.categoryBitMask

switch result{
    case object.BB.rawValue + object.TR.rawValue:
        xoaBB(contact.bodyA.node as! SKSpriteNode, TR: contact.bodyB.node as! SKSpriteNode, toaDo: contact.contactPoint)

    case object.BB.rawValue + object.GAP.rawValue:
        score++
        scorelabel.text = "\(score)"

    default:
        return
    }

问题是:

"case object.BB.rawValue + object.GAP.rawValue" didn't work 

我希望气球飞过差距得分但不能。气球只是接触间隙并卡在那里,如图所示。

enter image description here

任何人都可以帮助我,我真的需要"如何使用Enum教程"

1 个答案:

答案 0 :(得分:0)

正如我在评论中所提到的,你的位掩码值并没有多大意义。有点像这样的事情(我没有检查过拼写错误):

enum MaskType : UInt32 {
    case Balloon = 1
    case Gap = 2
    case Wall = 4
    case None = 0
}

然后你需要决定你追求的是什么。以下示例不会记录冲突,这意味着您希望在对象之间进行物理交互。

balloon.physicsBody?.categoryBitMask = MaskType.Balloon.rawValue
balloon.physicsBody?.collisionBitMask = MaskType.None.rawValue
balloon.physicsBody?.contactTestBitMask = MaskType.Gap.rawValue | MaskType.Wall.rawValue

气球精灵现在将注册具有.Gap或.Wall值作为其categoryBitMask的对象的联系人。

如果您现在正确设置了其他spriteNode的physicsBodies,您可以在didBeginContact函数中做一些不错的事情。也许是这样的:

func didBeginContact(contact: SKPhysicsContact) {
    let contactA = contact.bodyA
    let contactB = contact.bodyB

    func ballonHitType() -> Uint32 {
       if contactA.categoryBitMask == MaskType.Baloon.rawValue {
           return contactB.categoryBitMask
       } else {
           return contactA.categoryBitMask
       }
    }

    // Then simply perform your wanted actions based on whatever ballonHitType you receive
}