Swift / SpriteKit - 碰撞和对象

时间:2015-04-09 06:37:12

标签: swift sprite-kit collision-detection skphysicsbody skphysicscontact

我有一个名为Item的类,里面有一个名为itemNode的实例变量,它的类型为SKSpriteNode。在我的GameScene类中,当我创建Item的实例时,我创建一个物理主体,该物理主体被赋予Item的itemNode。在我的碰撞检测系统中,当我的角色的物理体与itemNode的物理体发生碰撞时,我想在Item对象上预先形成一个函数,该对象的节点的物理体刚碰撞。但是,碰撞系统只返回物理体。如何仅在给定节点的物理主体的情况下访问Item对象?

1 个答案:

答案 0 :(得分:2)

SKPhyicsBody类有一个node property,它指向它所附加的SKNode实例。

您的碰撞检测代码可能如下所示:

func didBeginContact(contact: SKPhysicsContact) {

    var item: SKSpriteNode
    var character: SKSpriteNode

    //Change this on the basis of the order of your categoryBitMask values
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        item = contact.bodyA.node as SKSpriteNode
        character = contact.bodyB.node as SKSpriteNode
    }
    else
    {
        item = contact.bodyB.node as SKSpriteNode
        character = contact.bodyA.node as SKSpriteNode
    }

    //Perform necessary operations on item and character
}

修改 为了访问声明节点的Item实例,您必须在节点中存储一个指向Item实例的变量。为此,您可以子类化SKSpriteNode并包含属性,或使用userData SKNode的财产

子类:

//New Class
class ItemNode: SKSpriteNode {

    static var itemInstance
}

//In the Item class declare the itemNode using this class
let itemNode = ItemNode()
itemNode.itemInstance = self

UserData属性:

item.userData = NSMutableDictionary(object: self, forKey: "ItemInstance"))