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