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

时间:2015-08-04 14:31:23

标签: ios swift object sprite-kit collision

情况:我的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类似 - 我只想在更广泛的意义上问这个问题。

1 个答案:

答案 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

希望这有帮助。