在 Swift 中实例化从 SKSpriteNode 继承的基础 class

Instantiating a base class inheriting from SKSpriteNode in Swift

我正在尝试为我的第一个 iPhone 游戏编写一个通用的 Alien 'blueprint' class。这个 class 将包含一些属性和方法,这些属性和方法将被所有实际的外星子 class 继承。也就是说,Alien 真的不应该有纹理,也不应该有自己的一组定义值。

    //Generic alien type: a blue-print of sorts
    class Alien:SKSpriteNode{

        let velocityVector:CGVector
        let startPos:CGPoint

        init(texture:SKTexture, startPosition startPos:CGPoint,moveSpeed: CGFloat,velocityVector:CGVector){
            super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())

            self.velocityVector = normalizeVector(velocityVector)
            self.position = position
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }

每次我尝试设置它时,我 运行 都会遇到一些错误,例如:

"Use of instance member 'normalizeVector' on type GameScene; did you mean to use a value of type GameScene instead?" 

normalizeVector 是一个写在 Alien class 之上的函数(在 GameScene 中)。我不确定这是什么意思,因为这是 GameScene 中的一个正常功能。如果我删除这个位,我仍然收到错误:

"Property self.velocityVector is not initialized at super.init call"

我很困惑,因为我认为 super.init() 只是必要的,因为我正在制作 SKSpriteNode 的 subclass 而它不需要 subclass 传递给它的特定属性。

最后,有没有办法在没有实际纹理的情况下调用 super.init(),因为这个蓝图 class 永远不会是 "displayed"? 在 classes/initialization 上浏览了 Apples 文档后,我仍然卡住了。任何帮助都会很棒,谢谢。

您将 velocityVector 声明为非可选 属性 因此,如果您不在初始化程序中填充它,当然会出现编译器错误。

这就是为什么当您注释这一行时会出现编译错误。

self.velocityVector = normalizeVector(velocityVector)

您有几个问题,首先,如错误消息所述,您需要在调用 super.init 之前初始化所有变量:

init(texture:SKTexture, startPosition startPos:CGPoint,moveSpeed: CGFloat,velocityVector:CGVector){
    self.velocityVector = Alien.normalizeVector(velocityVector)
    self.startPos = startPos

    super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())

    self.position = position
}

其次,听起来您是在子类或其他地方定义 normalizeVector?我所做的是将它定义为一个静态方法(因为它是在初始化之前使用的,所以它不能是一个实例方法)然后你可以在init方法中使用它。把它们放在一起看起来像:

class Alien:SKSpriteNode {
    static func normalizeVector(vector:CGVector) -> CGVector {
        let len = sqrt(vector.dx * vector.dx + vector.dy * vector.dy)

        return CGVector(dx:vector.dx / len, dy:vector.dy / len)
    }

    let velocityVector:CGVector
    let startPos:CGPoint

    init(texture:SKTexture, startPosition startPos:CGPoint,moveSpeed: CGFloat,velocityVector:CGVector){
        self.velocityVector = Alien.normalizeVector(velocityVector)
        self.startPos = startPos

        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())

        self.position = position
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}