实例化从Swift中的SKSpriteNode继承的基类

时间:2016-07-19 22:58:36

标签: swift inheritance sprite-kit instantiation skspritenode

我正在尝试为我的第一款iPhone游戏写一个通用的Alien'蓝图'课程。该类将包含一些属性和方法,这些属性和方法将由所有实际的外来子类继承。也就是说,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类之上的函数(在GameScene中)。我不确定这意味着什么,因为这是GameScene中的正常功能。如果我删除这个位,我仍然会收到错误:

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

我很困惑,因为我认为super.init()只是必要的,因为我正在创建SKSpriteNode的子类,并且不需要将子类特定的属性传递给它。

最后,有没有办法在没有实际纹理的情况下调用super.init(),因为这个蓝图类不会被“显示”? 在查看关于类/初始化的Apples文档后,我仍然卡住了。任何帮助都会很棒,谢谢。

2 个答案:

答案 0 :(得分:2)

您有几个问题,首先,正如错误消息所示,您需要在致电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")
    }
}

答案 1 :(得分:0)

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

这就是为什么当你评论这一行时你会得到一个编译错误。

self.velocityVector = normalizeVector(velocityVector)