所以我想要做的就是一个能够在他开始时跳起来的球员,但是当他在空中时却没有。说实话,我不知道如何实现这个目标,因为我是这样的新手。
答案 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
您可以在isOnGround
和didBegin()
方法中设置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
}