如何知道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... }
希望这可以帮助。