【问题标题】:player SKPhysicsBody passes through other SKPhysicsBody swift 4 Xcode 9播放器 SKPhysicsBody 通过其他 SKPhysicsBody swift 4 Xcode 9
【发布时间】:2026-02-15 23:45:01
【问题描述】:

我正在按照 swift 3 游戏开发一书中的说明创建一个简单的轻击翻盖游戏。 我有两个 SKSpriteNode,一个是玩家,另一个是静态对象,如果接触到玩家,会伤害到玩家。

对玩家的伤害将通过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
}

【问题讨论】:

    标签: ios swift xcode skphysicsbody


    【解决方案1】:

    应该发生碰撞的两个节点之一需要动态的才能发生碰撞。你不能让它们都是静态的。

    【讨论】:

    • 英雄默认设置为isDynamic = true。我刚刚尝试将这一行添加到 hero init() 以防万一,结果是一样的。
    • 您可以将 PhysicsCategory-enum 添加到答案中吗?这可能会有所帮助。