在另一个节点上的节点,都带有物理体,只想检测大多数顶级物理体-SpriteKit / Swift



在Swift and Spriekit中创建游戏。

我有2个节点,一个bridgenode和水节。一个在另一个上。

都有物理机构可以检测玩家何时在水中的桥上。两个节点作为场景的子节点独立添加。

当玩家节点跳到桥上时,didBegin检测到与水和桥梁节点。我只希望它检测到桥节点,因为玩家安全在桥上或玩家在水中。

func didBegin(_ contact: SKPhysicsContact) {
       // Did Begin Contact - Contact Testing and actions
       let player1 = (contact.bodyA.categoryBitMask == player1Mask) ? contact.bodyA : contact.bodyB
       let other = (player1 == contact.bodyA) ? contact.bodyB : contact.bodyA
    if other.categoryBitMask == bridgeMask {
        print("BRIDGE CONTACT")
    }
    else if other.categoryBitMask == waterMask {
        // Contacted Water
        print("WATER CONTACT")
    }
}

控制台始终以随机顺序打印两个打印语句。

希望有人可以帮助我发现一个或另一个。

您提到这是一款自上而下的游戏,因此,当您在水上上桥上的桥梁时,玩家显然会同时与两个接触,在桥下下面没有物理体的"阻塞"。您需要在 SKPhysicsContactDelegate中做

var playerIsOnBridge = false
func didBegin(_ contact: SKPhysicsContact) {
    let player1 = (contact.bodyA.categoryBitMask == player1Mask) ? contact.bodyA : contact.bodyB
    let other = (player1 == contact.bodyA) ? contact.bodyB : contact.bodyA
    if other.categoryBitMask == bridgeMask || playerIsOnBridge {
        playerIsOnBridge = true
        print("BRIDGE CONTACT")
    } else if other.categoryBitMask == waterMask {
        print("WATER CONTACT")
    }
}
func didEnd(_ contact: SKPhysicsContact) {
    let bitmaskA = contact.bodyA.categoryBitMask
    let bitmaskB = contact.bodyB.categoryBitMask
    if bitmaskA == bridgeMask || bitmaskB == bridgeMask {
        playerIsOnBridge = false
    }
}

最新更新