首页 文章

Swift / SpriteKit - 碰撞和对象

提问于
浏览
2

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

1 回答

  • 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
    }
    

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

    子类:

    //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"))
    

相关问题