1

在 Swift 和 SprieKit 中创建游戏。

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

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

当玩家节点跳到桥上时,DidBegin 检测到与水和桥节点的接触。我只希望它检测到 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")

    }
}

控制台总是以随机顺序打印两个打印语句。

希望有人可以帮助我检测其中一个。

4

1 回答 1

0

你提到这是一个自上而下的游戏,所以当你把桥放在水面上时,玩家显然会同时接触到两者,桥下的物理体没有“阻挡”。你需要在你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
    }
}
于 2017-02-27T05:33:51.440 回答