SKEmitterNode的子类不调用init或deist

时间:2015-02-25 14:05:01

标签: swift sprite-kit

我可以初始化这个类,并查看我的粒子效果,但是子类不会调用init()或deinit。为什么呢?

class Particles: SKEmitterNode {

    var test: Int?

    override init() {
        test = 1
        super.init()
        println("created particle emitter")
    }

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

    deinit {

        println("destroyed particle emitter")
    }
}

这是从GameScene()

调用的

让particle = Particles(fileNamed:“test”)

我试过这个:

var particle:粒子?

viewDidLoad中:

particle = Particles(fileNamed:“test”)

1 个答案:

答案 0 :(得分:3)

子类只能调用超类指定的初始化,因此无法调用super.init(fileNamed:)。解决方法不是创建一个初始化器,而是创建一个类方法并在那里执行设置代码。 我复制了apple提供的代码来解压缩sks场景并将其更改为与您的发射器一起使用。该方法查找粒子文件(如果存在)并将其取消归档为粒子对象:

class Particles: SKEmitterNode {
    var test: Int?

    class func fromFile(file : String) -> Particles? {
        if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
            var data = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
            var archiver = NSKeyedUnarchiver(forReadingWithData: data)

            archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKEmitterNode")
            let p = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as Particles
            archiver.finishDecoding()

            //Perform any setup here
            p.test=11

            return p
        }
        return nil
    }
}

并像这样使用它:

let p=Particles.fromFile("MyParticle")!
p.test=0
p.particleSpeed=10
addChild(p)