swift - 如何将实例方法连接到我的对象

标签 swift sprite-kit

大家好!

编写了为我生成播放器的代码:

class PlayerPlane: SKSpriteNode {


    static func populatePlayerPlane() -> SKSpriteNode {
        let playerPlane = SKSpriteNode(imageNamed: "airplane_1_14")
        playerPlane.position = CGPoint(x: 200, y: 200)
        playerPlane.zPosition = 50
        return playerPlane
    }

    func fireEnemies() {
        print("Attack")
    }
}

由于它是使用 SKSpriteNode 生成的,因此我无法附加方法 fireEnemies。现在我无法将其从 SKSpriteNode 转换为 PlayerPlane

当然,我可以使用PlayerPlane初始化程序以其他方式进行所有操作,但可能我错过了一些东西,并且还有其他更智能的解决方案可以将方法fireEmenies附加到PlayerPlane的实例

最佳答案

如果您需要 PlayerPlane 作为类,那么您可以这样做(因为 PlayerPlaneSKSpriteNode 的子类,您可以使用它是初始化器):

class PlayerPlane: SKSpriteNode {

    static func populatePlayerPlane() -> PlayerPlane {
        let playerPlane = PlayerPlane(imageNamed: "airplane_1_14")
        playerPlane.position = CGPoint(x: 200, y: 200)
        playerPlane.zPosition = 50
        return playerPlane
    }

    func fireEnemies() {
        print("Attack")
    }
}

但是您也可以使用协议(protocol)并为 SKSpriteNode 编写扩展,如果您想让其他对象/结构采用 PlayerPlane 功能,这会很方便:

protocol PlayerPlane {

    func fireEnemies()
}

extension SKSpriteNode : PlayerPlane {

    func fireEnemies() {
        print("Attack")
    }

}

extension SKSpriteNode {

    static func populatePlayerPlane() -> SKSpriteNode {
        let playerPlane = SKSpriteNode(imageNamed: "airplane_1_14")
        playerPlane.position = CGPoint(x: 200, y: 200)
        playerPlane.zPosition = 50
        return playerPlane
    }

}

最后,当您想要“其他”方式将 fireEnemies 功能附加到 PlayerPlane 时,您还可以为协议(protocol)编写扩展:

class PlayerPlane: SKSpriteNode {

    static func populatePlayerPlane() -> PlayerPlane {
        let playerPlane = PlayerPlane(imageNamed: "airplane_1_14")
        playerPlane.position = CGPoint(x: 200, y: 200)
        playerPlane.zPosition = 50
        return playerPlane
    }
}


protocol FireEnemies {
    func fireEnemies()
}

extension PlayerPlane : FireEnemies {
    func fireEnemies() {
        print("Attack")
    }
}

关于swift - 如何将实例方法连接到我的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43490282/

相关文章:

core-data - 如何在 Swift Int64 中使用 Core Data Integer 64?

ios - SKPhysicsBody 遏制测试?

swift - 如何为我的场景添加背景? SpriteKit swift 4

ios - Ios 中视频上的文本动画

ios - 删除/停止 dispatch_async iOS

ios - 在 SpriteKit 中使用 touchesMoved 旋转奖轮

ios - 更改 SKPhysicsBody 参数无效

ios - SKScene iPad 高度宽度反转

swift - Alamofire.swift completionHandler 调用中参数 #2 缺少参数

swift - 为什么这个函数给我一个 "Command Failed due to signal"错误?