我想创建一个比 SpriteNode 的 touchesBegan 级别更高的 SKShapeNode,所以当我想从这个 Sprite 的 touchesBegun 事件将 SKShapeNode 添加到屏幕时,形状已经存在,我只需将它添加到来自 touchesBegan 覆盖的屏幕。
TL;DR,在我的 SKSpriteNode 中,我正在尝试预构建 SKShapeNode,它将在 Sprite 被触摸时用作动画环。
我想用变量/常量创建 SKShapeNode,这样我就可以轻松地编辑它的值...
因此在子类的根目录中我有颜色、大小和线宽的变量,准备用于创建 SKShapeNode...
class Balls: SKSpriteNode {
var ringSize: CGFloat = 64
var ringColor: SKColor = SKColor.white
var ringWidth: CGFloat = 16
....
再往下,但仍然在类的根部,我创建了我的戒指:
let ring = SKShapeNode(circleOfRadius: ringSize)
我立刻受到了亲切而神秘的欢迎:
Can not use instance member 'ringSize' within property initializer, property initializers run before 'self' is available.
很好。好的。我得到它。您想认为应该在将值分配给 self 之前完成对类的功能调用以创建属性。无论是这里还是那里,我认为我变得狡猾并且可以通过将所有内容包装在一个函数中来解决这个问题:
class Balls: SKSpriteNode {
var ringSize: CGFloat = 64
var ringColor: SKColor = SKColor.white
var ringWidth: CGFloat = 16
var myRing = SKShapeNode()
func createRing() -> SKShapeNode{
let ring = SKShapeNode(circleOfRadius: ringSize)
ring.strokeColor = ringColor
ring.lineWidth = ringWidth
return ring
}
这不会产生任何错误,我兴奋起来。
所以我添加了另一行来创建实际的环: ....
myRing = createRing()
又死了:
! Expected declaration
我完全不知道这意味着什么,开始随机尝试奇怪的事情。
其中一个正在进入我已经凌乱的便利初始化程序并在其中添加 myRing = createRing()
...这可行!
这是如何工作的以及为什么工作,这是绕过初始化耗尽的最佳/正确/正确方法吗?
::编辑::更新::完整代码上下文::
这是包含我奇怪且被误解的初始化程序的完整类(class)。
import SpriteKit
class Circle: SKSpriteNode {
var ringSize: CGFloat = 96
var ringColor: SKColor = SKColor.white
var ringWidth: CGFloat = 8
var myRing = SKShapeNode()
override init(texture: SKTexture?, color: UIColor, size: CGSize) {
super.init(texture: texture, color: color, size: size)
}
convenience init() {
self.init(color: SKColor.clear, size: CGSize(width: 100, height: 100))
myRing = createRing()
addChild(myRing)
print("I'm on the screen")
explodeGroup = create_explosionActionGroup()
}
convenience init(color: UIColor, size: CGSize, position: CGPoint) {
self.init(color: color, size: size)
self.position = position
myRing = createRing()
explodeGroup = create_explosionActionGroup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func createRing() -> SKShapeNode{
let ring = SKShapeNode(circleOfRadius: ringSize)
ring.strokeColor = ringColor
ring.lineWidth = ringWidth
return ring
}
最佳答案
您的 createRing() 方法在 Ball 类中,因此您需要先创建一个 Ball 实例。
简单方法 - 您可以将实例的创建更改为
let ball = Balls()
let myRing = ball.createRing()
关于swift - 在子类 : Swift and SpriteKit 中循环 Initialization 的 drain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40305065/