我可以完全在代码中制作精灵,但是我无法弄清楚如何在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的新手,非常感谢你的建议!
答案 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
做的是允许变量在需要时加载,而不是在初始化时加载。
为什么要使用此方法而不是将其作为局部变量进行优化。每次搜索场景都很费时,只进行一次搜索显然不是。