如何:使用init继承SKSpriteNode的类,可以调用init(color:,size :)

时间:2014-11-14 21:23:36

标签: swift sprite-kit

我使用形状对游戏进行原型设计,而spritekit在swift之前很棒。

现在,当我尝试扩展SKSpriteNode并添加我的init函数时,我无法调用super.init(颜色,大小)。

我无法调用创建形状纹理的代码。

我需要知道如何调用init函数或如何创建形状纹理,所以我可以覆盖指定的init,然后使用我的形状纹理调用它。

编辑: 这是我正在做的确切代码,我在另一个SKSprite节点扩展类中做了几乎完全相同的事情:

class TetrisCell : SKSpriteNode
{
    let length = 10;
    convenience init(color:UIColor) {
        var size = CGSize(width: length, height: length);

        //Not allowed to call a super's convenience init, must call non-convenience init
        super.init(color: color, size: size);
    }
}

我理解为什么它不会让我,所以我正在寻找另一种方式。目前,TetrisCell没有纹理。为了方便起见,我想简单地使用形状。

据我所知,我必须调用super.init(texture:,color:,size :)才能初始化我的SKSpriteNode。如果没有办法做上面的代码,那么我想知道他们将SKTexture设置为什么,所以我可以模仿它。像super.init(texture:SKTexture.blankTexture)之类的东西。无论它们是什么,因为纹理是由color:属性操纵的,而我的1x1像素似乎不受颜色:属性的影响。

3 个答案:

答案 0 :(得分:13)

TL; DR: texture参数的类型为SKTexture!。由于它被定义为隐式解包的可选项,因此您只需传递nil


首先,您不能只从super(texture:, color, size:)拨打convenience init,实际上您必须在init上调用self方法。因此,您必须添加override init(texture: SKTexture!, color: SKColor!, size: CGSize)(然后您可以从中调用super)。

其次,您只需将nil作为texture参数传递; SpriteKit会适当地处理它。

第三个(并且只是因为我必须进行更改才能编译),所以在创建length变量时不能使用size属性,因为类实例没有已经初始化了。相反,我建议将length声明为var并将其作为参数传递给convenience init

把所有这些放在一起,你得到这样的东西:

class TetrisCell : SKSpriteNode
{
    var length: CGFloat!

    override init(texture: SKTexture!, color: SKColor!, size: CGSize) {
        self.length = 10 // Some sort of sensible default
        super.init(texture: texture, color: color, size: size)
    }

    convenience init(color: SKColor, length: CGFloat = 10) {
        var size = CGSize(width: length, height: length);
        self.init(texture:nil, color: color, size: size)
        self.length = length
    }

    required init?(coder aDecoder: NSCoder) {
        // Decoding length here would be nice...
        super.init(coder: aDecoder)
    }
}

答案 1 :(得分:4)

解决此问题的一种方法是创建一个新的init方法并设置颜色和大小属性:

class Sprite: SKSpriteNode {

    init(color:SKColor,size:CGSize) {
        super.init()
        self.size=size
        self.colorBlendFactor=1
        self.color=color
    }

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

}

答案 2 :(得分:3)

在没有看到您的代码或错误的情况下,我的猜测是抱怨您没有包含所需的初始化程序或其他内容..这可能会解决您的问题:

override init(texture: SKTexture!, color: UIColor!, size: CGSize) {
    super.init(texture: texture, color: color, size: size)
    // Do custom stuff here
}

// Swift requires this initializer to exist if you're adding any other custom ones
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}