我正在使用Swift和SpriteKit制作我的第一个游戏,虽然我现在已经有一段时间正常工作,我最近发现了一个巨大的错误。我的碰撞可以是用户和敌人(太空船对抗外星人)用户射击敌人(激光对抗外星人)。后者工作正常,但最近当船接触外星人时碰撞检测还没有工作 - 通常外星人应该在接触时从场景中移除,以便只有一个生命(总共3个中的1个)已移除。然而,这艘船现在触摸了3-6点生命。这是代码,我假设问题出在:
这是一些接触函数之一,然后在常规接触方法中调用。
func alien_ship_contact(contact:SKPhysicsContact){
var alien:SKNode? = nil
if contact.bodyA.categoryBitMask == PhysicsCategory.Alien && contact.bodyB.categoryBitMask == PhysicsCategory.Ship{
alien = contact.bodyA.node
}
else if contact.bodyB.categoryBitMask == PhysicsCategory.Alien && contact.bodyA.categoryBitMask == PhysicsCategory.Ship{
alien = contact.bodyB.node
}
else{
return
}
killOffAlien((alien)!)
aliensKilled = aliensKilled + 1
shipLives = shipLives-1
aShip.lives = aShip.lives - 1
print("ship/alien contact")
}
以下是killOffAlien
功能:
func killOffAlien(alien:SKNode){
print("Kill off")
//alien.removeFromParent()
func stopMotion(){
alien.physicsBody?.categoryBitMask = 0
alien.physicsBody?.collisionBitMask = 0
alien.physicsBody?.contactTestBitMask = 0
alien.physicsBody?.dynamic = false
alien.physicsBody?.velocity = CGVector(dx:0, dy:0)
alien.removeActionForKey("facialMotion")
}
func removeAlien(){
alien.removeFromParent()
}
let stopMoving = SKAction.runBlock(stopMotion)
let fadeOut = SKAction.fadeOutWithDuration(1)
let removeFromParent = SKAction.runBlock(removeAlien)
let die = SKAction.sequence([stopMoving, fadeOut, removeFromParent])
alien.runAction(die)
}
以下是一般联系方式:
func didBeginContact(contact:SKPhysicsContact){
alien_laser_contact(contact)
alien_ship_contact(contact)
....
任何帮助都会很棒,我认为在初次接触时,外星人会将它的位掩码从Alien
引出,这样就可以防止未来的碰撞,因为每个外星人都应该只能移除从船上最多一次生命。