我有一个自定义类,我在.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文件一起使用?
答案 0 :(得分:4)
如果要将创建的节点与SKS文件关联到自定义类,则需要:
当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宣布。