swift - 在子类 : Swift and SpriteKit 中循环 Initialization 的 drain

标签 swift sprite-kit initialization subclass skspritenode

我想创建一个比 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/

相关文章:

ios - 在另一个 tableViewController 的 subview 中添加一个新的 TableView

ios - 过滤/搜索嵌套结构数组

swift - 使用 Swift 子类化 SKLabelNode 错误

ios - SpriteKit - iOS 7 - iAd 集成错误

ios - SpriteKit : How to blur the movement of a node like a shooting star

swift - 如何在 Xcode 7 上使用 swift 代码使按钮不可见?

ios - 如何在 swift 中使文本字段在 tableview 中起作用

java - 有没有办法在 Java 中使用数组初始化变量列表?

C - 具有未正确初始化的字符串成员的静态结构数组?

json - 使用 SwiftyJSON 的 Swift 可失败初始化器