Jur*_*rik 5 object collision ios sprite-kit swift
情况:我的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
...
}
}
Run Code Online (Sandbox Code Playgroud)
在这个"游戏"中,你可以在那些船上射击,一旦子弹击中一艘船,你就可以获得积分.通过碰撞检测到"击中船".
func didBeginContact(contact: SKPhysicsContact){
switch(contact.bodyA.categoryBitMask + contact.bodyB.categoryBitMask){
case shipCategory + bulletCategory:
contactShipBullet(contact.bodyA, bodyB: contact.bodyB)
break;
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:碰撞检测只返回一个physicsBody,我不知道如何SKSpriteNode通过这个physicsBody 来获取我的扩展类.
思考:这是一种正确的方法来延伸SKSpriteNode让我的物体像船一样生命吗?当我将一艘船添加到我的屏幕时,它看起来像:
var ship = Ship(ship(hitpoints: 1, score: 100), position: <CGPosition>)
self.addChild(ship)
Run Code Online (Sandbox Code Playgroud)
或者这只是一个错误的方法,有一个更好的方法来找出具有统计数据的对象,所以通过碰撞检测被子弹击中?
该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)!!!")
}
Run Code Online (Sandbox Code Playgroud)
请注意,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...
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.