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

我使用形状的原型游戏,和spritekit是惊人的之前迅速.

现在,当我尝试扩展一个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(纹理:SKTexture.blankTexture)等等.无论他们放置的纹理由颜色:属性操纵,而我的1×1像素似乎不受颜色:属性的影响.

TL; DR:纹理参数是SKTexture!的类型.因为它被定义为一个隐式解包的可选项,你可以通过零.

首先,你不能从你的方便的init中调用super(texture :,color,size :),你实际上必须调用一个init方法.所以,你必须添加覆盖初始化(纹理:SKTexture!,颜色:SKColor !,size:CGSize)(然后你可以调用super).

第二,你可以通过nil作为纹理参数; SpriteKit将适当处理.

第三个(只有相关因为我必须进行更改才能编译),因为类实例尚未初始化,所以在创建大小变量时不能使用length属性.相反,我建议将长度声明为一个var,并将其作为参数传递给您的方便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,size: size)
        self.length = length
    }

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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...