2017-01-31 3 views
0

Я написал пользовательский подкласс SKLabelNode, который должен применяться зачаточном «тень» на мой этикетке:Проблема с использованием подкласс SKLabelNode

class ShadowLabel: SKLabelNode { 
    var shadowNode: SKLabelNode 

    init(fontNamed font: String = "Foo", text: String, size: CGFloat, zPosition zPos: CGFloat, shadowColor: SKColor = SKColor.black, shadowOffset: CGPoint = CGPoint(x: 0, y: -4), shadowAlpha: CGFloat = 0.5) { 
     shadowNode = SKLabelNode(fontNamed: font) 

     super.init(fontNamed: font) 
     self.text = text 
     self.fontSize = size 
     self.zPosition = zPos 

     shadowNode.text = self.text 
     shadowNode.zPosition = self.zPosition - 1 
     shadowNode.fontColor = shadowColor 
     shadowNode.position = shadowOffset 
     shadowNode.fontSize = self.fontSize 
     shadowNode.alpha = 0.5 

     self.addChild(shadowNode) 
    } 

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

    func setNewText(_ newText: String) { 
     self.text = newText 
     self.shadowNode.text = newText 
    } 
} 

Моя проблема в том, что во время выполнения, консоль дает мне следующее сообщение об ошибке:

use of unimplemented initializer 'init()' for class 'MyProject.ShadowLabel'

Я использую пользовательский подкласс в классе GameScene следующим образом:

class GameScene: SKScene { 
    var scoreLabel = (ShadowLabel(fontNamed: "Foo", text: "", size: 100, zPosition: 150, shadowColor: SKColor.black, shadowOffset: CGPoint(x: 0, y: -4), shadowAlpha: 0.5)) 

    override func didMove(to view: SKView) { 
     scoreLabel.text = "\(gameScore.totalScore)" // a struct which counts the game score 
     scoreLabel.color = SKColor.white 
     scoreLabel.fontSize = 100 
     scoreLabel.zPosition = 150 
     scoreLabel.position = CGPoint(x: Scene.width/2, y: Scene.heigth - 40 - scoreLabel.frame.height) 
     addChild(scoreLabel) 
    } 
} 

Я не знаю, почему вызов с параметром-пустой init() выполняется в первую очередь.

Любое предложение?

ответ

0

Вам все равно необходимо использовать метод инициализации без параметров.

override init() { 
    shadowNode = SKLabelNode() 
    super.init() 
} 

Вам необходимо установить для shadowNode значение, равное чему-то, что, вероятно, сломает другие вещи, которые у вас есть.

Я стараюсь хранить свои узлы только в дочернем массиве узла, поэтому мне не нужно иметь дело с такими вещами, но не уверен, что это лучшая практика.

+0

Здравствуйте, благодарю вас за ответ. Как вы сказали, переопределив init(), я теряю все содержимое, которое я создал в своем пользовательском инициализаторе, что делает мой класс неубедительным. – gionti

+0

Я полагаю, вы могли бы сделать shadowNode nillable, и тогда вам не пришлось бы возиться с ним в init? Я не уверен, что это считается проблемой с моим решением или проблемой с вашим первоначальным внедрением, поскольку я сказал, что лично не буду обращаться к узлам. – ThrowingSpoon

+0

Я не думал о том, чтобы рассматривать shadowNode как необязательный, спасибо за идею! Во всяком случае, теперь я нашел неэстетичное обходное решение для решения проблемы, которое я опубликую через несколько минут. – gionti

0

Я нашел неэстетичное обходное решение для решения моей проблемы (требуется дополнительный overlayNode, потому что, рассматривая shadowNode как дочерний узел основного узла метки, он накладывает основной узел независимо от того, какой zPosition вы выбираете, поэтому overlayNode «восстанавливает» эффект тени):

class ShadowLabel: SKLabelNode { 
    var shadowNode: SKLabelNode = SKLabelNode(fontNamed: "Foo") 
    var overlayNode: SKLabelNode = SKLabelNode(fontNamed: "Foo") 

    init(fontNamed font: String = "Foo", text: String, size: CGFloat, color: SKColor, zPosition zPos: CGFloat, shadowColor: SKColor = SKColor.black, shadowOffset: CGPoint = CGPoint(x: 0, y: -4), shadowAlpha: CGFloat = 0.5) { 
     shadowNode = SKLabelNode(fontNamed: font) 
     overlayNode = SKLabelNode(fontNamed: font) 

     super.init(fontNamed: font) 
     self.text = text 
     self.fontSize = size 
     self.zPosition = zPos 
     self.fontColor = color 

     shadowNode.text = self.text 
     shadowNode.zPosition = self.zPosition - 1 
     shadowNode.fontColor = shadowColor 
     shadowNode.position = shadowOffset 
     shadowNode.fontSize = self.fontSize 
     shadowNode.alpha = 0.5 

     self.addChild(shadowNode) 

     overlayNode.text = self.text 
     overlayNode.zPosition = self.zPosition + 1 
     overlayNode.fontColor = self.fontColor 
     overlayNode.position = self.position 
     overlayNode.fontSize = self.fontSize 

     self.addChild(overlayNode) 
    } 

    override init() { 
     super.init() 
    } 

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

    func setNewText(_ newText: String) { 
     self.text = newText 
     self.shadowNode.text = newText 
     self.overlayNode.text = newText 
    } 
} 
Смежные вопросы