首页 文章

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

提问于
浏览
1

在Swift和SprieKit中创建游戏 .

我有2个节点,一个BridgeNode和WaterNode . 一个在另一个之上 .

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

当玩家节点跳转到Bridge时,DidBegin会检测到与Water和Bridge节点的联系 . 我只希望它能够检测到Bridge节点,因为玩家安全地在桥上或者玩家在水中 .

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")

    }
}

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

希望有人可以帮我检测一个或另一个 .

1 回答

  • 0

    你提到它是一个自上而下的游戏,所以当你在水面上有一座桥时,玩家显然会同时联系两者,桥下面没有物理体的"blocking" . 您需要在_1458661中执行以下操作:

    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
        }
    }
    

相关问题