继承SKShapeNode

时间:2017-03-20 17:47:32

标签: swift skshapenode

为什么可以像这样实例化SKShapeNode

let circle = SKShapeNode(circleOfRadius: 10)

但是当我想创建一个继承SKShapeNode形式的类时,我不能做这样的事情:

public class Player:SKShapeNode{

public var playerName : String
private var inventory: [enumObject]

init(nameOfPlayer:String, position:CGPoint, radious: CGFloat) {

super.init(circleOfRadius: radious)
self.position = position
self.fillColor = SKColor.white

playerName = nameOfPlayer

inventory = [enumObject]()
}

}

它说这个init不是SKShapeNode的设计init,我搜索了它但却找不到创建这个该死的圈子的正确方法。

1 个答案:

答案 0 :(得分:2)

SKShapeNode.init(circleOfRadius:)SKShapeNode上的便捷初始化程序,因此您无法从Swift初始化程序中调用它。 Swift比Objective C更严格地强制执行指定的初始化模式。

不幸的是,SKShapeNode的指定初始化程序似乎只是init,因此您需要执行以下操作:

public class Player: SKShapeNode {
    public var playerName : String
    private var inventory: [enumObject]

    init(nameOfPlayer:String, position:CGPoint, radius: CGFloat) {
        playerName = nameOfPlayer
        inventory = [enumObject]()

        super.init()

        self.path = CGPath(ellipseIn: CGRect(origin: .zero, size: CGSize(width: radius, height: radius)), transform: nil)

        self.position = position
        self.fillColor = SKColor.white
    }

    // init?(coder:) is the other designated initializer that we have to support
    public required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

上面的代码适用于子类化SKShapeNode,但考虑到Apple提供的API并考虑将来可能需要更改的代码,创建SKNode子类可能更有意义。包含一个或多个SKShapeNode个。在此设置中,如果您想将播放器表示为不仅仅是一个简单的圆圈,您只需将其他节点添加到播放器节点即可。