情况:我的 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: <CGPosition>)
self.addChild(ship)
或者这只是一种错误的方法,还有更好的方法可以通过碰撞检测找出哪个具有某某统计数据的对象被子弹击中?
这个问题和我的另一个相似question - 我只想从更广泛的意义上问这个问题。
最佳答案
SKPhysicsBody
有一个属性node
,它是与主体关联的SKNode
。您只需要对您的 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
关联的节点。
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...
}
希望这对您有所帮助。
关于ios - 如何知道哪个 SKSpriteNode 受到 Swift 中碰撞检测的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31812108/