我正在按照swift 3游戏开发手册的指示创建一个简单的拍打游戏。
我有两个SKSpriteNodes,一个是播放器,另一个是静态对象,如果接触会伤及播放器。

玩家的损坏将通过categoryBitMask的自定义接触逻辑来实现。问题是当我设置静态对象的categoryBitMask时,当播放器与静态对象接触时,会触发自定义逻辑,但播放器现在会在静态对象中移动。

这是播放器和静态对象的init()函数

静态物体

    init() {
    super.init(texture: nil, color: .clear, size: initialSize)
    createAnimations()
    self.run(spinAnimation)
    let startTexture = textureAtlas.textureNamed("blade")
    self.physicsBody = SKPhysicsBody(texture: startTexture, size:   initialSize)
    self.physicsBody?.affectedByGravity = false
    self.physicsBody?.isDynamic = false
    self.physicsBody?.categoryBitMask = PhysicsCategory.enemy.rawValue
    self.physicsBody?.collisionBitMask = ~PhysicsCategory.heroDamage.rawValue
    self.zPosition = -9
  }


播放器

    init() {
    super.init(texture: nil, color: .clear, size: initialSize)
    let textureBody = textureAtlas.textureNamed("pierre-flying-3")
    self.physicsBody = SKPhysicsBody(texture: textureBody, size: self.size)
    self.physicsBody?.linearDamping = 0.9
    self.physicsBody?.mass = 30
    self.physicsBody?.allowsRotation = false
    self.zPosition = 1
    createAnimations()
    self.run(soarAnimation, withKey: "soarAnimation")
    self.physicsBody?.categoryBitMask = PhysicsCategory.hero.rawValue
    self.physicsBody?.contactTestBitMask = PhysicsCategory.ground.rawValue |
                                           PhysicsCategory.enemy.rawValue |
                                           PhysicsCategory.coin.rawValue |
                                           PhysicsCategory.powerUp.rawValue
    self.physicsBody?.collisionBitMask = PhysicsCategory.ground.rawValue
}


如果删除isDynamic = false条件,则可以,但是该对象不再是静态的。我尝试增加对象的质量并删除isDynamic = false。但是出于某些奇怪的原因,这与仅包含IsDynamic = false语句具有相同的效果。

有什么帮助吗?谢谢

编辑
categoryBitMask值的枚举

enum PhysicsCategory:UInt32 {
case hero = 1
case heroDamage = 2
case ground = 4
case enemy = 8
case coin = 16
case powerUp = 32
}

最佳答案

应该发生碰撞的两个节点之一必须是动态的,以便发生碰撞。您不能将它们全部静态化。

10-07 19:54