情况:我的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
...
}
}
在这场比赛中#39;你可以在那些船上射击,一旦子弹击中一艘船,你就可以获得积分。 '击中一艘船'通过碰撞检测到。
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: <CGPosition>)
self.addChild(ship)
或者这只是一种错误的方法,并且有一种更好的方法可以找出具有统计数据的对象,因此通过碰撞检测被子弹击中?
这个问题与我的其他question类似 - 我只想在更广泛的意义上问这个问题。
答案 0 :(得分:8)
$http
有一个属性SKPhysicsBody
,它是与正文关联的node
。您只需要对SKNode
课程执行conditional cast
。
Ship
请注意, 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
希望这有帮助。