如何知道Swift中的碰撞检测会影响哪个SKSpriteNode?

情况:我的iOS屏幕上有两艘或更多船。 两者都有不同的属性,如名称,大小,生命值和得分。 它们显示为SKSpriteNodes ,每个都添加了一个physicsBody

目前,这些额外属性是扩展SKSpriteNode类的变量。

 import SpriteKit class ship: SKSpriteNode { var hitpoints: Int = nil? var score: Int = nil? func createPhysicsBody(){ self.physicsBody = SKPhysicsBody(circleOfRadius: self.size.width / 2) self.physicsBody?.dynamic = true ... } } 

在这个“游戏”中,你可以向那些船射击,一旦子弹击中一艘船,你就可以获得积分。 通过碰撞检测到“击中船”。

 func didBeginContact(contact: SKPhysicsContact){ switch(contact.bodyA.categoryBitMask + contact.bodyB.categoryBitMask){ case shipCategory + bulletCategory: contactShipBullet(contact.bodyA, bodyB: contact.bodyB) break; default: break; } } 

问题:碰撞检测只返回一个physicsBody,我不知道如何通过这个physicsBody得到我的扩展SKSpriteNode类。

思考:扩展SKSpriteNode以使我的物体像船一样生命,这是一种正确的方法吗? 当我将一艘船添加到我的屏幕时,它看起来像:

 var ship = Ship(ship(hitpoints: 1, score: 100), position: ) self.addChild(ship) 

或者这只是一个错误的方法,有一个更好的方法来找出具有统计数据的对象,所以通过碰撞检测被子弹击中?

这个问题与我的另一个问题相似 – 我只想在更广泛的意义上问这个问题 。

SKPhysicsBody有一个属性node ,它是与SKNode相关联的SKNode 。 您只需要对Ship类执行conditional cast转换。

  if let ship = contact.bodyA.node as? Ship { // here you have your ship object of type Ship print("Score of this ship is: \(ship.score)!!!") } 

请注意, Ship节点可以是与bodyB关联的节点。

  if let ship = contact.bodyA.node as? Ship { // here you have your ship... } else if let ship = contact.bodyB.node as? Ship { // here you have your ship... } 

希望这可以帮助。