如何在代码中引用gamescene.sks中添加的sprite,就像我在IBOutlet中一样?

时间:2017-06-14 19:57:02

标签: ios swift swift3 sprite-kit

我可以完全在代码中制作精灵,但是我无法弄清楚如何在gamescene.sks中放置一个精灵,然后在gamescene.swift中引用它来对它进行更改,就像我对IBOutlet一样。

我能够在gamescene.sks中使用名为“beam”的精灵来做到这一点:

 let beam = childNode(withName: "beam") as! SKSpriteNode

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first
    let touchLocation = touch!.location(in: self)
    let beam = childNode(withName: "beam") as! SKSpriteNode

    if let body = physicsWorld.body(at: touchLocation) {
        if body.node!.name == "leftTap" {

                beam.rotateBy(CGFloat(10))
                print("Began touch on Left")

        }else if body.node!.name == "rightTap"{

                beam.rotateBy(CGFloat(-10))
                print("Began touch on right")

        }
    }
}

}

它有效,我最初将精灵放在gamescene.sks中并在此处引用它。但是当我放置这一行时:

let beam = childNode(withName: "beam") as! SKSpriteNode

在gamescene.swift中的其他任何地方,它都会抛出而不是错误,我需要将其更改为:

let beam = SKSpriteNode(withName: "beam") as! SKSpriteNode

然后当我更改它时,我收到一条错误消息:“参数标签'(withName :)'与任何可用的重载都不匹配”

我是sprite kit的新手,非常感谢你的建议!

2 个答案:

答案 0 :(得分:2)

为什么不尝试将sprite放在局部变量中并在代码中引用该局部变量

private var someObject = SKSpriteNode()

override func didMove(to view: SKView) {

    if let someObjectNode = self.childNode(withName: "//someObject") as? SKSpriteNode {
        someObject = someObjectNode
        someObject.zPosition = 50
    }
}

然后在触摸开始时只是引用someObject而不是每次都在gameScene中查找对象。

答案 1 :(得分:2)

你需要将它作为一个惰性变量,self尚不存在,这就是你的编译器抛出错误的原因

lazy var beam = self.childNode(withName: "beam") as! SKSpriteNode

如果这不起作用,请尝试:

lazy var beam = { return self.childNode(withName: "beam") as! SKSpriteNode}()

lazy做的是允许变量在需要时加载,而不是在初始化时加载。

为什么要使用此方法而不是将其作为局部变量进行优化。每次搜索场景都很费时,只进行一次搜索显然不是。