我使用SpriteKit和Swift构建iPhone游戏,我的碰撞检测系统无法正常运行。当我的"子弹"物理机构和我的"播放器"物理体碰撞,碰撞检测功能被多次调用,通常为4-12次。我试过设置" usesPreciseCollisionDetection"是真的,但仍然存在问题。此外,当子弹以一定角度而不是直接击中玩家时,似乎更多次调用该方法。有任何想法如何解决这个问题?
碰撞类型:
enum ColliderType:UInt32 {
case Player = 0b1
case Bullet = 0b10
}
玩家物理身体设置:
playerBody!.categoryBitMask = ColliderType.Player.rawValue
playerBody!.contactTestBitMask = ColliderType.Bullet.rawValue
playerBody!.collisionBitMask = ColliderType.Bullet.rawValue
Bullet Physics Body Settings:
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)
}
答案 0 :(得分:1)
为您的项目符号节点命名:
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()
}
祝你好运!