Swift: 运行 收集物品后的功能

Swift: Run function after collecting item

我有一个 class 可以创建收藏品:

class CollectableCreate {

    var collectable = SKSpriteNode()
    var type = String()

    var onCollect : () -> Void = {}

    init(type: String, position: CGPoint, text: String = "This collectable uses no text!", onCollect : () -> Void) {

        self.type = type.lowercaseString

        switch self.type {

            default:
                collectable.size = CGSize(width: 1, height: 200)
                collectable.color = SKColor.blueColor()
                collectable.physicsBody = SKPhysicsBody(rectangleOfSize: collectable.size)
                break
        }

        collectable.position = position

        collectable.name = self.type
        collectable.physicsBody?.categoryBitMask = PhysicsCategory.Collectable
        collectable.physicsBody?.collisionBitMask = PhysicsCategory.Player
        collectable.physicsBody?.contactTestBitMask = PhysicsCategory.Player


        self.onCollect = onCollect
    }


    func chatBoxActivate() -> SKSpriteNode {
        collectable.physicsBody?.dynamic = false
        collectable.physicsBody?.affectedByGravity = false
        return collectable
    }

    func collect() {
        self.onCollect()
    }

}

我这样创建收藏品:

let d = CollectableCreate(type: "chatbox", position: CGPoint(x: 500, y: 100), onCollect: {
        self.createChatBox("test blalb|blablalba")
    })

self.addChild(d.chatBoxActivate())

在 didBeginContact 上我有这个:

if (firstBody.categoryBitMask == PhysicsCategory.Collectable || secondBody.categoryBitMask == PhysicsCategory.Collectable) {

    let collectableBody = (firstBody.categoryBitMask == PhysicsCategory.Collectable ? firstBody.node : secondBody.node)
    //collectableBody.collect() <---                
    collectableBody?.removeFromParent()

}

我想运行 CollectableCreate().collect() 函数当我 运行 变成一个收藏品。我该如何做到这一点?

恐怕我是在黑暗中拍摄,因为我从未使用过 SpriteKit,所以请随时添加 to/or 编辑我的答案。

你应该subclass SKSpriteNode:

class Collectable : SKSpriteNode {

    var type: String?
    var onCollect: (() -> ())?

    convenience init(type: String, position: CGPoint, text: String = "This collectable uses no text!", onCollect : () -> Void) {
        self.init()

        self.type = type.lowercaseString

        switch self.type {

        default:
            self.size = CGSize(width: 1, height: 200)
            self.color = SKColor.blueColor()
            self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size)
            break
        }

        self.position = position

        self.name = self.type
        self.physicsBody?.categoryBitMask = PhysicsCategory.Collectable
        self.physicsBody?.collisionBitMask = PhysicsCategory.Player
        self.physicsBody?.contactTestBitMask = PhysicsCategory.Player


        self.onCollect = onCollect
    }

    func chatBoxActivate() -> SKSpriteNode {
        self.physicsBody?.dynamic = false
        self.physicsBody?.affectedByGravity = false

        return self
    }

    func collect(){
        self.onCollect?()
    }
}

并在接下来的事情中使用它,并在控制器中添加任何 class 子classing,并添加正确的委托:

class SomeClass {

    func someFunc(){

        let collectable = Collectable(type: "chatbox", position: CGPoint(x: 500, y: 100), onCollect: {
            self.createChatBox("FooBar")
        })

        self.addChild(collectable.chatBoxActivate())
    }

    func didBeginContact(contact: SKPhysicsContact){

        let firstBody = contact.bodyA
        let secondBody = contact.bodyB

        if (firstBody.categoryBitMask == PhysicsCategory.Collectable || secondBody.categoryBitMask == PhysicsCategory.Collectable) {

            let collectableBody = firstBody.categoryBitMask == PhysicsCategory.Collectable ? firstBody.node : secondBody.node

            if let collectable = collectableBody as? Collectable {
                collectable.collect()
            }

            collectableBody?.removeFromParent()

        }

    }

    func addChild(collectable: SKSpriteNode){
        // Some logic
    }

    func createChatBox(text: String) {
        // Some logic
    }

}

希望这能为您指明正确的方向!

SpriteKit Docs