使用.sks文件中的自定义初始化程序进行子类化

时间:2016-06-04 05:46:40

标签: sprite-kit initialization

我有一个自定义类,我在.sks文件中创建节点,我希望使用自定义初始化程序成为该自定义类的实例。

自定义类:

Class Enemy: SKSPritenode {
    init(name: String, image: String, health: Int) {
      // stuff here
    }
}

SKScene:

 // error at runtime:
var enemy1 = childNodeWithName("Enemy1") as! Enemy  

 // error: 
var enemy1 = childNodeWithName("Enemy1") as! Enemy(name: "enemy1, image: "enemy1", health: 100) 

有没有办法将自定义初始化程序与.sks文件一起使用?

1 个答案:

答案 0 :(得分:4)

将自定义类与节点关联

如果要将创建的节点与SKS文件关联到自定义类,则需要:

  1. 将空节点添加到SKS文件
  2. 选择节点
  3. 在Xcode
  4. 中打开自定义类检查器
  5. 在“自定义类”字段中键入类的名称
  6. 在“模块”字段中键入项目名称
  7. enter image description here

    使用正确的初始化程序

    当SpriteKit加载SKS文件并开始构建对象以填充场景时,它不会调用您自定义初始化程序但是这个

    required init?(coder aDecoder: NSCoder)
    

    所以你的敌人类应该像这样定义

    class Enemy: SKSpriteNode {
        let health: Int
    
        required init?(coder aDecoder: NSCoder) {
            self.health = 10
    
            let texture = SKTexture(imageNamed: "Spaceship")
            super.init(texture: texture, color: .clearColor(), size: texture.size())
        }
    }
    

    测试

    您现在可以测试您的场景中有一个真正的Enemy对象,将此方法定义到您的GameScene中

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        guard let enemy = (children.filter { $0 is Enemy }).first else { fatalError("No Enemy found") }
        print(enemy)
    }
    

    使用自定义初始化程序

    现在无法将参数从SKS文件传递到自定义初始化程序。

    然而,这种技术可用于CocosBuilder,这是一个可用于Cocos2d的旧游戏级别编辑器,因此我相信将来某个时候我们将能够将参数从SKS文件传递到我们的自定义类。

    也许这将在2016年WWDC期间的几天内通过下一版本的SpriteKit宣布。