【发布时间】:2017-01-19 05:24:32
【问题描述】:
所以我想做的是一个当他在地上时能够跳跃但当他在空中时却不能跳跃的球员。老实说,我不知道如何做到这一点,因为我是新手。
【问题讨论】:
标签: swift xcode sprite-kit
所以我想做的是一个当他在地上时能够跳跃但当他在空中时却不能跳跃的球员。老实说,我不知道如何做到这一点,因为我是新手。
【问题讨论】:
标签: swift xcode sprite-kit
我会在播放器类中有一个实例变量,例如var isOnGround: Bool = true。然后我会使用SKPhysicsBody 为玩家和地面设置一个物理体。然后检查玩家和地面的didBegin(...) 和didEnd(...)(联系方式)中的碰撞。在didBegin(...) 中将isOnGround 变量设置为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
您将在didBegin() 和didEnd() 方法中设置isOnGround 变量,如下所示:
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
}
【讨论】: