Swift 多次注册 SpriteKit 碰撞
Swift SpriteKit Collisions Registered Multiple Times
我正在使用 SpriteKit 和 Swift 构建一个 iPhone 游戏,但我的碰撞检测系统无法正常运行。当我的 "bullet" 物理 body 和我的 "player" 物理 body 发生碰撞时,碰撞检测函数被调用多次,通常是 4-12 次。我试过将 "usesPreciseCollisionDetection" 设置为 true,但它仍然存在问题。此外,当子弹以一定角度而不是直接击中玩家时,该方法似乎被调用了更多次。有什么想法可以解决这个问题吗?
碰撞类型:
enum ColliderType:UInt32 {
case Player = 0b1
case Bullet = 0b10
}
玩家物理Body设置:
playerBody!.categoryBitMask = ColliderType.Player.rawValue
playerBody!.contactTestBitMask = ColliderType.Bullet.rawValue
playerBody!.collisionBitMask = ColliderType.Bullet.rawValue
子弹物理Body设置:
bulletBody!.categoryBitMask = ColliderType.Bullet.rawValue
bulletBody!.contactTestBitMask = ColliderType.Player.rawValue
bulletBody!.collisionBitMask = ColliderType.Player.rawValue
碰撞检测方法:
func didBeginContact(contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == 0b1) && (contact.bodyB.categoryBitMask == 0b10) {
playerVbullet(contact.bodyA, bullet: contact.bodyB)
}
if (contact.bodyA.categoryBitMask == 0b10) && (contact.bodyB.categoryBitMask == 0b11) {
playerVbullet(contact.bodyB, bullet: contact.bodyA)
}
}
碰撞时调用的函数:
func playerVbullet(player:SKPhysicsBody, bullet:SKPhysicsBody) {
bullet.node?.removeFromParent()
collisions++
println(collisions)
}
为项目符号节点命名:
let bullet = SKSPriteNode()
bullet.name = "bullet"
然后检查你的物理接触
if (contact.bodyA.node?.name == "bullet") {
contact.bodyA.node?.removeFromParent()
} else if contact.bodyB.node?.name == "bullet" {
contact.bodyB.node?.removeFromParent()
}
祝你好运!
我正在使用 SpriteKit 和 Swift 构建一个 iPhone 游戏,但我的碰撞检测系统无法正常运行。当我的 "bullet" 物理 body 和我的 "player" 物理 body 发生碰撞时,碰撞检测函数被调用多次,通常是 4-12 次。我试过将 "usesPreciseCollisionDetection" 设置为 true,但它仍然存在问题。此外,当子弹以一定角度而不是直接击中玩家时,该方法似乎被调用了更多次。有什么想法可以解决这个问题吗?
碰撞类型:
enum ColliderType:UInt32 {
case Player = 0b1
case Bullet = 0b10
}
玩家物理Body设置:
playerBody!.categoryBitMask = ColliderType.Player.rawValue
playerBody!.contactTestBitMask = ColliderType.Bullet.rawValue
playerBody!.collisionBitMask = ColliderType.Bullet.rawValue
子弹物理Body设置:
bulletBody!.categoryBitMask = ColliderType.Bullet.rawValue
bulletBody!.contactTestBitMask = ColliderType.Player.rawValue
bulletBody!.collisionBitMask = ColliderType.Player.rawValue
碰撞检测方法:
func didBeginContact(contact: SKPhysicsContact) {
if (contact.bodyA.categoryBitMask == 0b1) && (contact.bodyB.categoryBitMask == 0b10) {
playerVbullet(contact.bodyA, bullet: contact.bodyB)
}
if (contact.bodyA.categoryBitMask == 0b10) && (contact.bodyB.categoryBitMask == 0b11) {
playerVbullet(contact.bodyB, bullet: contact.bodyA)
}
}
碰撞时调用的函数:
func playerVbullet(player:SKPhysicsBody, bullet:SKPhysicsBody) {
bullet.node?.removeFromParent()
collisions++
println(collisions)
}
为项目符号节点命名:
let bullet = SKSPriteNode()
bullet.name = "bullet"
然后检查你的物理接触
if (contact.bodyA.node?.name == "bullet") {
contact.bodyA.node?.removeFromParent()
} else if contact.bodyB.node?.name == "bullet" {
contact.bodyB.node?.removeFromParent()
}
祝你好运!