如何检查SpriteNode是否接触到另一个SpriteNote?

时间:2017-01-18 20:17:01

标签: swift xcode sprite-kit

所以我想要做的就是一个能够在他开始时跳起来的球员,但是当他在空中时却没有。说实话,我不知道如何实现这个目标,因为我是这样的新手。

1 个答案:

答案 0 :(得分:3)

我会在播放器类中有一个像var isOnGround: Bool = true一样的实例变量。然后我会使用SKPhysicsBody为玩家和地面建立一个物理身体。然后检查播放器和地面的didBegin(...)didEnd(...)(联系方式)中的碰撞。在isOnGround中将didBegin(...)变量设置为true,并在didEnd(...)方法中将其设置为false。

以下是不同位掩码属性的示例:

let playerCollisionNumber: UInt32 = 0x1 << 0
let groundCollisionNumber: UInt32 = 0x1 << 1

//node's own collision number
player.physicsBody.categoryBitMask = playerCollisionNumber 

//makes the player's physics body interact/collide with the ground's physics body
player.physicsBody.collisionBitMask = groundCollisionNumber 

//setting this allows you to be able to interject your own code when the player's physics body and the ground's physics body interact (in the didBegin and didEnd methods)
player.physicsBody.contactTestBitMask = groundCollisionNumber 

然后为地面做同样的事情:

groundNode.physicsBody.categoryBitMask = groundCollisionNumber
groundNode.physicsBody.collisionBitMask = playerCollisionNumber
groundNode.physicsBody.categoryBitMask = playerCollisionNumber

您可以在isOnGrounddidBegin()方法中设置didEnd()变量,如下所示:

let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

//in didBegin()
if contactMask == (playerCollisionNumber | groundCollisionNumber) {
    player.isOnGround = true
}

//in didEnd()
if contactMask == (playerCollisionNumber | groundCollisionNumber) {
    player.isOnGround = false
}